【Ant】 JARファイルの作成

はじめに

 * 実行可能なJARファイル作成をantで行う
 * テストコードは除外する
 * antの以下のタスクのマニュアルが役立つ
http://www.jajakarta.org/ant/ant-1.6.1/docs/ja/manual/CoreTasks/jar.html
http://www.jajakarta.org/ant/ant-1.6.1/docs/ja/manual/CoreTasks/manifest.html

例1:単純なサンプル

com.sample.helloworld.Main.java

package com.sample.helloworld;

public class Main {
  public static void main(String[] args) {
    System.out.println("Hello World!");
  }
}

build.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="create.jar" name="SampleJavaCodes">
  <property name="class.path" value="./class" />
  <property name="main.class" value="com.sample.helloworld.Main" />
  <property name="java.path" value="./src" />
  <property name="jar.name" value="SampleJar" />
  <property name="class.excludes" value="**/tests/**, **/**Test.class, **/**Tests.class, **/demo/**" />
  <target name="init" description="初期化">
    <delete dir="${class.path}"/>
    <mkdir dir="${class.path}"/>
  </target>
  <target name="compile" depends="init" description="Javaコンパイル">
    <javac encoding="Shift-JIS" srcdir="${java.path}" destdir="${class.path}" includeantruntime="false" />
  </target>
   <target name="create.jar" depends="compile" description="JAR作成">
      <jar destfile="${jar.name}.jar" basedir="${class.path}" excludes="${class.excludes}">
        <manifest>
          <attribute name="Main-Class" value="${main.class}"/>
          <attribute name="Class-Path" value="${class.path}"/>
          <attribute name="Specification-Title" value="Sample Title"/>
          <attribute name="Specification-Version" value="1.0.0"/>
          <attribute name="Specification-Vendor" value="Sample Vendor"/>
        </manifest>
      </jar>
   </target>
</project>

Jarファイルの実行

コマンドプロンプトを立ち上げて、以下のコマンドで実行する
> java -jar SampleJar.jar
Hello World!

補足:特定のクラスを除外するには

* 「excludes」を使う
【例】
  <property name="class.excludes" value="**/tests/**, **/**Test.class, **/**Tests.class, **/demo/**" />

   <target name="createJar" depends="compile" description="JAR作成">
      <jar destfile="${jarName}.jar" basedir="${class.path}" excludes="${class.excludes}">
      </jar>
   </target>

例2:サブプロジェクト/ライブラリに依存したプロジェクトに対して、JARファイル作成

構成

 + Common(サブプロジェクト)
   + src
      + com.sample.Util.java
 + SampleProject(JARファイル作成の対象プロジェクト)
   + src
      + com.sample.Main.java
   + lib(使用するライブラリ)
      + log4j-1.2.17.jar

com.sample.Util.java

package com.sample;

public class Util {
  public static String sayHello(String name) {
    return "Hello, " + name + "!!";
  }
}

com.sample.Main.java

package com.sample;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;

public class Main {
  private static Logger logger = Logger.getLogger(Main.class.getName());

  public static void main(String[] args) {
    BasicConfigurator.configure();
    logger.info("start!");
    
    System.out.println(Util.sayHello("Mike"));
    
    logger.info("Done!!");
  }
}

build.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="compile" name="SampleProject">
  <property name="Common.location" value="../Common" />
  <property name="Common.src.location" location="${Common.location}/src" />
  <property name="class.path" value="./class" />
  <property name="main.class" value="com.sample.Main" />
  <property name="java.path" value="./src" />
  <property name="java.excludes" value="**/tests/**, **/**Test.java, **/**Tests.java, **/demo/**" />
  <property name="class.excludes" value="**/tests/**, **/**Test.class, **/**Tests.class, **/demo/**" />
  <path id="SampleProject.classpath">
    <fileset dir="${basedir}/lib">
      <include name="*.jar" />
    </fileset>
  </path>
  <target name="init" description="初期化">
    <delete dir="${class.path}" />
    <mkdir dir="${class.path}" />
  </target>
  <target name="compile.sub-project" depends="init" description="サブプロジェクトのJavaコンパイル">
    <javac encoding="UTF-8" srcdir="${Common.src.location}" destdir="${class.path}" includeantruntime="false" />
  </target>
  <target name="compile" depends="compile.sub-project" description="Javaコンパイル">
    <javac encoding="UTF-8" srcdir="${java.path}" destdir="${class.path}" includeantruntime="false">
      <classpath>
        <path refid="SampleProject.classpath" />
      </classpath>
      <exclude name="${java.excludes}" />
    </javac>
  </target>
  <target name="create.jar" depends="compile" description="JAR作成">
    <jar destfile="${ant.project.name}.jar" basedir="${class.path}" excludes="${class.excludes}">
      <zipgroupfileset dir="${basedir}/lib" includes="*.jar" />
      <manifest>
        <attribute name="Main-Class" value="${main.class}" />
        <attribute name="Class-Path" value="${class.path}" />
        <attribute name="Specification-Title" value="Sample Title" />
        <attribute name="Specification-Version" value="1.0.0" />
        <attribute name="Specification-Vendor" value="Sample Vendor" />
      </manifest>
    </jar>
  </target>
</project>

Jarファイルの実行

コマンドプロンプトを立ち上げて、以下のコマンドで実行する
> java -jar SampleProject.jar
0 [main] INFO com.sample.Main  - start!
Hello, Mike!!
4 [main] INFO com.sample.Main  - Done!!