簡體   English   中英

從命令提示符執行具有多個類路徑庫的jar文件

[英]Execute jar file with multiple classpath libraries from command prompt

我有一個Maven項目,該項目生成一個jar文件並將所有依賴項復制到target/lib文件夾。 我想在客戶端計算機(Windows)上執行該項目。 因此,我將myproject.jar復制到C:\\xyz文件夾,並將所有依賴項復制到C:\\xyz\\lib文件夾。 如何從客戶端的命令提示符下執行此項目? 我試圖從C:\\xyz文件夾中使用java -cp lib\\*.jar -jar myproject.jar ,但它引發以下錯誤。

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.

我想如果我在classpath中指定所有依賴項(例如java -cp lib\\dep1.jar;dep2.jar ),它將擺脫此問題,但由於已有40個庫,所以我不想這樣做在將來的版本中增長。 有一個更好的方法嗎?

您不能在命令行上同時使用-jar-cp請參閱說明使用-jar 的Java文檔

JAR文件是所有用戶類的源,而其他用戶類路徑設置將被忽略。

您可以執行以下操作:

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

注意;. -cp參數中,以解決Java命令行錯誤。 另外,請注意,這是命令的Windows版本。 Unix上的路徑分隔符是:

在UNIX上使用Java 1.7-

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

在Windows上,您需要使用';' 代替 ':' -

java -cp myjar.jar;lib/*;. mypackage.MyClass

讓maven生成一個批處理文件以啟動您的應用程序。 這是最簡單的方法。

您可以將appassembler-maven-plugin用於此類目的。

無論使用哪種操作系統,以下命令均應起作用:

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

始終使用引號,並請注意lib / *。jar將不起作用。

您可以使用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>

一個可能的解決方案可能是

創建一個批處理文件

在lib目錄中對其中的所有文件進行循環,並在classpath上將每個文件都設置在lib旁

然后運行罐子

批處理文件中循環的以獲取循環信息

有幾種選擇。

最簡單的可能是exec插件

您還可以使用Assembly插件生成一個包含所有依賴項的jar。

最后,您可以使用dependency:classpath目標生成一個包含類路徑的文件。

我遇到了同樣的問題,但是能夠使用Maven Shade插件將所有依賴項打包到我的jar文件中

這將無法使用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放入JRE的ext目錄。 如果您使用的是獨立JRE,則可以。 如果您使用同一JRE來運行多個應用程序,則不建議這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM