![](/img/trans.png)
[英]Class not found in Runtime in Eclipse while Maven Dependency already included
[英]dependency not found at runtime maven
我是 maven 的新手,對 java 有點陌生。 嘗試了谷歌和相關資源,但我沒有找到與我的情況相似的資源。
現在,我有 maven 項目X
和Y
。 X
可以看作是一個帶有一些實用程序的共享庫, Y
是一個簡單的JFrame
打印"hello world"
並調用X
中的 static 方法。
我在項目X
上執行“以maven install
運行”,得到"build successful"
。 我在項目Y
中添加項目X
作為依賴項(使用 Eclipse 中的 pom 編輯器,瀏覽存儲庫並找到它)。 我在項目Y
上執行“以maven package
運行”,我得到"build successful"
。 通過java -jar
運行項目Y
或檢查生成的 jar 后,項目X
到處都丟失了,我得到了一個奇特的 class 未發現異常。 Eclipse 找到它並且在源代碼編輯器中沒有編譯錯誤。
為什么它只在 Eclipse 編輯器中工作,而不是在 jar 中工作?
聚甲醛:
<dependency>
<groupId>com.company.deployment.shared</groupId>
<artifactId>com.company.deployment.shared</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
Maven 不會為您生成組合的 JAR 文件。 Eclipse 正在做的是查看 Maven 配置並在運行時將所有必需的類 / jars 添加到您的類路徑中。
如果要從命令行運行程序,則需要手動將所有 JARs 添加到類路徑中。
或者,您可以 直接從 Maven運行您的程序,這應該設置您的所有依賴項。 有許多選項取決於您想要做什么,即如果它是一個旨在由最終用戶運行的應用程序,您可以查看一個罐子 Maven 插件。
我建議你看看Maven 陰影插件。 這會生成一個包含您的項目及其所有依賴項的“uber-jar”。 它還可以執行其他操作,例如設置入口點 class 以使您的 JAR 文件成為可執行的 JAR。
您可能還會發現exec-maven-plugin很有幫助
mvn exec:java -Dexec.mainClass="com.example.Main" [-Dexec.args="argument1"] ...
mvn exec:exec -Dexec.executable="maven" [-Dexec.workingdir="/tmp"] -Dexec.args="-X myproject:dist"
如果您的客戶端無法從 maven m2 repo 像在防火牆后或沒有互聯網連接一樣即時下載依賴項,那么您還需要 package 使用maven-dependency-plugin復制所有依賴項和maven-assembly-plugin以組裝依賴項的依賴項
Phil Sacre 已經很好地解釋了基本問題(基本上沒有關於在哪里可以找到嵌入在您的 Y.jar 中的 X.jar 的信息)。
此外,您還可以查看appassembler-maven-plugin (例如,它可以為您的 Y 項目生成啟動腳本,該腳本已經設置了正確的類路徑)和/或exec-maven-plugin (例如,您可以使用它直接啟動 Y使用 maven 使用正確的類路徑)。
它不起作用,因為 Maven 在構建項目時解決了依賴關系,但不會將所有依賴關系神奇地放在 jar 中。 您應該在類路徑中運行您的應用程序及其所有依賴項:
java -classpath X.jar;Y.jar com.foo.bar.Main
或者您必須自定義 maven jar 插件才能創建可執行的 jar 插件,如此處所述。 您也可以使用 maven 程序集插件將所有 Y 項目的依賴項復制到目標目錄,在生成的 Y.jar 旁邊。
項目 Y 中生成的工件僅包含項目 Y 中的構建結果,不包括其依賴項。
如果你想在Y中構建一個JAR,你可以直接執行,你可以考慮使用匯編插件。
例如,為項目 Y 構建 uber-jar 的最簡單方法:
<project>
...
<build>
...
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-all-in-one-jar</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
...
</project>
除了正常的工件外,還將創建一個包含依賴項的類等的程序集,適合由 java -jar 執行
訪問http://maven.apache.org/plugins/maven-assembly-plugin/了解更復雜的用法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.