Javaで記述されたコマンドラインアプリケーションを配布したい。
私のアプリケーションはZipファイルとして配布されます。このファイルには、メインクラスの呼び出しに必要な.jarファイルを含むlibディレクトリエントリがあります。現在、Unix環境には、libディレクトリのすべてのファイルを追加することによって作成されたCLASSPATHでJavaコマンドを呼び出すシェルスクリプトがあります。
同様の機能を持つ.BATファイルを作成するにはどうすればよいですか? Windowsの世界でUnixコマンドを見つけるのと同等のものは何ですか?
バッチスクリプトでforループを使用したい
@echo off
setLocal EnableDelayedExpansion
set CLASSPATH="
for /R ./lib %%a in (*.jar) do (
set CLASSPATH=!CLASSPATH!;%%a
)
set CLASSPATH=!CLASSPATH!"
echo !CLASSPATH!
これは、ディレクトリ内のすべてのファイルを反復処理するバッチスクリプトを探していたときに本当に役立ちました。ファイルを削除することですが、非常に便利です。
正直に言うと、Jonの答えを使用してください。すべてのファイルが1つのディレクトリにある場合、はるかに優れています。
なぜfindを使用するのですか?おそらく、jarファイルに必要なすべてのライブラリを事前に知っているので、なぜそれらを一覧表示しないのでしょうか。
別の方法として、常に-Djava.ext.dirs=lib
を使用して、そのようにすべてをピックアップすることもできます。
6.0以降、Javaはワイルドカードクラスパスをサポートします。
CLASSPATH設定をスクリプトの外部に保持し、/ Vを使用してシェルを開始しなかった場合のバリエーションは、次のようなことができます。
@echo off
FOR /R ./lib %%a in (*.jar) DO CALL :AddToPath %%a
ECHO %CLASSPATH%
GOTO :EOF
:AddToPath
SET CLASSPATH=%1;%CLASSPATH%
GOTO :EOF
コマンドラインで遊んでいるだけで環境を設定するのに便利です。
executable JAR のように聞こえます。メインルーチンに必要なすべてのJARを含むZipを配布し、実際にコマンドシェルで実行する場合、マニフェストで定義されたメインクラスとクラスパスを使用して実行可能JARを作成できます。ユーザーがしなければならないことは、JARとボブの叔父をダブルクリックすることだけです。
SET CLASSPATH=""
FOR /R /lib %%a in (*.jar) DO CALL :AddToPath %%a
echo %CLASSPATH%
Java -cp %CLASSPATH% com.a.b.MyClass
pause
:AddToPath
SET CLASSPATH=%1;%CLASSPATH%
GOTO :EOF
Windows/LinuxのコマンドラインJARをリリースするときに行うことは、ANTコマンドを使用してJAR内にすべてのJARライブラリを埋め込むことです。
<fileset dir="${module.classes.dir}"/>
<zipfileset src="${endorsed.lib.dir}/myLibrary.jar"/>
このようにして、ライブラリはクラスファイルと一緒に溶けます。
バイナリ再利用性の最良の方法ではありませんが、ライブラリがそれほど重くない場合は、OSでJava -jar myApp.jarを呼び出すだけでアプリケーションを実行できます。
移植性を高めるためのオプションは、バッチファイル自体の場所を基準にしてクラスパスを設定することです。
Windowsの場合(Java 6 +、。/ binのクラス、。/ libのjar)を想定):
@Java -classpath %~dp0/bin;%~dp0/lib/* ClassName %1
Mavenを使用してプロジェクトをビルドする場合、少し異なる方法を使用できます。 Application Assembler Mavenプラグインは、Javaアプリランチャーを作成することを目的としています。このプラグインは、batファイルランチャーを生成し、指定されたフォルダーに依存関係を配置します。 \悪魔。
このプラグインは、プロジェクトのCM部分をDRYに保つのに役立ちます。
これを行う簡単な方法はありますか?
はい;
バージョン6以降、クラスパスのワイルドカードを使用できます。
javac -cp .;../lib/* yourJavaCodeDir/YourJavaFile.Java
こちらもご覧ください Q&A。