« 16進コードメモ:文字コードやアイキャッチなど | トップページ | ◆カーナビに左寄せアプローチアルゴリズムを »

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

|

« 16進コードメモ:文字コードやアイキャッチなど | トップページ | ◆カーナビに左寄せアプローチアルゴリズムを »

トラックバック


この記事へのトラックバック一覧です: Java大規模開発、jarのマージ:

« 16進コードメモ:文字コードやアイキャッチなど | トップページ | ◆カーナビに左寄せアプローチアルゴリズムを »