3

私が働いている場所には、必要なすべてのライブラリと設定を使用して任意の Java クラスを実行できるシェル スクリプトがあります。

#!/bin/sh
$JAVA_HOME/bin/java -cp LONG_LIST_OF_JARS -Xmx6g -XX:MaxPermSize=128m "$@"

そして次のように使用されます:

javacorp.sh com.mycorp.SomeJob

javaこれは、すべての引数を毎回明示的に指定する必要があるよりは明らかに優れていますが、コードベースをコンパイルするために Eclipse プロジェクトで構成された jar に手動で接続するだけで済むのは好きではありません。私は個人的なプロジェクトに取り組んでおり、同様にコマンドラインから任意のクラスを実行できるようになり、一貫したjava環境を提供する最善の方法を特定しようとしています。

現在、Eclipse を使用してアプリケーションを実行していますが、コマンド ラインから直接、または Eclipse がインストールされていないマシンで実行できるようにしたいと考えています。特に、実行できるクラス/jar の範囲を制限できるようにしたいと考えています。たとえば、ディレクトリjavacorp.sh内のすべてを実行し、クラスパスのディレクトリ内のクラスsrc/のみをjavacorpunit.sh含めます。tests/unit/

  • Ant、Maven、またはその他のビルド ツールを使用してjava、最小限のボイラープレートでコマンド ラインで構成済みのコマンドを実行するクリーンな方法はありますか?
  • .classpathEclipse が作成するファイルにフックする方法はありますか? これで問題が完全に解決されるわけではありませんが (メモリ設定の一貫性など)、既に存在するデータを使用するとよいでしょう。

編集:

私の質問の別の言い方は、「コマンド ラインで Eclipse の簡単な [現在のファイルのメイン メソッドを実行] ボタンを再現する最もクリーンな方法は何ですか?」です。

4

3 に答える 3

2

Ant からシェル スクリプトを生成することを検討しましたか? <pathconvert>タスクは、からクラスパスを作成できます<fileset>

必要なシェル スクリプトの種類ごとに Ant ターゲットを作成できます。makeその後、これらの Ant ターゲットを呼び出して、シェル スクリプトを生成できます。

于 2013-10-18T13:41:11.647 に答える
1

あなたの問題の解決策は、実行可能なjarを作成することだと思います。次のように実行できるもの:

java -jar myapp.jar

「ほら、クラスパスがない」:-)

秘密は、jar のマニフェスト ファイルに "Main-Class" および "Class-Path" エントリを追加することです。これは、何を実行し、どの jar をクラスパスにロードする必要があるかを Java に伝えます。

<jar destfile="${jar.file}" basedir="${classes.dir}">
    <manifest>
        <attribute name="Main-Class" value="${jar.main.class}" />
        <attribute name="Class-Path" value="${jar.classpath}" />
    </manifest>
</jar>

クラスパスの作成を支援するために、ANT には非常に便利なmanifestclasspathタスクがあります。

<manifestclasspath property="jar.classpath" jarfile="${jar.file}">
    <classpath>
        <fileset dir="${dist.dir}/lib" includes="*.jar"/>
    </classpath>
</manifestclasspath>

したがって、この例を使用すると、実行時に Java は依存関係が「lib」サブディレクトリに存在することを期待します (タスクは相対リンクを生成します)。

Eclipse の統合には注意が必要です。クラスパスを管理するためのより良い方法は、Eclipse プラグインを備えたivyなどの依存関係マネージャーを使用することです。このように、ANT と Eclipse はビルドの依存関係を制御するために同じメカニズムを使用します。

最後に、完全に機能する例については、以下をご覧ください。

お役に立てれば。

于 2013-10-19T16:28:18.040 に答える
0

Google のBazelビルド システムを使用すると、ターゲットを使用して、実行可能な Java プログラムを必要な数だけ簡単に定義できますjava_binary。ターゲットはいくつでも定義できjava_binary、それらはすべて同じセット (または重複するセット) のターゲットに依存できるjava_libraryため、各バイナリのクラスパスを手動でキュレートする必要はありません。

さらに、java_binaryターゲットを使用する*_deploy.jarと、どこでも実行できるスタンドアロンの実行可能 Jar であるファイルを生成することもできます。

于 2015-08-17T20:30:19.277 に答える