Javaのヒント127:JARの実行を参照してください

アプリケーションのクラスとリソースのセット全体をJavaアーカイブ(JAR)に簡単にパッケージ化できます。実際、それはjarファイルを持つことの1つの目標です。もう1つは、アーカイブに保存されているアプリケーションをユーザーが簡単に実行できるようにすることです。では、なぜjarファイルはJavaユニバースの二級市民であり、アーカイブとしてのみ機能するのに、ネイティブの実行可能ファイルと並んで一流になることができるのでしょうか。

jarファイルを実行するには、

java

コマンドの

-jar

オプション。たとえば、次のような実行可能なjarファイルがあるとします。

myjar.jar

。ファイルは実行可能であるため、次のように実行できます。

java -jar myjar.jar

または、Javaランタイム環境(JRE)をMicrosoft WindowsなどのOSにインストールすると、jarファイルがJVMに関連付けられるため、それらをダブルクリックしてアプリケーションを実行できます。これらのJARは実行可能である必要があります。

問題は、JARを実行可能にするにはどうすればよいかということです。

マニフェストファイルとメインクラスエントリ

ほとんどのJAR内で、

MANIFEST.MF

と呼ばれるディレクトリに保存されます

META-INF

。そのファイル内に、

Main-Class

に伝えます

java -jar

実行するクラスをコマンドします。

問題は、この特別なエントリをマニフェストファイルに自分で適切に追加する必要があることです。特定の場所に配置し、特定の形式にする必要があります。ただし、構成ファイルの編集が嫌いな人もいます。

APIに任せてください

Java 1.2以降、というパッケージjava.util.jarでjarファイルを操作できるようになりました。(注:java.util.zipパッケージに基づいて構築されています。)具体的には、jarパッケージを使用すると、Manifestクラスを介してその特別なマニフェストファイルを簡単に操作できます。

このAPIを使ったプログラムを書いてみましょう。まず、このプログラムは3つのことを知っている必要があります。

  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 =維持.getMainAttributes(); String 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クラスを使用する必要があります。注:入力に使用するのと同じファイルを出力に使用しないようにする必要があります。あるいは、プログラムは2つの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(グラフィカルユーザーインターフェイス)トリックの実装が含まれます。ショーンはまた、彼の大学のコンピューター工学部で3年目のソフトウェア設計コースを教えています。

このトピックの詳細

  • このヒントのソースコードとJARをダウンロードする

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

  • 「JavaTip120Execute Self-Extracting JAR」、Z。SteveJinおよびJohnD。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

  • で、クライアント側のJavaの基本を学びJavaWorld」Javaの初心者の議論。コアトピックには、Java言語、Java仮想マシン、API、および開発ツールが含まれます

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

  • .netの姉妹出版物からIT関連の記事が豊富にあります。

このストーリー「JavaTip127:JAR runを参照」は、もともとJavaWorldによって公開されました。