| Javaアーカイブ | |
|---|---|
![]() KDE JARファイルアイコン | |
| ファイル名拡張子 | .jar.jad |
| インターネットメディアの 種類 | |
| 統一型識別子 (UTI) | com.sun.java-archive |
| 魔法の数字 | 50 4b 03 04ASCII:PK\x03\x04 |
| 開発元 | ネットスケープ、サン・マイクロシステムズ、オラクル社 |
| フォーマットの種類 | ファイルアーカイブ、データ圧縮 |
| 拡張 | ジップ |
JAR (Javaアーカイブ)ファイルは、多数のJavaクラスファイルと関連するメタデータおよびリソース(テキスト、画像など)を1つのファイルにまとめて配布するために一般的に使用されるパッケージファイル形式です。 [ 4 ]
JAR ファイルは、Java 固有のマニフェスト ファイルを含むアーカイブ ファイルです。ZIPフォーマットに基づいて構築され、通常はファイル拡張子を持ちます。[ 5 ].jar
JARファイルを使用すると、Javaランタイムはアプリケーション全体(クラスとその関連リソースを含む)を単一のリクエストで効率的にデプロイできます。JARファイルの要素は圧縮できるため、ダウンロード時間を短縮できます。
JAR ファイルには、マニフェスト ファイルが含まれている場合がありますMETA-INF/MANIFEST.MF。マニフェスト ファイルには、JAR ファイルの使用方法が記述されています。たとえば、Classpathエントリを使用して、JAR ファイルと一緒にロードする他の JAR ファイルを指定できます。
ファイルの内容は、ZIP形式をサポートする任意のアーカイブ解凍ソフトウェア、または jarJava開発キットに付属のコマンドラインユーティリティを使用して抽出できます。
開発者は JAR ファイルにデジタル署名できます。この場合、署名情報は埋め込みマニフェスト ファイルの一部となります。JAR ファイル自体は署名されませんが、アーカイブ内のすべてのファイルがチェックサムとともにリストされ、これらのチェックサムが署名されます。複数のエンティティが JAR ファイルに署名することができ、署名のたびに JAR ファイル自体が変更されますが、署名されたファイル自体は有効です。Java ランタイムが署名済みの JAR ファイルをロードする際、署名を検証し、署名に一致しないクラスのロードを拒否できます。また、「シール」パッケージもサポートしており、クラスローダーは、同じエンティティによって署名された Java クラスのみが同じパッケージにロードされることを許可します。これにより、悪意のあるコードが既存のパッケージに挿入され、パッケージ スコープのクラスやデータにアクセスされることを防ぎます。
JARファイルの内容は、リバースエンジニアリングをより困難にするために難読化されている場合があります。
実行可能なJavaプログラムは、プログラムが使用するライブラリとともにJARファイルにパッケージ化できます。実行可能なJARファイルには、エントリポイントクラスとMain-Class: myPrograms.MyClass明示的なクラスパスを指定するマニフェストが含まれています(-cp引数は無視されます)。一部のオペレーティングシステムでは、クリックするだけで直接実行できます。一般的な呼び出し方法は、java -jar foo.jarコマンドラインからの呼び出しです。
ネイティブランチャーは、ほとんどのプラットフォームで作成できます。例えば、Windows EXEファイルを好む Microsoft Windows ユーザーは、JSmooth、Launch4J、WinRun4J、 Nullsoft Scriptable Install Systemなどのツールを使用して、単一の JAR ファイルを実行可能ファイルにラップすることができます。
マニフェストファイルは、JAR ファイル内に含まれるメタデータファイルです。 [ 6 ] [ 7 ]拡張子とパッケージ関連データを定義します。セクションごとに整理された名前と値のペアが含まれています。JAR ファイルが実行可能ファイルとして使用されることを想定している場合、マニフェストファイルはアプリケーションのメインクラスを指定します。マニフェストファイルの名前は ですMANIFEST.MF。マニフェストディレクトリは、圧縮アーカイブの最初のエントリである必要があります。
マニフェストは正規の場所に表示されますMETA-INF/MANIFEST.MF。[ 8 ]アーカイブにはマニフェストファイルは1つしか存在できず、その場所に存在する必要があります。
Java Development Kitバージョン 1.0 で作成された JAR ファイル内のマニフェスト ファイルの内容は以下のとおりです。
マニフェストバージョン: 1.0
名前と値はコロンで区切られます。デフォルトのマニフェストは、マニフェスト仕様のバージョン1.0に準拠していることを示しています。
マニフェストには、アーカイブに同梱される他のファイルに関する情報を含めることができます。マニフェストの内容は、JARファイルの用途によって異なります。デフォルトのマニフェストファイルは、他のファイルについてどのような情報を記録すべきかについて何の前提も置かないため、その1行にはマニフェスト自体に関するデータのみが含まれます。エンコード形式はUTF-8にする必要があります。
アーカイブ目的のみで作成されたJARファイルは、このMANIFEST.MFファイルを使用しません。
JARファイルのほとんどの用途は、単純なアーカイブや圧縮にとどまらず、マニフェストファイルに特別な情報が必要となります。
マニフェストを使用すると、開発者はJARファイルにいくつかの便利な機能を定義できます。プロパティはキーと値のペアで指定します。
アプリケーションがJARファイルに含まれている場合、Java仮想マシンはアプリケーションのエントリポイントを知る必要があります。エントリポイントとは、public static void main(String[] args)メソッドを持つクラスのことです。この情報は、マニフェストのMain-Classヘッダーに記述されており、一般的な形式は以下のとおりです。
メインクラス: com.example.MyClassName
この例では、com.example.MyClassName.main()アプリケーション起動時に実行されます。
オプションとして、JARファイル内のパッケージをシールすることができます。これは、そのパッケージで定義されているすべてのクラスが同じJARファイルにアーカイブされることを意味します。パッケージをシールすることは、ソフトウェア内のクラス間のバージョンの一貫性を確保するため、またはセキュリティ対策として行われる場合があります。
パッケージを封印するには、名前のエントリが表示され、その後に「Sealed」ヘッダーが表示される必要があります。例:
名前:myCompany/myPackage/密封:trueName ヘッダーの値は、パッケージの相対パス名です。ファイル名と区別するために、末尾に '/' が付いていることに注意してください。Name ヘッダーの後に空白行を挟まずに続くヘッダーは、Name ヘッダーで指定されたファイルまたはパッケージに適用されます。上記の例では、ヘッダーが空白行を挟まずにヘッダーのSealed後に続くため、ヘッダーはパッケージ にのみ適用されます。Name: myCompany/myPackageSealedmyCompany/myPackage
シールされたパッケージの機能は、Java 9 で導入された Java プラットフォーム モジュール システムによって時代遅れになりました。Java プラットフォーム モジュール システムでは、モジュールはパッケージを分割できません。[ 9 ]
マニフェストヘッダーには、バージョン情報が格納されている箇所がいくつかあります。各パッケージには、1セットのヘッダーを割り当てることができます。バージョンヘッダーは、パッケージの「名前」ヘッダーの直下に表示されます。以下の例は、すべてのバージョンヘッダーを示しています。
名前: java/util/仕様タイトル: "Javaユーティリティクラス"仕様バージョン: "1.2"仕様ベンダー: "Sun Microsystems, Inc."。実装タイトル: "java.util"実装バージョン: "build57"実装ベンダー: "Sun Microsystems, Inc."JAR は、オプションでマルチリリース JAR としてマークできます。マルチリリース機能を使用すると、ライブラリ開発者は Java ランタイムのバージョンに応じて異なるコードをロードできます。[ 10 ]これにより、開発者は互換性を損なうことなく新機能を活用できます。
マニフェストに以下の宣言を追加することで、マルチリリースJARを有効にできます。
複数リリース:ありこのMANIFEST.MFファイルは、アプリケーションが実行できるようにロードする必要のあるすべてのクラスを指定するために使用できます。[ 11 ]
クラスパスのエントリは、システムパスの区切り文字ではなく、スペースで区切られることに注意してください。
クラスパス: . pkg1.jar path/to/pkg2.jarApache Antビルドツールには、 Unixファイルシステム拡張機能のサポートを含め、ZipおよびJARアーカイブの読み書きを行うための独自のパッケージが用意されています。org.apache.tools.zipパッケージはApache Software Foundationライセンスの下でリリースされており、Ant以外でも使用できるように設計されています。
JAR形式をベースにした関連ファイル形式がいくつかあります。
service.xmlファイルとそれに付随するJARファイルを提供します。