为了账号安全,请及时绑定邮箱和手机立即绑定

带有 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 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信