자바 팁 120 : 자동 압축 풀기 JAR 실행

수년 동안 Phil Katz의 아카이브 생성 인 zip은 가장 널리 사용되는 파일 아카이브 형식 중 하나였습니다. Sun은 JAR (Java Archive)의 기반으로 zip 형식을 채택했습니다. Sun은 Java 클래스를 아카이브 파일로 압축 할 수 있도록 다양한 규칙으로 zip 형식의 사용을 확장했습니다. JAR 매니페스트 파일을 추가 하면 Java 런타임이 jar 파일에 포함 된 Java 애플리케이션의 기본 클래스를 쉽게 찾고 직접 실행할 수 있습니다.

일부 zip유틸리티 도구는 MS Windows와 같은 다양한 플랫폼에 대해 자동 압축 해제 아카이브를 만들 수 있습니다 . 유틸리티 도구는 일반 zip 아카이브와 추출기 프로그램을 결합하여 새 실행 파일 (exe)을 생성합니다. exe 파일의 수신자는 원본 zip 아카이브의 내용을 추출하기 위해 실행하기 만하면됩니다. 실행 파일은 추출기 프로그램을 실행하여 아카이브 된 파일을 사용자 지정 출력 디렉토리로 추출합니다.

모든 Java 플랫폼에서 기본 zip 또는 jar 파일을 실행 가능한 jar 파일로 변환 할 수 있습니다. 자동 압축 해제 zip은 플랫폼 별 실행 파일 만 생성 할 수있는 반면 자동 압축 해제 jar 파일은 Java를 지원하는 모든 플랫폼에 배포 및 실행할 수 있습니다.

자동 압축 풀림 jar 파일을 만드는 것은 간단합니다. 특수 JAR 매니페스트 파일, Java 기반 추출 프로그램, 기본 콘텐츠 파일이 포함 된 zip 또는 jar 파일 및 Java SDK의 jar유틸리티 응용 프로그램 만 있으면 됩니다.

매니페스트 파일

실행 가능한 JAR을 만들려면 먼저 디렉토리 MANIFEST.MF에서 호출되는 매니페스트 파일이 필요합니다 META-INF. 매니페스트 파일에는 여러 가능한 항목이 포함될 수 있습니다. 그러나 여기서 목적을 위해 Java 기반 추출기 프로그램의 main()메소드 를 포함하는 Java 클래스의 이름을 지정하기 만하면됩니다 .

메인 클래스 : ZipSelfExtractor 

jarmanifest이 팁의 예제 코드에 명명 된 매니페스트 파일을 추가했습니다 . 매니페스트 파일에 대한 자세한 내용은 Jar 파일 사양을 참조하세요.

추출기

다양한 접근 방식을 사용하여 추출 프로그램을 만들 수 있습니다. 여기서 제시하는 접근 방식은 간단하고 간단합니다. 먼저, 추출 프로그램은 자동 압축 해제 jar 파일의 이름을 알아냅니다. 이 이름을 사용하여 추출기는 표준 내장 Java zip / jar 라이브러리를 사용하여 아카이브에서 콘텐츠 파일을 추출합니다. 에 대한 전체 소스 코드 ZipSelfExtractorZipSelfExtractor.java.

추출기 프로그램에서 jar 파일 이름을 가져 오는 것은 까다로울 수 있습니다. jar 파일의 이름이 명령 줄에 표시되지만 해당 이름은 클래스의 main()메서드에 전달되지 않습니다 . 따라서 추출기 프로그램에서 추출기를 가리키는 URL에서 정보를 추출하기 위해 다음 코드를 사용합니다.

private String getJarFileName () {myClassName = this.getClass (). getName () + ".class"; URL urlJar = this.getClass (). getClassLoader (). getSystemResource (myClassName); 문자열 urlStr = urlJar.toString (); int from = "jar : file :". length (); int to = urlStr.indexOf ( "! /"); return urlStr.substring (from, to); }

에 통지 getSystemResource()방법을 우리가 통과 myClassName대신 ZipSelfExtractor.class. 이를 통해 코드의 해당 부분을 변경하지 않고도 추출기 프로그램 이름을 변경할 수 있습니다. myClassName현재 클래스 이름을 조회하여 설정 합니다.

다음으로 jar 파일의 이름을 추출합니다. 먼저 현재 실행중인 클래스 (추출기 프로그램)를 포함하는 클래스 파일에 대한 URL을 요청합니다. URL이 있으면 jar 파일의 이름을자를 수 있습니다. 정의에 따라 JAR 추출기 프로그램의 URL은 기본 형식을 따릅니다.

  1. jar:, 실행 파일이 jar 파일 내에서 실행됨을 보여줍니다.
  2. 같은 JAR 파일의 URL, file:/C:/temp/test.jar에 의해, 다음 !문자
  3. 다음과 같은 JAR 내 파일의 내부 경로 이름 /ZipSelfExtractor.class

추출기 프로그램의 경우 URL은 다음과 같습니다.

jar : file : /home/johnm/test/zipper.jar! /ZipSelfExtractor.class 

이제 jar 파일의 이름을 얻었으므로 추출을 수행 할 수 있습니다. 추출 프로그램의 핵심은 내장 된 Java zip / jar 파일 조작 라이브러리에 의존하여 아카이브에 포함 된 컨텐츠 파일의 압축을 풉니 다. zip / jar 파일 조작 라이브러리에 대한 자세한 내용은 참고 자료를 참조하십시오.

