Jar

説明

複数のファイルをJarファイルにまとめます。

basedir 属性は、Jar化する際の基準ディレクトリです。

ファイルのパーミッションは、結果のJarファイルには保存されないことに注意してください。

Jar化するファイルセットを絞り込むことができます。これは、includesincludesfileexcludesexcludesfile、および defaultexcludes 属性を使用して行います。includes または includesfile 属性では、パターンを使用して含めるファイルを指定します。exclude または excludesfile 属性は、除外するファイルを指定するために使用されます。これもパターンを使用して行います。最後に、defaultexcludes 属性を使用して、デフォルトの除外を使用するかどうかを指定できます。ファイルの包含/除外の仕組み、およびパターンの記述方法については、ディレクトリベースのタスクのセクションを参照してください。

このタスクは暗黙的な FileSet を形成し、<fileset> のほとんどの属性(dirbasedir になります)と、ネストされた <include><exclude>、および <patternset> 要素をサポートします。

より柔軟性を高めるためにネストされたファイルセットを使用することもでき、複数のファイルセットを指定して異なるファイルツリーを1つのJARにマージすることもできます。zip タスクの拡張 fileset および groupfileset 子要素も、jar タスクで使用できます。詳細と例については、Zip タスクを参照してください。

update パラメーターは、JARファイルが既に存在する場合の動作を制御します。「yes」に設定すると、JARファイルは指定されたファイルで更新されます。「no」(デフォルト)に設定すると、JARファイルは上書きされます。この使用例は、Zipタスクのドキュメントに記載されています。ZIPファイルはファイルの変更時刻を2秒の粒度で保存することに注意してください。ファイルがアーカイブ内のエントリよりも2秒未満新しい場合、Antはそれを新しいとは見なしません。

マニフェストが省略された場合は、Apache Antによって単純なマニフェストが提供されます。

whenmanifestonly パラメーターは、マニフェストファイルまたはネストされたサービス以外のファイルが一致しない場合の動作を制御します。「skip」の場合、JARは作成されず、警告が発行されます。「fail」の場合、JARは作成されず、ビルドはエラーで停止します。「create」(デフォルト)の場合、空のJARファイル(マニフェストとサービスのみを含む)が作成されます。

Jar タスクには、JARファイルのマニフェストファイルを指定するためのショートカットがあります。同じことは、Zip タスクで zipfilesetfullpath 属性を使用することによっても実現できます。1つの違いは、manifest 属性が指定されていない場合、Jar タスクは空のものを含めることです。)

マニフェストは、Jarファイル仕様に従ってJarタスクによって処理されます。特に、これにより、72バイトを超えるマニフェスト行がラップされ、次の行に続く可能性があることに注意してください。

Jar タスクは、バージョン管理仕様に従ってパッケージ情報を指定したかどうかを確認します。

ZIP形式では、同じ完全修飾名の複数のファイルを単一のアーカイブ内に存在させることができることに注意してください。これは、 unsuspecting なユーザーにさまざまな問題を引き起こすことが documented されています。この動作を回避するには、duplicate 属性をデフォルトの「add」以外の値に設定する必要があります。

JARファイルに暗号署名するには、このタスクから作成したJARに対してSignJarタスクを使用します。

JEP 238マルチリリースjarの単純なバージョンを作成するには、特別なツールは必要ありません。必要なmanifestエントリを設定し、JEP 238の例でわかるように、必要な場所にファイルを配置するだけです。この種のjarを調整する場合、たとえば、バージョンブランチから「同じ」クラスを削除してサイズを小さくする場合、さらに多くのことを行う必要があります...

パラメータ

