亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

帶有 Maven jar 的 docker

帶有 Maven jar 的 docker

翻過高山走不出你 2024-01-25 15:13:44
我正在 docker 容器中運行 Maven 項目,出現 Could not find or load main class 錯誤。FROM maven:3.6.0-jdk-11-slim AS buildCOPY src srcCOPY pom.xml .RUN mvn -f pom.xml clean package installFROM openjdk:8-jreCOPY --from=build /target /opt/targetWORKDIR /targetRUN lsCMD ["java", "-jar", "Customer.jar"]上面的程序集是使用以下插件創建的<build><plugin>    <artifactId>maven-assembly-plugin</artifactId>    <configuration>        <archive>            <manifest>                <mainClass>com.companyname.Customer</mainClass>            </manifest>        </archive>        <descriptorRefs>            <descriptorRef>jar-with-dependencies</descriptorRef>        </descriptorRefs>    </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>錯誤錯誤:無法找到或加載主類 com.mycompany.Customer問題:如何在 docker 中設置 jar 文件的類路徑?編輯我測試了以下但相同的問題。CMD ["java", "-cp", "Customer.jar:libs/*", "com.company.customers.Customer"]錯誤:無法找到或加載主類 com.company.customers.Customer
查看完整描述

1 回答

?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

這不是 Docker 問題,而是 Java 問題。有多種方法可以定義類路徑條目來運行可執行 jar。

陰影或 Uber jar 方法

在這種情況下,您應該創建一個陰影 jar,其中包含一個可執行 jar 文件中的所有依賴類。Maven 有一個名為Apache Maven Shade Plugin 的插件來創建 uber-jar 工件。

最后運行:

java?-jar?shaded-artifact.jar

或者在 Docker 中

CMD?["java",?"-jar",?"shaded-artifact.jar"]

命令行類路徑方法

如果創建的 jar 工件需要存在其他(依賴的)jar,則您必須指定類路徑。在這種情況下,將所有必需的 jar 復制到文件夾(例如lib)中并使用以下命令:

java?-cp?'<name-of-jar.jar>:<path-of-dependencies>'?<fully.quialified.main.ClassName>

正如您所看到的,通配符 (*) 字符和多個類路徑元素允許用:?so分隔

java?-cp?'Customer.jar:libs/*'?com.mycompany.Customer

在 Docker 中

CMD?["java",?"-cp",?"Customer.jar:libs/*",?"com.mycompany.Customer"]

MANIFEST 方法中的類路徑

將所有這些依賴工件收集到一個文件夾后,您只需在META-INF/MANIFEST.MFClass-Path文件中添加一個條目,如下所示:

Class-Path:?.?lib/*

并運行

java?-jar?Customer.jar

或者在 Docker 中

CMD?["java",?"-jar",?"Customer.jar"]

其中哪一個最好取決于很多因素,你必須做出選擇。

編輯:

根據更新的問題, uber jar 似乎是由程序集插件使用jar-with-dependencies預定義描述符創建的。這將創建另一個 jar 文件,該文件放置在目標(輸出)文件夾下,其名稱以-jar-with-dependencies.jar

  1. 使用該罐子代替基本工件。

  2. 仔細檢查以確保所有<mainClass>條目都指向現有的類。您在同一問題中提到了三個不同的主類。

  • com.公司名稱.客戶

  • com.mycompany.Customer

  • com.company.customers.Customer

注意Linux和Java都是區分大小寫的。在此基礎上,類名必須準確無誤Customer,所有文件夾名稱必須小寫。

希望能幫助到你。


查看完整回答
反對 回復 2024-01-25
  • 1 回答
  • 0 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號