![]() KDE JAR ファイルアイコン | |
| ファイル名拡張子 | .jar |
|---|---|
| インターネットメディアの種類 |
アプリケーション/Javaアーカイブ[1] [2] [3] |
| 統一型識別子 (UTI) | com.sun.java アーカイブ |
| 魔法の数字 | 50 4b 03 04ASCII:PK\x03\x04 |
| 開発者 | Netscape、サン・マイクロシステムズ、オラクル社 |
| フォーマットの種類 | ファイルアーカイブ、データ圧縮 |
| 延長 | ジップ |
JAR (「Javaアーカイブ」)ファイルは、多くのJavaクラスファイルと関連するメタデータおよびリソース(テキスト、画像など)を1つのファイルに集約して配布するために使用されるパッケージファイル 形式です。 [4]
JARファイルは、Java固有のマニフェストファイルを含むアーカイブファイルです。ZIP形式で構築され、通常はファイル拡張子が付けられます。[5].jar
デザイン
JAR ファイルを使用すると、Java ランタイムは、クラスや関連リソースを含むアプリケーション全体を 1 回のリクエストで 効率的にデプロイできます。JAR ファイル要素は圧縮できるため、ダウンロード時間が短縮されます。
JAR ファイルには、 にあるマニフェスト ファイルが含まれている場合がありますMETA-INF/MANIFEST.MF。マニフェスト ファイルのエントリは、JAR ファイルの使用方法を記述します。たとえば、Classpathエントリを使用して、JAR とともにロードする他の JAR ファイルを指定できます。
抽出
ファイルの内容は、ZIP 形式をサポートする任意のアーカイブ抽出ソフトウェア、または
jarJava 開発キットによって提供されるコマンド ライン ユーティリティを使用して抽出できます。
安全
開発者はJAR ファイルにデジタル署名することができます。その場合、署名情報は埋め込まれたマニフェスト ファイルの一部になります。JAR 自体は署名されませんが、アーカイブ内のすべてのファイルがそのチェックサムとともにリストされます。署名されるのはこれらのチェックサムです。複数のエンティティが JAR ファイルに署名し、署名ごとに JAR ファイル自体が変更されることがあります。ただし、署名されたファイル自体は有効なままです。Java ランタイムは署名された JAR ファイルをロードするときに、署名を検証し、署名と一致しないクラスのロードを拒否することができます。また、クラスローダーは、同じエンティティによって署名された Java クラスのみを同じパッケージにロードすることを許可します。これにより、悪意のあるコードが既存のパッケージに挿入され、パッケージ スコープのクラスやデータにアクセスされることを防止できます。
JAR ファイルの内容は、リバース エンジニアリングを困難に するために難読化される場合があります。
実行可能な JAR ファイル
実行可能な Java プログラムは、プログラムが使用するライブラリとともに JAR ファイルにパッケージ化できます。実行可能な JAR ファイルには、エントリ ポイントクラスと明示的なクラス パスを指定するマニフェストが含まれます (-cp 引数は無視されます)。一部のオペレーティング システムでは、クリックすると直接実行できます。通常は、コマンド ラインから
Main-Class: myPrograms.MyClass呼び出します。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 開発キットバージョン 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 ファイルにアーカイブされます。パッケージは、ソフトウェア内のクラス間のバージョンの一貫性を確保するため、またはセキュリティ対策としてシールされることがあります。
パッケージを封印するには、次のように、Name エントリの後に Sealed ヘッダーを表示する必要があります。
名前: myCompany/myPackage/シール: true
Name ヘッダーの値は、パッケージの相対パス名です。ファイル名と区別するために、'/' で終わることに注意してください。Name ヘッダーに続く、間に空白行がないヘッダーは、Name ヘッダーで指定されたファイルまたはパッケージに適用されます。上記の例では、ヘッダーは間に空白行がなくヘッダーSealedの後に出現するため、ヘッダーはパッケージにのみ適用されます。
Name: myCompany/myPackageSealedmyCompany/myPackage
シールされたパッケージの機能は、Java 9で導入されたJavaプラットフォームモジュールシステムによって時代遅れとなり、モジュールはパッケージを分割できなくなりました。[9]
パッケージのバージョン管理
いくつかのマニフェスト ヘッダーにはバージョン情報が保持されます。各パッケージには 1 セットのヘッダーを割り当てることができます。バージョン ヘッダーは、パッケージの Name ヘッダーのすぐ下に表示されます。次の例では、すべてのバージョン ヘッダーを示しています。
名前: java/util/仕様タイトル: "Java ユーティリティ クラス"仕様バージョン: "1.2"仕様ベンダー: "Sun Microsystems, Inc."実装タイトル: "java.util"実装バージョン: "build57"実装ベンダー: "Sun Microsystems, Inc."
マルチリリース
jarはオプションでマルチリリースjarとしてマークすることができます。マルチリリース機能を使用すると、ライブラリ開発者はJavaランタイムのバージョンに応じて異なるコードをロードできます。[10]これにより、開発者は互換性を犠牲にすることなく新しい機能を活用できます。
マルチリリース jar は、マニフェストで次の宣言を使用して有効になります。
マルチリリース: true
依存関係
このMANIFEST.MFファイルは、アプリケーションを実行するためにロードする必要があるすべてのクラスを指定するために使用できます。[11]
Class-Path エントリは、システム パス区切り文字ではなく、スペースで区切られることに注意してください。
クラスパス: .pkg1.jar パス/to/pkg2.jar
Apache Ant Zip/JAR サポート
Apache Antビルド ツールには、 Unix ファイルシステム拡張のサポートを含む、Zip および JAR アーカイブの読み取りと書き込みを行う独自のパッケージがあります。org.apache.tools.zip パッケージは、Apache Software Foundationライセンスに基づいてリリースされており、Ant 以外でも使用できるように設計されています。
関連フォーマット
いくつかの関連ファイル形式は JAR 形式に基づいて構築されています。
- WAR (Web アプリケーション アーカイブ) ファイル (Java アーカイブとも呼ばれます) には、 Web アプリケーションのXMLファイル、Java クラス、JavaServer Pages、およびその他のオブジェクトが格納されます。
- RAR (リソース アダプタ アーカイブ) ファイル ( RAR ファイル形式と混同しないでください) は、Java アーカイブとも呼ばれ、 J2EE コネクタ アーキテクチャ(JCA) アプリケーションの XML ファイル、Java クラス、およびその他のオブジェクトを格納します。
- EAR (エンタープライズ アーカイブ) ファイルは、エンタープライズ アプリケーション用の XML ファイル、Java クラス、およびその他のオブジェクト (JAR、WAR、RAR Java アーカイブ ファイルなど) を組み合わせた複合 Java アーカイブを提供します。
- SAR (サービス アーカイブ) は EAR に似ています。
service.xmlファイルとそれに付随する JAR ファイルを提供します。 - APK(Androidアプリケーションパッケージ)は、Javaアーカイブ形式の変形であり、Androidアプリケーションに使用されます。[12]
- AAR(Androidアーカイブ)は、通常Maven経由でAndroidライブラリを配布するために使用されます。[13]
- PAR (プラン アーカイブ) - Eclipse Virgo OSGiアプリケーション サーバーでサポートされており、マルチバンドル OSGi アプリケーションを単一のアーカイブとして展開し、同じサーバーに展開された他の PAR ベースのアプリケーションから分離することができます。
- KAR (Karaf アーカイブ) – Apache Karaf OSGi アプリケーション サーバーでサポートされており、マルチバンドル、マルチ機能の OSGi アプリケーションのデプロイを可能にします。
参照
参考文献
- ^ 「ファイル拡張子 .JAR の詳細」。2012 年11 月 29 日閲覧。
- ^ 「MIME : Java 用語集」。2012年11 月 29 日閲覧。
- ^ 「IANA Assignment」 。 2023年5月12日閲覧。
- ^ 「JDK 6 Java アーカイブ (JAR) 関連の API と開発者ガイド」。
- ^ 「JAR ファイル仕様」。Java SE ドキュメント。Oracle。2017 年 9 月 11 日時点のオリジナルからのアーカイブ。
- ^ 「マニフェストを理解する」Java.sun.com、2003 年 3 月 21 日。2012年 7 月 31 日閲覧。
- ^ 「JAR ファイル仕様」。Download.oracle.com。2012年 7 月 31 日閲覧。
- ^ 「JAR ファイル仕様」。Download.oracle.com。2012年 7 月 31 日閲覧。
- ^ 「JEP 261: モジュールシステム」。2021年2月6日閲覧。
- ^ 「JEP 238: マルチリリース JAR ファイル」 。2021年 2 月 6 日閲覧。
- ^ Sun Servlet 仕様、72 ページ (servlet-2_4-fr-spec.pdf)。Java Tech Notes も参照してください。
- ^ 「用語集」。developer.android.com。
- ^ 「Android ライブラリ」。developer.android.com。
外部リンク
- JAR ファイル仕様
- JAR ファイルの概要

