Java大規模開発、jarのマージ
メモです。
javaでの大規模プロジェクトとフォルダとパッケージとjar
Javaでの開発では、packege名とjar中でのフォルダ構成が一致していなくては ならないため、極めて不自由なフォルダ構成での開発をするか、または あちらこちらにjar作成のためのフォルダツリーを作成してしまうことに なります。
ある程度以上のプロジェクトでは、大体において、jar作成やドキュメント作成 のためのツリーが各所に残され、「どれが元ネタだ?」騒動がおきます。
開発環境を幽霊屋敷・ゴミ屋敷にしないためには
- ソースファイルフォルダとpackageは無関係にする
- jar作成はjar作成の一時フォルダを作り、jar作成後は自動消去する
- jarのマージ手続き(スクリプト)を確立する
- javadoc作成用には一時フォルダを作り、javadoc作成後は自動消去する
- javadoc用にソースを別に置く場合は、ソースのみのjarとし、決して 展開された形では置かない
Eclipseを使うと開発環境がゴミだらけになるので注意が必要です。
以降は、混乱させない、開発環境例です。
2010/4/18
以下のバッチに関する記述は古くなっています。
UNIXへの移行を容易にするため、結局バッチはやめantでビルド環境
を作成しました。
jar作成はjar用の一時フォルダに、<copy>タスクでソースをコピー します。同一パッケージにするライブラリのjarがあればこの段階 で<unja>タスクで展開します。<javac>タスクでコンパイルし、<jar>タスクでjar化 します。
jarの単純マージは<unjar>した上で<jar>し直す形です。
パッケージ名とソースのフォルダ名を無関係にするという形は "もちろん"踏まえています。
パッケージとソースフォルダ、jar作成用一時フォルダ
パッケージ名とソースフォルダは完全に分離します。
例えばパッケージが"jp.co.odyssey.orion"だったとしても、ソースは jp/co/odyssey/orionフォルダには置かず、例えばプロジェクトフォルダ odysseyの下のsrc/orion_sub1などおきます。
このフォルダには最終的にライブラリjar載せるクラスの全てを置く必要
はありません。
最終的なjarは後でマージすることになります。
ソースにはpackage記述をしない
ソースにはpackage記述をせず、ビルド時に一時的にファイル先頭 にpackage記述を付加するようにします。
これは必須ではなく、ソース上にハードコードしても構いません。
後でツールを使って書き換え可能とするのも現実的手法の一つです。
ビルド時にパッケージ用の一時フォルダを作り、完了後削除
ビルド時には、パッケージ用の一時フォルダ、例えばパッケージ が"jp.co.odyssey.orion"ならjp/co/odyssey/orion、を作成し、jarが出来上がれば 一時フォルダは消去します。
バッチファイル例
@echo off pushd %~dp0 :: Orionライブラリのビルド A01_build.bat SET CLASSPATH=%CLASSPAH% SET PKG=jp.co.odyssey.orion SET PKG_DIR=jp\co\odyssey\orion SET PKG_TOP=jp SET JAR=orion_sub1.jar SET JAVAS=orion1.java orion2.java orion3.java ::-------- パッケージツリーの作成 rd /Q /S %PKG_DIR% >NUL 2>&1 for %%f in ( %JAVAS% ) do call :copy_src %%f javac -Xlint:deprecation -Xlint:unchecked %PKG_DIR%\*.java if errorlevel 1 goto ERR ::-------- jar作成 jar cf %JAR% %PKG_DIR%\*.class if errorlevel 1 goto ERR rd /Q /S %PKG_TOP% goto OK ::-------- ソースコピーサブルーチン :copy_src md %PKG_DIR% >NUL echo package %PKG%; > %PKG_DIR%\%1 type %1 >> %PKG_DIR%\%1 goto :eof ::---------- 結果表示 ---------- :OK set result=0 echo ===== OK ===== goto END: :ERR set result=1 echo ===== SOME ERROR OCCURED ===== :END if not "%1"=="" goto NOPAUSE pause :NOPAUSE popd exit /b %result%
jarのマージ
残念なことにjarコマンドにはマージ機能はありません。
なぜ、こういう当たり前の機能をjarコマンドが
もっていないのかは理解に苦しむところです。
次に載せるのはjarをマージするバッチです。
複数jarを一旦ワークに展開し、固定名のjarにマージ結果を作ると言う単純なものです。
@echo off ::--------------------------------------------------------- :: jarMerge.bat jarファイルをマージする :: Usage : call jarMerge.bat src1.jar src2.jar ... :: 結果は jarMerged.jar(固定名) となる ::-------------------------------------- :: ワークディレクトリを作る :: rd /Q /S jarMergeWork md jarMergeWork ::-------------------------------------- :: ワークディレクトリにjarをコピーする :: し展開する for %%t in ( %* ) do call :setJars %%t ::-------------------------------------- :: 展開されたファイルをjarMerged.jarに :: まとめる rd /Q /S jarMergeWork\META-INF pushd jarMergeWork jar cvf ..\jarMerged.jar * popd jar tf jarMerged.jar :OK echo ======== OK ======= set result=0 goto END :ERR echo ======== SOME ERROR OCCURED ======= set result=1 goto ENE ::=====サブルーチン(ワークに展開)====== :setJars echo ====== merge %1 ======= copy %1 jarMergeWork pushd jarMergeWork jar -xf %~nx1 del /Q /S %~nx1 popd goto :eof :END exit /b %result%
使い方は、マージしたいtarファイルを引数で指定します。
バッチの呼び出しはcallで行います。
マージ展開結果はカレントフォルダ上 jarMerged.jar に得られます。
これを本来置きたい場所に移動します。
ワークフォルダjarMergeWorkを残しますので、不要なら呼び出し側で削除してください。
::----------------------------------------------------- :: jarのマージ :: call bin\jarMerge.bat src\orion_sub1\orion_sub1.jar src\orion_sub2\orion_sub2.jar if errorlevel 1 goto ERR jar -tf jarMerged.jar if errorlevel 1 goto ERR move jarMerged.jar lib\orion.jar if errorlevel 1 goto ERR rd /Q /S jarMergeWork
| 固定リンク