Java Tip 127 : JAR 실행 참조

애플리케이션의 전체 클래스 및 리소스 세트를 Java 아카이브 (JAR)로 쉽게 패키징 할 수 있습니다. 사실 그것은 jar 파일을 갖는 하나의 목표입니다. 또 다른 방법은 사용자가 아카이브에 저장된 애플리케이션을 쉽게 실행할 수 있도록하는 것입니다. 그러면 jar 파일이 원시 실행 파일과 함께 1 급이 될 수 있는데 아카이브로만 기능하는 Java 세계에서 2 급 시민이되는 이유는 무엇입니까?

jar 파일을 실행하려면 다음을 사용할 수 있습니다.

java

명령의

-jar

선택권. 예를 들어 다음과 같은 실행 가능한 jar 파일이 있다고 가정합니다.

myjar.jar

. 파일이 실행 가능하기 때문에 다음과 같이 실행할 수 있습니다.

java -jar myjar.jar

.

또는 JRE (Java Runtime Environment)가 Microsoft Windows와 같은 OS에 설치 될 때 jar 파일을 JVM과 연결하므로 두 번 클릭하여 응용 프로그램을 실행할 수 있습니다. 이러한 JAR은 실행 가능해야합니다.

질문은 : JAR을 실행 가능하게 만드는 방법입니다.

매니페스트 파일 및 Main-Class 항목

대부분의 JAR 내부에는

MANIFEST.MF

라는 디렉토리에 저장됩니다.

META-INF

. 그 파일 안에는

Main-Class

말한다

java -jar

실행할 클래스 명령.

문제는이 특수 항목을 매니페스트 파일에 올바르게 추가해야한다는 것입니다. 특정 위치에 있어야하고 특정 형식을 가져야합니다. 그러나 우리 중 일부는 구성 파일 편집을 좋아하지 않습니다.

API를 사용하세요.

Java 1.2부터라는 패키지 java.util.jar를 사용하여 jar 파일을 사용할 수 있습니다. (참고 : java.util.zip패키지 에 빌드됩니다 .) 특히 jar 패키지를 사용하면 Manifest클래스 를 통해 특수 매니페스트 파일을 쉽게 조작 할 수 있습니다 .

이 API를 사용하는 프로그램을 작성해 보겠습니다. 먼저이 프로그램은 다음 세 가지를 알아야합니다.

  1. 실행 가능하게 만들고 싶은 JAR
  2. 실행하고자하는 메인 클래스 (이 클래스는 JAR 내에 존재해야 함)
  3. 출력을위한 새 JAR의 이름. 단순히 파일을 덮어 쓰면 안되기 때문입니다.

프로그램 작성

위의 목록은 우리 프로그램의 주장을 구성합니다. 이 시점에서이 응용 프로그램에 적합한 이름을 선택하겠습니다. 어떻게 MakeJarRunnable들리나요?

main에 대한 인수 확인

우리의 주요 진입 점이 표준 main(String[])방법 이라고 가정합니다 . 먼저 여기에서 프로그램 인수를 확인해야합니다.

if (args.length! = 3) {System.out.println ( "사용법 : MakeJarRunnable"+ ""); System.exit (0); }

인수 목록은 다음 코드에서 중요하므로 해석 방법에주의하십시오. 논쟁 순서와 내용은 정해진 것이 아닙니다. 그러나 다른 코드를 변경하는 경우 적절하게 수정해야합니다.

JAR 및 해당 매니페스트 파일에 액세스

먼저 JAR 및 매니페스트 파일에 대해 알고있는 몇 가지 개체를 만들어야합니다.

// JarInputStream 객체를 생성하고 매니페스트를 가져옵니다. JarInputStream jarIn = new JarInputStream (new FileInputStream (args [0])); 매니페스트 매니페스트 = jarIn.getManifest (); if (manifest == null) {// 매니페스트가없는 경우 발생합니다. manifest = new Manifest (); }

Main-Class 속성 설정

Main-Class매니페스트 파일의 기본 속성 섹션에 항목을 넣습니다 . 매니페스트 객체에서이 속성 세트를 가져 오면 적절한 기본 클래스를 설정할 수 있습니다. 그러나 Main-Class원래 JAR에 속성이 이미 있으면 어떻게 됩니까? 이 프로그램은 단순히 경고를 인쇄하고 종료합니다. 프로그램이 기존 값 대신 새 값을 사용하도록 지시하는 명령 줄 인수를 추가 할 수 있습니다.

