web-dev-qa-db-ja.com

コマンドプロンプトから複数のクラスパスライブラリを使用してjarファイルを実行する

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個のライブラリがあり、将来のリリースで成長する可能性があるため、これを行いたくありません。これを行うためのより良い方法はありますか?

53
Praneeth

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

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

15
khmarbaise

UNIXでJava 1.7を使用する-

Java -cp myjar.jar:lib/*:. mypackage.MyClass

Windowsでは、「;」を使用する必要がありますの代わりに ':' -

Java -cp myjar.jar;lib/*;. mypackage.MyClass
50
jamp

OSに関係なく、以下のコマンドが機能するはずです。

Java -cp "MyJar.jar;lib/*" com.mainClass

常に引用符を使用し、lib/*。jarが機能しないことに注意してください。

4
Hari

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>
3
lbsweek

可能な解決策は

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

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

その後、jarを実行します

source バッチファイルのループ用 ループに関する情報用

2
Mukul Goel

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

最も簡単な方法は、おそらく execプラグイン です。

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

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

1
Dave Newton

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

1
fjxx