属性 説明 必須
destfile 作成するJARファイル。 はい
basedir ファイルをJar化するディレクトリ。 いいえ
compress データを保存するだけでなく、圧縮もします。keepcompression属性を「false」に設定しない限り、これは更新中に追加したファイルだけでなく、アーカイブ全体に適用されます。 いいえ; デフォルトは「true」
keepcompression 既存のアーカイブ(ネストされたzipfilesetなど、またはアーカイブの更新中)からのエントリの場合、compress属性を使用する代わりに、元の圧縮を維持します。 * Ant 1.6以降 * いいえ; デフォルトは「false」
encoding アーカイブ内のファイル名に使用する文字エンコーディング。 **作成されたアーカイブは、それ以外の場合、Javaで読み取れない可能性が高いため、この値を変更することはお勧めしません。**
zipタスクページの説明も参照してください
いいえ; デフォルトは「UTF8」
filesonly ファイルエントリのみを保存する いいえ; デフォルトは「false」
includes 含める必要があるファイルのパターンのカンマまたはスペース区切りリスト いいえ; デフォルトはすべて(「**」)
includesfile ファイルの名前。このファイルの各行は、includeパターンと見なされます いいえ
excludes 除外する必要があるファイルのパターンのカンマまたはスペース区切りリスト いいえ; defaultexcludesが「no」の場合、デフォルトの除外またはなしにデフォルト設定されます
excludesfile ファイルの名前。このファイルの各行は、excludeパターンと見なされます いいえ
defaultexcludes デフォルトの除外を使用するかどうかを示します(「yes | no」) いいえ; デフォルトは「yes」
manifest 使用するマニフェストファイル。これは、マニフェストの場所、またはファイルセットを介して追加されたjarの名前のいずれかになります。追加されたjarの名前の場合、タスクはマニフェストがMETA-INF/MANIFEST.MFにあるjarにあることを期待します いいえ
filesetmanifest zipfilesetまたはzipgroupfilesetファイルでマニフェストが見つかった場合の動作。有効な値は、「skip」、「merge」、および「mergewithoutmain」です。「merge」はすべてのマニフェストをまとめてマージし、これを他の指定されたマニフェストにマージします。「mergewithoutmain」は、マニフェストのメインセクション以外のすべてをマージします。 いいえ; デフォルトは「skip」
update 宛先ファイルが既に存在する場合に、更新するか上書きするかを示します いいえ; デフォルトは「false」
whenmanifestonly ファイルが一致しない場合の動作。有効な値は、「fail」、「skip」、および「create」です。 いいえ; デフォルトは「create」
duplicate 重複ファイルが見つかった場合の動作。有効な値は、「add」、「preserve」、および「fail」です。 いいえ; デフォルトは「add」
index クラスの読み込みを高速化するためにインデックスリストを作成するかどうか。ネストされたindexjars要素で追加のjarを指定しない限り、このjarの内容のみがインデックスに含まれます。 いいえ; デフォルトは「false」
indexMetaInf META-INFとその子をインデックスに含めるかどうか。indexが「false」の場合、効果はありません。
Sunのjar実装はMETA-INFディレクトリをスキップしていましたが、Antはその例に従いました。この動作はJava 5で変更されました。Java 1.4以前でAntによって生成されたjarで問題が発生しないようにするために、Antは明示的に要求されない限りMETA-INFを含めません。 * Ant 1.8.0以降 *
いいえ; デフォルトは「false」
manifestencoding マニフェストファイルが指定されている場合に、JARマニフェストの読み取りに使用されるエンコーディング。タスクは、マニフェストを書き込むときに常にUTF-8を使用します。 いいえ; デフォルトはデフォルトのJVM文字エンコーディング
roundup ファイルの変更時刻を偶数秒に切り上げるかどうか。
Zipアーカイブは、ファイルの変更時刻を2秒の粒度で保存するため、時刻は切り上げられるか切り捨てられます。切り捨てると、タスクを再実行したときにアーカイブは常に古くなっているように見えるため、デフォルトは切り上げです。切り上げると、Webアーカイブ内のJSPのように、プリコンパイルされたページよりもわずかに新しいように見えるため、プリコンパイルが役に立たなくなるなどの別の種類の問題が発生する可能性があります。 * Ant 1.6.2以降 *
いいえ; デフォルトは「true」
level ファイル圧縮を実行する必要があるデフォルト以外のレベル。有効な値の範囲は、「0」(圧縮なし/最速)から「9」(最大圧縮/最遅)です。 * Ant 1.7以降 * いいえ
strict パッケージバージョン仕様の違反の処理方法を構成します
  • 「fail」= BuildExceptionをスローします
  • 「warn」=警告レベルでメッセージをログに記録します
  • 「ignore」=詳細レベルでメッセージをログに記録します(デフォルト)