속성 a = manifest.getMainAttributes (); 문자열 oldMainClass = a.putValue ( "Main-Class", args [1]); // 이전 값이 있으면 사용자에게 알리고 종료 if (oldMainClass! = null) {System.out.println ( "Warning : old Main-Class value is :"+ oldMainClass); System.exit (1); }

새 JAR 출력

새 jar 파일을 만들어야하므로 JarOutputStream클래스 를 사용해야합니다 . 참고 : 입력에 사용하는 것과 동일한 파일을 출력에 사용하지 않도록해야합니다. 또는 프로그램은 두 jar 파일이 동일한 경우를 고려하고 원본을 덮어 쓰려는 경우 사용자에게 프롬프트해야합니다. 그러나 나는 이것을 독자를위한 연습 문제로 예약합니다. 코드로!

 System.out.println("Writing to " + args[2] + "..."); JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(args[2]), manifest); 

We must write every entry from the input JAR to the output JAR, so iterate over the entries:

 //Create a read buffer to transfer data from the input byte[] buf = new byte[4096]; //Iterate the entries JarEntry entry; while ((entry = jarIn.getNextJarEntry()) != null) { //Exclude the manifest file from the old JAR if ("META-INF/MANIFEST.MF".equals(entry.getName())) continue; //Write the entry to the output JAR jarOut.putNextEntry(entry); int read; while ((read = jarIn.read(buf)) != -1) { jarOut.write(buf, 0, read); } jarOut.closeEntry(); } //Flush and close all the streams jarOut.flush(); jarOut.close(); jarIn.close(); 

Complete program

Of course, we must place this code inside a main method, inside a class, and with a suitable set of import statements. The Resources section provides the complete program.

Usage example

Let's put this program to use with an example. Suppose you have an application whose main entry point is in a class called HelloRunnableWorld. (This is the full class name.) Also assume that you've created a JAR called myjar.jar, containing the entire application. Run MakeJarRunnable on this jar file like so:

 java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar 

Again, as mentioned earlier, notice how I order the argument list. If you forget the order, just run this program with no arguments and it will respond with a usage message.

Try to run the

java -jar

command on

myjar.jar

and then on

myjar_r.jar

. Note the difference! After you've done that, explore the manifest files (

META-INF/MANIFEST.MF

) in each JAR. (You can find both JARs in the

source code

.)

Here's a suggestion: Try to make the MakeJarRunnable program into a runnable JAR!

Run with it

Running a JAR by double-clicking it or using a simple command is always more convenient than having to include it in your classpath and running a specific main class. To help you do this, the JAR specification provides a Main-Class attribute for the JAR's manifest file. The program I present here lets you utilize Java's JAR API to easily manipulate this attribute and make your JARs runnable.

Shawn Silverman은 현재 캐나다 매니토바 대학의 전기 및 컴퓨터 공학과에서 대학원생입니다. 그는 1996 년 중반에 Java로 작업을 시작했으며 그 이후로 거의 독점적으로 사용하고 있습니다. 그의 현재 관심 분야에는 전기장 및 유체 시뮬레이션, 오류 수정 코드, 멋진 GUI (그래픽 사용자 인터페이스) 트릭 구현이 포함됩니다. Shawn은 또한 자신의 대학 컴퓨터 공학과에서 3 년차 소프트웨어 설계 과정을 가르칩니다.

이 주제에 대해 더 알아보기

  • 이 팁에 대한 소스 코드 및 JAR 다운로드

    //images.techhive.com/downloads/idge/imported/article/jvw/2002/05/makejarrunnable.zip

  • "Java Tip 120Execute Self-Extracting JARs,"Z. Steve Jin 및 John D. Mitchell ( JavaWorld, 2001 년 11 월)

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

  • JAR File Specification

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

  • jar—The Java Archive Tool

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

  • 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 the Core Java section of JavaWorld's Topical Index

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

  • 우리의 최상단에 'N 트릭 팁 에 가입하여 JavaWorld' 의 무료 주간 이메일 뉴스 레터

    //www.javaworld.com/subscribe

  • JavaWorldJava Beginner 토론 에서 클라이언트 측 Java의 기본 사항을 배웁니다 . 핵심 주제에는 Java 언어, Java Virtual Machine, API 및 개발 도구가 포함됩니다.

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

  • .net의 자매 간행물에서 다양한 IT 관련 기사를 찾을 수 있습니다.

이 이야기, "Java Tip 127 : See JAR run"은 원래 JavaWorld에 의해 출판되었습니다.