Javaのヒント120:自己解凍型JARを実行する

長年にわたり、Phil Katzのアーカイブ作成であるzipは、最も人気のあるファイルアーカイブ形式の1つです。Sunは、Java Archive(JAR)の基礎としてzip形式を採用しています。Sunは、Javaクラスをアーカイブファイルにパックできるように、さまざまな規則でzip形式の使用を拡張しました。JARマニフェストファイルを追加すると、Javaランタイムは、jarファイルに含まれているJavaアプリケーションのメインクラスを簡単に見つけて直接実行できます。

一部のzipユーティリティツールは、MSWindowsなどのさまざまなプラットフォーム用の自己解凍型アーカイブを作成できます。ユーティリティツールは、通常のzipアーカイブとエクストラクタプログラムを組み合わせて、新しい実行可能(exe)ファイルを生成します。exeファイルの受信者は、元のzipアーカイブの内容を抽出するためにそれを実行する必要があるだけです。実行可能ファイルは、エクストラクタプログラムを実行して、アーカイブファイルをユーザー指定の出力ディレクトリに抽出します。

ベースのzipまたはjarファイルを任意のJavaプラットフォームで実行可能なjarファイルに変換できます。自己解凍型zipはプラットフォーム固有の実行可能ファイルしか作成できませんが、自己解凍型jarファイルは、Javaをサポートする任意のプラットフォームに配布して実行できます。

自己解凍型jarファイルの作成は簡単です。必要なのは、特別なJARマニフェストファイル、Javaベースの抽出プログラム、ベースコンテンツファイルを含むzipまたはjarファイル、およびJavaSDKのjarユーティリティアプリケーションだけです。

マニフェストファイル

実行可能なJARを作成するには、最初MANIFEST.MFMETA-INFディレクトリで呼び出されるマニフェストファイルが必要です。マニフェストファイルには、いくつかの可能なエントリが含まれている場合があります。ただし、ここでの目的のために、Javaベースのエクストラクタプログラムのmain()メソッドを含むJavaクラスの名前を指定する必要があります。

メインクラス:ZipSelfExtractor 

jarmanifestこのヒントのサンプルコードに名前を付けたマニフェストファイルを追加しました。マニフェストファイルの詳細については、Jarファイルの仕様を参照してください。

抽出器

さまざまなアプローチを使用して、抽出プログラムを作成できます。ここで紹介するアプローチは単純で簡単です。最初に、抽出プログラムは自己解凍型jarファイルの名前を把握します。その名前が手元にある場合、エクストラクタは標準の組み込みJava zip / jarライブラリを利用してアーカイブからコンテンツファイルを抽出します。の完全なソースコードはZipSelfExtractorで見つけることができますZipSelfExtractor.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( "!/"); 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クラスを使用して、ユーザーがファイルを抽出する宛先ディレクトリを指定できるようにします。AProgressMonitorは、抽出プロセスの進行状況を示しています。ファイルが既存のファイルを上書きする可能性がある場合、ユーザーは既存のファイルを上書きするかどうかを尋ねられます。結論として、標準のダイアログボックスに抽出統計が表示されます。

最後に、エクストラクタプログラムは、jarファイルを自己解凍するファイル(マニフェストファイルとエクストラクタの.classファイル)を抽出しないことを確認します。プログラムは、元のJARコンテンツを抽出するだけです。これらの2つのファイルは、自己解凍型jarファイルのアーティファクトであり、元のベースコンテンツファイルの一部ではありません。

jarファイルのパッキング

マニフェストファイルと抽出プログラムができたので、自己解凍型jarファイルを作成できます。JDKのjarユーティリティを手動で使用して、自己解凍型のjarファイルを作成できます。たとえば、というzipファイルがあるとmyzip.zipすると、次の手順を実行して、そこから自己解凍ファイルを作成できます。

  1. cd を含むディレクトリへ myzip.zip
  2. ダウンロード zipper.jar
  3. ファイルを現在のディレクトリに抽出します。自己解凍型のJARにしました。
    java -jar zipper.jar 
  4. zipper.classファイルをにコピーしますZipSelfExtractor.class
  5. 名前myzip.zipを変更myzip.jar
  6. およびファイルで更新myzip.jarします。jarmanifestZipSelfExtractor.class
    jar uvfm myzip.jar jarmanifest ZipSelfExtractor.class 

現在、myzip.jarJavaランタイム環境(JRE)1.2以降を含むすべてのプラットフォームで自己解凍型です。自己解凍型jarファイルを実行するには、次のコマンドを実行します。

java -jar myzip.jar 

一部のプラットフォームでは、myzip.jarファイルアイコンをクリックするだけでjarファイルを実行できるようにバインディングがすでに設定されている場合があります。これにより、同等のコマンドラインが実行されます。

読者のための演習

ZipSelfExtractマニフェストファイルを含む既存のjarファイルから自己解凍型JARを作成すると、currentはうまく統合されません。マニフェストファイルを含む既存のjarファイルを処理できるように、自己解凍型ファイルと作成手順にインテリジェンスを追加します。

JARから手を離します

自己解凍型のjarファイルは、クロスプラットフォームのファイル配布に適したメカニズムです。自己解凍型JARは簡単に作成でき、JRE 1.2以降のインストールの最小限のユーザー要件は、クロスプラットフォームサポートを取得するための合理的なトレードオフです。

自己解凍型のjarファイルを手動で作成する代わりに、ZipAnywhereを確認してください。ZipAnywhereは、フル機能であるzip/のjar100%純粋なJavaで書かれたユーティリティツール。これは、WinZipを使用した無料のGUIベースのツールであり、ボタンをクリックするだけで自己解凍型のjarファイルを作成できます。

Zunhe Steve Jin博士は、Rational Softwareのスタッフソフトウェアエンジニアであり、ZipAnywhereの作成者です。John D. Mitchellは、JavaWorld Tips'NTricksコラムの寄稿編集者です。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

このストーリー「JavaTip120:自己解凍型JARの実行」は、もともとJavaWorldによって公開されました。