2012年7月11日水曜日

【Ant】javacでコンパイルしてclassファイルを作成した後にそのclassファイルを元にJarファイルを作成するbuild.xmlを作ってみた

四の五の言わずまずはソースから

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="create_run_jar" name="Create Runnable Jar for Project Hoge">
 <!--this file was created by Eclipse Runnable JAR Export Wizard-->
 <!--ANT 1.7 is required                                        -->

 <property name="jarname" value="Hoge.jar" />
 <property name="dir.src" value="WEB-INF/src" />
 <property name="dir.dest" value="dest/bin" />
 <property name="dir.from.resources" value="resources" />
 <property name="dir.to.resources" value="WEB-INF/classes" />
 <property name="compiler" value="C:/user/java/6/bin/javac" />
 <property name="dir.compiler" value="WEB-INF/lib" />
 <property name="dir.compiler.tomcat" value="C:/user/tomcat/6.0/lib" />

 <path id="classpath.hoge">
  <fileset dir="${dir.compiler}" includes="*.jar" />
  <fileset dir="${dir.compiler.tomcat}" includes="*.jar" />
 </path>

 <target name="copy_resources">
  <echo message="リソースファイルをコピーします(Tomcat起動用)" />
  <copy todir="${dir.to.resources}">
   <fileset dir="${dir.from.resources}">
   </fileset>
  </copy>
 </target>

 <target name="clean" depends="copy_resources">
  <echo message="コンパイル先ディレクトリを削除します" />
  <delete dir="${dir.dest}" />
 </target>

 <target name="mkdir" depends="clean">
  <echo message="コンパイル先ディレクトリを作成します" />
  <mkdir dir="${dir.dest}" />
 </target>

 <target name="compile" depends="mkdir">
  <echo message="コンパイルを行います" />
  <javac srcdir="${dir.src}" destdir="${dir.dest}" executable="${compiler}" debug="on" debuglevel="lines,vars,source" optimize="off" deprecation="on" encoding="UTF-8" includeAntRuntime="off">
   <classpath refid="classpath.hoge" />
  </javac>
 </target>

 <target name="create_run_jar" depends="compile">
  <echo message="Jarファイルを作成します" />
  <jar destfile="${jarname}" filesetmanifest="mergewithoutmain">
   <manifest>
    <attribute name="Main-Class" value="Hoge" />
    <attribute name="Class-Path" value="." />
   </manifest>
   <fileset dir="${dir.dest}" />
  </jar>
 </target>

</project>

上記何をしているかタグごとに上から説明します
処理的にも順次上から実行している流れになっています

propertyタグ
定数的なものを宣言しておりますここで宣言したものは${hoge}という形で参照することができます

pathタグ
コンパイル(javac)を行う際に必要になるライブラリを指定します

target(name="copy_resources")タグ
設定ファイルをコピーしています
実はTomcat用でWEB-INF/classes配下にプロパティファイルがないとTomcatは見えないのでそこにコピーしてあげています
(今回の趣旨とは少しことなるので無視でいいかもしれません)

target(name="clean")タグ
javacをしてできたクラスファイルを出力する先のディレクトリを削除します
このあとで作成するのですが、なぜ一旦削除するかというと前に作ってclassファイルとかが残っているとjarファイルを作成するときに前のclassファイルを参照してしまう可能性があるので一旦消しています

target(name="mkdir")タグ
javacをしてできたクラスファイルを出力する先のディレクトリを作成します

target(name="compile")タグ
javacを実行します
javacを実行する実際のソースコードがある箇所とそのソースをコンパイルするために必要になるクラスパスのオプションタブを追加しています
クラスパスの設定がうまくいっていない場合はこのコンパイル部分でこけると思います
javacのオプションをいろいろ設定していますが、詳しくは調べてくださいw
大事なのは
encoding="UTF-8" includeAntRuntime="off"
の2つだと思います

target(name="create_run_jar")タグ
コンパイルしてできたclassファイルを元にjarファイル作成します


とまぁbuild.xmlの説明は以上で、こんな感じでjarファイルを作成することはできます
(プロパティファイルのコピーはいらないかもこの中では特殊な制御なのでいらないと思います)

で今回一番ハマったのが、build.xmlをeclipseから実行してantのjavacタグでのコンパイル時に


エラー: \65279は不正な文字です

が出る場合があります
原因はBOM付きのUTF-8で保存されているせい(eclipseのせいなのかなー・・・)
ネットで調べるとWindowsのメモ帳で編集するとBOMがついてしまうそうですがメモ帳で編集した記憶などはない・・・
とりあえずこれを消す方法は
TeraPad
を使います
ファイル→文字/改行コード指定保存
で「UTF-8N」を選択して上書き保存します。どうやらこれで保存するとBOMなしのUTF-8で保存できるようです
eclipse上だけではこれを回避するのは難しいようです

0 件のコメント:

コメントを投稿