Ant 1.7.1以降
いいえ; デフォルトは「ignore」
preserve0permissions アーカイブを更新したり、別のアーカイブからエントリを追加したりする場合、Antは、Unixパーミッション値0(ファイル/ディレクトリに対して誰も何もできない)は、実際のパーミッションではなく、パーミッションがまったく保存されていないことを意味すると想定し、代わりに独自のデフォルト値を適用します。
元のパーミッションフィールドを本当に保持したい場合は、この属性を「true」に設定します。 * Ant 1.8.0以降 *
いいえ; デフォルトは「false」
useLanguageEncodingFlag エンコーディングがUTF-8の場合、言語エンコーディングフラグを設定するかどうか。この設定は、エンコーディングがUTF-8でない場合は効果がありません。 * Ant 1.8.0以降 *。
zipタスクページの説明も参照してください
いいえ; デフォルトは「true」
createUnicodeExtraFields エントリのメタデータ内にファイル名を2回目に格納するために、Unicode追加フィールドを作成するかどうか。
可能な値は、「never」、「always」、および「not-encodeable」で、ファイル名をエンコードできない場合にのみUnicode追加フィールドを追加します。
zipタスクページの説明も参照してください
いいえ; デフォルトは「never」
fallbacktoUTF8 指定されたエンコーディングを使用してファイル名をエンコードできない場合、指定されたエンコーディングの代わりにUTF-8と言語エンコーディングフラグを使用するかどうか。 * Ant 1.8.0以降 *。
zipタスクページの説明も参照してください
いいえ; デフォルトは「false」
mergeClassPathAttributes 異なるマニフェストで見つかったClass-Path属性をマージするかどうか(マニフェストをマージする場合)。「false」の場合、最後にマージされたマニフェストの属性のみが保持されます。 * Ant 1.8.0以降 *。
flattenAttributesも「true」に設定しない限り、これにより、マニフェスト仕様に違反する複数のClass-Path属性を含むマニフェストが発生する可能性があります。
いいえ; デフォルトは「false」
flattenAttributes セクションで複数回出現する属性(これはClass-Path属性の場合にのみ発生する可能性があります)を単一の属性にマージするかどうか。 * Ant 1.8.0以降 *。 いいえ; デフォルトは「false」
zip64Mode エントリにZip64拡張機能をいつ使用するか。可能な値は、「never」、「always」、および「as-needed」です。 * Ant 1.9.1以降 *。
zipタスクページの説明も参照してください
いいえ; デフォルトは「never」
modificationtime 保存されているすべてのファイルの変更時刻を指定された時刻に設定します。これは、1970-01-01T00:00:00Z以降のミリ秒として解釈される数値、またはタイムゾーンがオプションのISO 8601タイムスタンプとして解析できる文字列のいずれかです。 * Ant 1.10.2以降 *。 いいえ

ネストされた要素として指定されたパラメータ

metainf

ネストされたmetainf要素は、FileSetを指定します。このファイルセットに含まれるすべてのファイルは、jarファイルのMETA-INFディレクトリに配置されます。このファイルセットにMANIFEST.MFという名前のファイルが含まれている場合、ファイルは無視され、警告が表示されます。

manifest

ネストされた manifest 要素を使用すると、Jar ファイルのマニフェストを外部ファイルではなく、ビルドファイルにインラインで指定できます。この要素は manifest タスクと同じですが、file 属性と mode 属性は省略する必要があります。

インラインマニフェストと外部ファイルの両方が指定されている場合、マニフェストはマージされます。

