複数のファイルをJarファイルにまとめます。
basedir 属性は、Jar化する際の基準ディレクトリです。
ファイルのパーミッションは、結果のJarファイルには保存されないことに注意してください。
Jar化するファイルセットを絞り込むことができます。これは、includes、includesfile、excludes、excludesfile、および defaultexcludes 属性を使用して行います。includes または includesfile 属性では、パターンを使用して含めるファイルを指定します。exclude または excludesfile 属性は、除外するファイルを指定するために使用されます。これもパターンを使用して行います。最後に、defaultexcludes 属性を使用して、デフォルトの除外を使用するかどうかを指定できます。ファイルの包含/除外の仕組み、およびパターンの記述方法については、ディレクトリベースのタスクのセクションを参照してください。
このタスクは暗黙的な FileSet を形成し、<fileset>
のほとんどの属性(dir は basedir になります)と、ネストされた <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
タスクで zipfileset
の fullpath 属性を使用することによっても実現できます。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 | パッケージバージョン仕様の違反の処理方法を構成します
|
いいえ; デフォルトは「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
要素は、FileSetを指定します。このファイルセットに含まれるすべてのファイルは、jarファイルのMETA-INFディレクトリに配置されます。このファイルセットにMANIFEST.MFという名前のファイルが含まれている場合、ファイルは無視され、警告が表示されます。
ネストされた manifest
要素を使用すると、Jar ファイルのマニフェストを外部ファイルではなく、ビルドファイルにインラインで指定できます。この要素は manifest タスクと同じですが、file 属性と mode 属性は省略する必要があります。
インラインマニフェストと外部ファイルの両方が指定されている場合、マニフェストはマージされます。
インラインマニフェストを使用する場合、Jar
タスクはマニフェストの内容が変更されたかどうかを確認します(つまり、指定されたマニフェストが、jar に存在するマニフェスト(存在する場合)と何らかの形で異なるかどうか)。マニフェストの値が変更された場合、jar は必要に応じて更新または再構築されます。
Ant 1.6.2以降
ネストされた indexjars
要素は、パスのような構造を指定します。タスクの index 属性を true
に設定しない限り、その内容は完全に無視されます。
このタスクによって作成されたインデックスには、このパスに含まれるアーカイブのインデックスが含まれます。アーカイブに使用される名前は、マニフェストによって異なります。
Class-Path
属性が含まれていない場合、先頭のディレクトリパスを含まないファイル名が使用され、パスのすべての部分がインデックス化されます。Class-Path
属性が含まれている場合、このタスクは Class-Path
のどの部分が特定のアーカイブに属しているかを推測しようとします。名前を推測できない場合、アーカイブはスキップされます。それ以外の場合、Class-Path
属性内にリストされている名前が使用されます。indexmetainf 属性が true
に設定されていない限り、このタスクは、空であるか、META-INF ディレクトリ内のファイルのみを含むアーカイブのインデックスエントリを作成しません。
Ant 1.10.9以降
ネストされた indexjarsmapper
要素は、デフォルトのファイル名変換では不十分な場合、indexjars
で指定されたアーカイブのカスタムファイル名変換を実行するために使用できます。
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 ファイル* を作成します。これは、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>