• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:AntのJarタスクで実行可能なJarファイルの作成
#navi(../)
*AntのJarタスクで実行可能なJarファイルの作成 [#e68e625a]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2003-09-25~
更新日:&lastmod;

---
title: AntのJarタスクで実行可能なJarファイルの作成
author: aterai
pubdate: 2003-09-25
description: Antを使って、Windows環境などでダブルクリックすると起動するJarファイルを作成します。
---
#contents

**概要 [#q989a75a]
Antを使って、Windows環境などでダブルクリックすると起動するJarファイルを作成します。
* 概要 [#summary]
`Ant`を使って、`Windows`環境などでダブルクリックすると起動する`Jar`ファイルを作成します。

**サンプルターゲット [#f0c358aa]
* サンプルターゲット [#target]
#code{{
<target name="package" depends="compile">
 <echo message="Creating the jar file ${build.dir}/${name}.jar"/>
 <tstamp>
  <format property="ts" pattern="yyyyMMdd-HHmmss-z"/>
 </tstamp>
 <jar jarfile="${build.dir}/${name}.jar" basedir="${build.dest}">
  <manifest>
   <attribute name="Main-Class" value="${main.class}"/>
   <attribute name="Class-Path" value="${runtime.classpath}"/>
   <attribute name="Implementation-Title"   value="${Name}"/>
   <attribute name="Implementation-Version" value="${version}"/>
   <attribute name="Implementation-Vendor"  value="${vendor}"/>
   <attribute name="Build-Id"
    value="${ts} (${user.name} [${os.name} ${os.version} ${os.arch}])"/>
  </manifest>
 </jar>
  <echo message="Creating the jar file ${build.dir}/${name}.jar"/>
  <tstamp>
    <format property="ts" pattern="yyyyMMdd-HHmmss-z"/>
  </tstamp>
  <jar jarfile="${build.dir}/${name}.jar" basedir="${build.dest}">
    <manifest>
      <attribute name="Main-Class" value="${main.class}"/>
      <attribute name="Class-Path" value="${runtime.classpath}"/>
      <attribute name="Implementation-Title"   value="${Name}"/>
      <attribute name="Implementation-Version" value="${version}"/>
      <attribute name="Implementation-Vendor"  value="${vendor}"/>
      <attribute name="Build-Id"
        value="${ts} (${user.name} [${os.name} ${os.version} ${os.arch}])"/>
    </manifest>
  </jar>
</target>
}}
-[[JToolBarでアイコンボタンを右寄せ>Swing/ToolBarLayout]]
--http://terai.xrea.jp/swing/toolbarlayout/src.zip

**解説 [#n5babbd3]
[[Swing]]以下のsrc.zipなどで、サンプルをダウンロードすることができます。
- [[JToolBarでアイコンボタンを右寄せ>Swing/ToolBarLayout]]
-- https://ateraimemo.com/swing/toolbarlayout/src.zip

${main.class}、${runtime.classpath}などのプロパティは、config 以下にある、%%''build.properties''%% ''properties.xml''ファイルを編集して環境に合わせて修正してください。%%サンプル中のbuild.xmlでは、コンパイルや実行に必要なjarファイルがあれば、libフォルダ以下に置いておくと自動的にクラスパスに追加されます。%%
 #build.propertiesファイル
 #メインクラス(jarファイルのマニフェストに使用)
 main.class=example.MainPanel
 #クラスパス(jarファイルのマニフェストに使用、区切りは半角スペース)
 runtime.classpath=. lib/test.jar hoge.jar
* 解説 [#explanation]
[[Swing]]以下の適当なページから、サンプルコード(`src.zip`)をダウンロードすることができます。

%%このサンプルでは、src\javaフォルダ以下にShift_JIS(Windows-31J)のソースファイルを置いて使用します。%%
`${main.class}`、`${runtime.classpath}`などのプロパティは、`config`以下にある、`properties.xml`ファイルを編集して環境に合わせて修正してください。

以下のように、packageターゲットでantを実行すると、jarファイルが作成されます。
#code{{
<?xml version="1.0" encoding="UTF-8"?>
<project>
  <property name="main.class"        value="example.MainPanel" />
  <property name="runtime.classpath" value=". jlfgr-1_0.jar lib/test.jar" />
  <!-- 中略 -->
</project>
}}

 ant package
以下のように、`package`ターゲットで`ant`を実行すると、`jar`ファイルが作成されます。

Antを使わない場合は、以下のようなmanifest.txtを作って、
 > ant package

`Ant`を使わない場合は、以下のような`manifest.txt`を作って、

 Main-Class: demo
 Class-Path: SampleLib.jar

以下のように、jar.exeで作成します。
`jar.exe`で作成します。

 > jar -cvfm hogehoge.jar manifest.txt demo.class

ただ、マニフェスト・ファイルを手で書くと、:の後には半角スペースが必要だったり、最終行末に改行がないとおかしくなるなど、いろいろ面倒があるみたいです。
ただ、マニフェスト・ファイルを手で書くと、名前の後には`:`と半角スペースが必須だったり、最終行末に改行がないとおかしくなるなど([https://docs.oracle.com/javase/jp/8/docs/technotes/guides/jar/jar.html JAR ファイルの仕様])、細かい制限があるようです。

//*参考リンク
**コメント [#fa161f0a]
- 参照するjarファイルが多い場合は、pathconvertタスクを使ってマニュフェストのクラスパスを自動生成するのが楽です --  &new{2007-09-23 (日) 00:36:14};
* 参考リンク [#c6064598]
- [https://docs.oracle.com/javase/jp/8/docs/technotes/guides/jar/jar.html JAR ファイルの仕様]

* コメント [#comment]
#comment
- 参照する`jar`ファイルが多い場合は、`pathconvert`タスクを使ってマニフェストのクラスパスを自動生成するのが楽です --  &new{2007-09-23 (日) 00:36:14};
-- たしかに数が多いと大変そうですね。上記の`package`ターゲットを修正して、`pathconvert`タスクを使うサンプルを以下においてみました((もうすこし整理できそう?))。 -- &user(aterai); &new{2007-09-23 (日) 15:58:48};

#code{{
<pathconvert pathsep=" " dirsep="/" property="jar.runtime.classpath">
  <path>
    <pathelement location="${build.dir}" />
  </path>
  <map from="${build.dir}" to="."/>
</pathconvert>
<target name="jarpath" if="have.library">
  <path id="jar.path">
    <pathelement location="${build.dir}" />
    <fileset dir="${lib.dir}">
      <include name="*.jar" />
    </fileset>
  </path>
  <!-- lib.dirは相対パスで指定しているので、これを絶対パスに変換 -->
  <!-- これは、あとでmapを使ってjar.pathから絶対パスを削るため -->
  <pathconvert property="lib.path">
    <path path="${lib.dir}" />
  </pathconvert>
  <echo message="-------------------------- ${lib.path}" />
  <pathconvert pathsep=" " dirsep="/" property="jar.runtime.classpath" refid="jar.path">
    <map from="${lib.path}"  to="."/>
    <map from="${build.dir}" to="."/>
  </pathconvert>
  <echo message="-------------------------- ${jar.runtime.classpath}" />
</target>
<target name="package" depends="compile, jarpath">
  <echo message="Creating the jar file ${build.dir}/${name}.jar" />
  <tstamp>
    <format property="ts" pattern="yyyyMMdd-HHmmss-z" />
  </tstamp>
  <jar jarfile="${build.dir}/${name}.jar" basedir="${build.dest}">
    <manifest>
      <attribute name="Main-Class" value="${main.class}" />
      <attribute name="Class-Path" value="${jar.runtime.classpath}" />
      <attribute name="Implementation-Title"   value="${Name}" />
      <attribute name="Implementation-Version" value="${version}" />
      <attribute name="Implementation-Vendor"  value="${vendor}" />
      <attribute name="Build-Id" value="${ts} (${user.name} [${os.name} ${os.version} ${os.arch}])" />
    </manifest>
  </jar>
</target>
}}

#comment