60

jar ファイルを生成し、すべての依存関係をtarget/libフォルダーにコピーする Maven プロジェクトがあります。このプロジェクトをクライアントのマシン (Windows) で実行したい。そのため、フォルダーにコピーmyproject.jarC:\xyz、すべての依存関係をフォルダーにコピーしましたC:\xyz\lib。クライアントのコマンド プロンプトからこのプロジェクトを実行するにはどうすればよいですか? java -cp lib\*.jar -jar myproject.jarフォルダから使用しようとしましC:\xyzたが、次のエラーがスローされます。

Exception in thread "main" java.lang.NoClassDefFoundError: lib\commons-codec-1/3/jar
Caused by: java.lang.ClassNotFoundException: lib\commons-codec-1.3.jar
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: lib\commons-codec-1.3.jar.  Program will exit.

クラスパスですべての依存関係を指定すると (のようにjava -cp lib\dep1.jar;dep2.jar)、問題は解決すると思いますが、既に 40 のライブラリがあり、将来のリリースで大きくなる可能性があるため、これを行いたくありません。これを行うより良い方法はありますか?

4

9 に答える 9

75

コマンド ラインで-jarとの両方を使用することはできませ-cp-jar

JAR ファイルはすべてのユーザー クラスのソースであり、他のユーザー クラス パス設定は無視されます。

次のようなことができます。

java -cp lib\*.jar;. myproject.MainClass

Java コマンドラインのバグを回避するに;.は、引数の に注意してください。-cpまた、これはコマンドの Windows バージョンであることに注意してください。Unix のパス区切り文字は:.

于 2012-10-22T19:18:11.097 に答える
15

mavenにバッチファイルを生成させて、アプリケーションを起動します。これが最も簡単な方法です。

このような目的でappassembler-maven-pluginを使用できます。

于 2012-10-22T19:21:41.757 に答える
3

maven-assembly-plugin を使用できます。公式サイトの例は次のとおりです: https://maven.apache.org/plugins/maven-assembly-plugin/usage.html

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.5.1</version>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <archive>
                <manifest>
                    <mainClass>your main class</mainClass>
                </manifest>
            </archive>
        </configuration>
        <executions>
            <execution>
                <id>make-assembly</id> <!-- this is used for inheritance merges -->
                <phase>package</phase> <!-- bind to the packaging phase -->
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
于 2016-04-29T20:18:35.370 に答える
2

可能な解決策は

バッチファイルを作成する

libディレクトリ内のすべてのファイルに対してループを実行し、クラスパスのlibの下に各ファイルを設定します

その後、jarを実行します

ループに関する情報のバッチ ファイル内のループのソース

于 2012-10-22T19:17:46.057 に答える
1

私は同じ問題に直面していましたが、 Maven Shade Pluginを使用してすべての依存関係を jar ファイルにパッケージ化することができました

于 2013-04-17T14:29:45.880 に答える
1

いくつかのオプションがあります。

最も簡単なのはおそらくexec pluginです。

アセンブリ プラグインを使用して、すべての依存関係を含む jar を生成することもできます。

dependency:classpath最後に、ゴールを使用してクラスパスを含むファイルを生成できます。

于 2012-10-22T19:14:00.113 に答える
-2

これは機能しませんjava -cp lib\*.jar -jar myproject.jar。瓶ごとに入れなければなりません。

の場合ですcommons-codec-1.3.jar

java -cp lib/commons-codec-1.3.jar;lib/next_jar.jar等々。

他の解決策は、すべての jar をextJRE のディレクトリに配置することです。スタンドアロンの JRE を使用している場合は、これで問題ありません。複数のアプリケーションを実行するために同じ JRE を使用している場合は、お勧めしません。

于 2012-10-22T19:13:24.333 に答える