インラインマニフェストを使用する場合、Jar タスクはマニフェストの内容が変更されたかどうかを確認します(つまり、指定されたマニフェストが、jar に存在するマニフェスト(存在する場合)と何らかの形で異なるかどうか)。マニフェストの値が変更された場合、jar は必要に応じて更新または再構築されます。

indexjars

Ant 1.6.2以降

ネストされた indexjars 要素は、パスのような構造を指定します。タスクの index 属性を true に設定しない限り、その内容は完全に無視されます。

このタスクによって作成されたインデックスには、このパスに含まれるアーカイブのインデックスが含まれます。アーカイブに使用される名前は、マニフェストによって異なります。

indexmetainf 属性が true に設定されていない限り、このタスクは、空であるか、META-INF ディレクトリ内のファイルのみを含むアーカイブのインデックスエントリを作成しません。

indexjarsmapper

Ant 1.10.9以降

ネストされた indexjarsmapper 要素は、デフォルトのファイル名変換では不十分な場合、indexjars で指定されたアーカイブのカスタムファイル名変換を実行するために使用できます。

service

Ant 1.7.0以降

ネストされた service 要素は、サービスを指定します。サービスについては、サービスプロバイダーの概要で説明されています。このアプローチでは、プロバイダー JAR に、提供されるサービスによって名前が付けられたファイル(たとえば、META-INF/services/javax.script.ScriptEngineFactory)を含めます。このファイルには、実装クラス名が 1 行に 1 つずつ(通常は JAR ごとに 1 つだけ)含まれています。

サービスの名前は type 属性によって設定されます。サービスを実装するクラス名は、provider 属性、またはサービスを実装する複数のクラスを指定する場合は、ネストされた provider 要素によって指定されます。

属性 説明 必須
type サービスの名前。 はい
provider サービスを実装するクラスのクラス名。 はい。ネストされた <provider> 要素がない場合。

プロバイダーのクラス名は、provider 属性、または単一の classname 属性を持つネストされた <provider> 要素によって指定されます。JAR ファイルにサービスの実装が複数ある場合、複数のネストされた <provider> 要素を使用できます。

単純

${build}/classes ディレクトリ内のすべてのファイルを、${dist}/lib ディレクトリにある app.jar というファイルに Jar します。

<jar destfile="${dist}/lib/app.jar" basedir="${build}/classes"/>

フィルター付き

${build}/classes ディレクトリ内のすべてのファイルを、${dist}/lib ディレクトリにある app.jar というファイルに Jar します。Test.class という名前のファイルは除外されます。

<jar destfile="${dist}/lib/app.jar"
     basedir="${build}/classes"
     excludes="**/Test.class"/>

${build}/classes ディレクトリ内のすべてのファイルを、${dist}/lib ディレクトリにある app.jar というファイルに Jar します。mypackage/test ディレクトリ以下のファイルのみが使用され、Test.class という名前のファイルは除外されます。

<jar destfile="${dist}/lib/app.jar"
     basedir="${build}/classes"
     includes="mypackage/test/**"
     excludes="**/Test.class"/>

複数のファイルセット

${build}/classes ディレクトリと ${src}/resources ディレクトリのすべてのファイルを、${dist}/lib ディレクトリにある app.jar というファイルにまとめて Jar します。Test.class という名前のファイルは除外されます。${build}/classes/mypackage/MyClass.class${src}/resources/mypackage/image.gif などのファイルがある場合、それらは jar 内の同じディレクトリに表示されます(そのため、Java では同じパッケージと見なされます)。

<jar destfile="${dist}/lib/app.jar">
    <fileset dir="${build}/classes"
             excludes="**/Test.class"/>
    <fileset dir="${src}/resources"/>
</jar>

アーカイブのマージ

メインクラス com.acme.checksites.Main を使用して実行可能な jar ファイルを作成し、jar lib/main/some.jar からすべてのクラスを埋め込みます。

<jar destfile="build/main/checksites.jar">
    <fileset dir="build/main/classes"/>
    <zipfileset includes="**/*.class" src="lib/main/some.jar"/>
    <manifest>
      <attribute name="Main-Class"
                 value="com.acme.checksites.Main"/>
    </manifest>