사용하기 쉽도록 추출기는 그래픽 Java 애플리케이션입니다. 응용 프로그램은 JFileChooser클래스를 사용하여 사용자가 파일을 추출 할 대상 디렉터리를 지정할 수 있도록합니다. A ProgressMonitor는 추출 과정의 진행 상황을 보여줍니다. 파일이 이미 존재하는 파일을 덮어 쓸 수있는 경우 사용자에게 기존 파일을 덮어 쓸지 여부를 묻습니다. 마지막으로 표준 대화 상자에 추출 통계가 표시됩니다.

마지막으로 추출기 프로그램은 jar 파일을 자동 압축 해제하는 파일 (매니페스트 파일과 추출기의 .class파일)을 추출하지 않는지 확인 합니다. 프로그램은 원래 JAR 내용을 추출해야합니다. 이 두 파일은 자동 압축 풀기 jar 파일의 아티팩트이며 원본 기본 컨텐츠 파일의 일부가 아닙니다.

jar 파일 압축

이제 매니페스트 파일과 추출기 프로그램이 있으므로 자동 압축 해제 jar 파일을 빌드 할 수 있습니다. JDK의 jar유틸리티를 수동으로 사용하여 자동 압축 해제 jar 파일을 만들 수 있습니다. 예를 들어라는 zip 파일이 있다고 가정하면 myzip.zip다음 단계를 수행하여 자동 압축 풀기 파일을 만들 수 있습니다.

  1. cd 포함하는 디렉토리에 myzip.zip
  2. 다운로드 zipper.jar
  3. 현재 디렉토리에 파일을 추출하십시오. 자동 압축 풀기 JAR로 만들었습니다.
    java -jar 지퍼 .jar 
  4. zipper.class파일 복사ZipSelfExtractor.class
  5. 이름 바꾸기 myzip.zipmyzip.jar
  6. 업데이트 myzip.jarjarmanifestZipSelfExtractor.class파일 :
    jar uvfm myzip.jar jarmanifest ZipSelfExtractor.class 

이제 myzip.jarJRE (Java Runtime Environment) 1.2 이상을 포함하는 모든 플랫폼에서 자동 압축 해제됩니다. 자동 압축 풀림 jar 파일을 실행하려면 다음을 실행하십시오.

java -jar myzip.jar 

일부 플랫폼에는 myzip.jar파일 아이콘 을 클릭하기 만하면 jar 파일을 실행할 수 있도록 이미 바인딩이 설정되어있을 수 있습니다. 그러면 해당 명령 줄이 실행됩니다.

독자를위한 운동

ZipSelfExtract매니페스트 파일을 포함하는 기존 jar 파일에서 자동 압축 해제 JAR을 만들면 현재 는 잘 통합되지 않습니다. 자동 압축 풀기 및 생성 지침에 지능을 추가하여 매니페스트 파일이 포함 된 기존 jar 파일을 처리 할 수 ​​있습니다.

JAR에서 손을 떼십시오.

자동 압축 해제 jar 파일은 플랫폼 간 파일 배포를위한 좋은 메커니즘입니다. 자동 압축 풀림 JAR은 쉽게 만들 수 있으며 JRE 1.2 이상 설치의 최소 사용자 요구 사항은 크로스 플랫폼 지원을 얻기위한 합리적인 절충안입니다.

자동 압축 풀기 jar 파일을 수동으로 만드는 대신 ZipAnywhere를 확인하십시오. ZipAnywhere는 완전한 기능을 갖춘입니다 zip/ jar순수 자바 100 %로 작성 유틸리티 도구. 무료 GUI 기반 도구 인 WinZip이며 버튼 클릭만으로 자동 압축 해제 jar 파일을 만들 수 있습니다.

Zunhe Steve Jin 박사는 Rational Software의 직원 소프트웨어 엔지니어이자 ZipAnywhere의 저자입니다. John D. Mitchell은 JavaWorld Tips 'N Tricks 칼럼의 기고 편집자입니다. John은 또한 Technological Business Risk Management 컨설팅 업무 인 Non, Inc.의 창립자이자 수석 아키텍트입니다.

이 주제에 대해 더 알아보기

  • 이 팁에 대한 소스 파일 다운로드

    //www.javaworld.com/javaworld/javatips/javatip120/zipper.jar

  • "Java Tip 49How to Extract Java Resources from JAR and Zip Archives," John D. Mitchell and Arthur Choi (JavaWorld)

    //www.javaworld.com/javaworld/javatips/jw-javatip49.html

  • "Java Tip 70Create Objects from Jar Files!" John D. Mitchell (JavaWorld)

    //www.javaworld.com/javaworld/javatips/jw-javatip70.html

  • Jar File Specification

    //java.sun.com/j2se/1.3/docs/guide/jar/jar.html

  • JAR command line guide

    //java.sun.com/j2se/1.3/docs/tooldocs/win32/jar.html

  • ZipAnywhere, GUI-based self-extracting JAR creation tool

    //www.geocities.com/zipanywhere

  • View all previous Java Tips and submit your own

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Learn Java from the ground up in JavaWorld's Java 101 column

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

  • Java experts answer your toughest Java questions in JavaWorld's Java Q&A column

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Browse articles by topic in JavaWorld's Topical Index

    //www.javaworld.com/channel_content/jw-topical-index.shtml

  • Speak out in our Java Forum

    //forums.idg.net/[email protected]@.ee6b802

  • Sign up for JavaWorld's free weekly email newsletters

    //www.idg.net/jw-subscribe

  • You'll find a wealth of IT-related articles from our sister publications at .net

이 이야기, "Java Tip 120 : Execute self-extracting JARs"는 원래 JavaWorld에 의해 출판되었습니다.