読者です 読者をやめる 読者になる 読者になる

kiyo_hikoのブログ

メモ+日記?

Java:jarをつくるためのAntのbuild.xmlの書き方(1)

きよツール配布目指して調査中。メモなのでぜんぜん体系的じゃない。

build.xml

こんな感じで書くといいらしい

<?xml version="1.0" encoding="UTF-8"?>
<project name="sample" default="main">
  <target name="main" depends="javac, jar">
	<echo>
	  .jar created.
	</echo>
  </target>
  <target name="javac">
	<javac srcdir="." encoding="utf-8" includeantruntime="false" />
  </target>
  <target name="jar">
	<jar jarfile="sample.jar" basedir="." includes="*.class">
	  <manifest>
		 <attribute name="Main-Class" value="Main" />
	  </manifest>
	</jar>
  </target>
</project>
  • トップレベルはprojectで、target (Antがやる個々の仕事かな?) からデフォルトで起動するものを書く
  • javacにencodingを渡すとUTF-8とかにできる
  • jarの下にmanifestタグ階層を作ると、jarに収納されるmanifest.MFの中身を書き足せる
    • それぞれの項目をattributeタグの属性、ネームバリューに書いてく
  • Main-Classにエントリーポイントがあるクラス名を書く。書かないとどのクラスから起動させるのかわからない

といった感じ。それと、javacのincludeantruntime属性がないとAntが警告出してくるけど、これをなくすために以下のサイトの記述を参考にさせて頂いた。

includeantruntimeは、Antのランタイムライブラリをクラスパスに含むかという設定らしく、これがデフォルトでtrueらしい。
(中略)
結局の所、javacタスクにincludeantruntime="false"を設定するだけで良いのだが

Ant 1.8から出るincludeAntRuntimeに関するワーニング - epian-wiki

サンプル用Javaも適当に

import javax.swing.*;
class Main {
	public static void main(String[] args) {
		JFrame win = new JFrame("sample");
		win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		win.add(new JLabel("Hello, World."));
		win.pack();
		win.setVisible(true);
	}
}

実際にビルドするには

buildとMainのパスに移動して

ant

って打つだけ。

実行結果

%cwdにはcurrent working directory入る

%cwd%>ant
ant
Buildfile: %cwd%\build.xml

javac:

jar:
      [jar] Building jar: %cwd%\sample.jar

main:
     [echo] 
     [echo] 	  .jar created.
     [echo] 	

BUILD SUCCESSFUL
Total time: 0 seconds

取りあえずここまで。あと目標2点

  • Eclipseで作ったプロジェクトまるっとビルド
  • 難読化を仕込む

などは続きのエントリーで順次書いていくつもり。