</jar>

メインクラス com.acme.checksites.Main を使用して実行可能な jar ファイルを作成し、lib/main 内のすべての jar からすべてのクラスを埋め込みます。

<jar destfile="build/main/checksites.jar">
    <fileset dir="build/main/classes"/>
    <restrict>
       <name name="**/*.class"/>
       <archives>
           <zips>
               <fileset dir="lib/main" includes="**/*.jar"/>
           </zips>
       </archives>
    </restrict>
    <manifest>
        <attribute name="Main-Class"
              value="com.acme.checksites.Main"/>
    </manifest>
</jar>

インラインマニフェスト

<jar destfile="test.jar" basedir=".">
    <include name="build"/>
    <manifest>
        <!-- If this is an Applet or Web Start application, include
             the proper attributes from https://docs.oracle.com/javase/8/docs/technotes/guides/jweb/index.html -->
        <attribute name="Permissions" value="sandbox"/>
        <attribute name="Codebase" value="example.com"/>
        <!-- Who is building this jar? -->
        <attribute name="Built-By" value="${user.name}"/>
        <!-- Information about the program itself -->
        <attribute name="Implementation-Vendor" value="ACME inc."/>
        <attribute name="Implementation-Title" value="GreatProduct"/>
        <attribute name="Implementation-Version" value="1.0.0beta2"/>
        <!-- details -->
        <section name="common/MyClass.class">
            <attribute name="Sealed" value="false"/>
        </section>
    </manifest>
</jar>

これは、ビルドプログラムのバージョン(Implementation-Version)を含むインラインマニフェストの指定例です。Built-By 属性は、Ant プロパティ user.name の値を取ります。上記によって生成されたマニフェストは次のようになります。

Manifest-Version: 1.0
Permissions: sandbox
Codebase: example.com
Built-By: conor
Implementation-Vendor: ACME inc.
Implementation-Title: GreatProduct
Implementation-Version: 1.0.0beta2
Created-By: Apache Ant 1.9.2

Name: common/MyClass.class
Sealed: false

サービスプロバイダー

スクリプトインターフェースの実装でサービスを指定する jar ファイルを作成する方法を次に示します。

<jar destfile="pinky.jar">
    <fileset dir="build/classes"/>
    <service type="javax.script.ScriptEngineFactory"
             provider="org.acme.PinkyLanguage"/>
</jar>

スクリプトインターフェースの 2 つの実装でサービスを指定する jar ファイルを作成する方法を次に示します。

<jar destfile="pinkyandbrain.jar">
    <fileset dir="classes"/>
    <service type="javax.script.ScriptEngineFactory">
        <provider classname="org.acme.PinkyLanguage"/>
        <provider classname="org.acme.BrainLanguage"/>
    </service>
</jar>

JEP 238 の例:マルチリリース JAR ファイル

ここでは、仕様 JEP 238 に従って、*マルチリリース JAR ファイル* を作成します。これは、JAR の上に、実行する Java のバージョンに応じて使用可能な追加のクラスまたは上書きするクラスを jar に配置する可能性を定義しています。
基本的には、マニフェストエントリ Multi-Release: true を設定し、すべての追加または上書きするクラスを META-INF/versions/number/package-structure(例:META-INF/versions/9/org/apache/ant/MyClass.class)に配置する必要があるということです。

この例では、通常のクラスは ${java.classes} にコンパイルされ、Java 9 クラスは ${java9.classes} にコンパイルされると想定しています。

<jar destfile="mrjar.jar">
    <manifest>
        <!-- special mf-entry according to the spec -->
        <attribute name="Multi-Release" value="true"/>
    </manifest>
    <!-- directory structure according to the spec ... -->
    <!-- ... default classes loadable by old (<Java 9) versions -->
    <fileset dir="${java.classes}"/>
    <!-- ... per release classes, require Java 9+ for loadable via standard ClassLoader -->
    <zipfileset prefix="META-INF/versions/9/" dir="${java9.classes}"/>
</jar>