1 回答
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
使用该罐子代替基本工件。
仔细检查以确保所有
<mainClass>
条目都指向现有的类。您在同一问题中提到了三个不同的主类。
com.公司名称.客户
com.mycompany.Customer
com.company.customers.Customer
注意Linux和Java都是区分大小写的。在此基础上,类名必须准确无误Customer
,所有文件夹名称必须小写。
希望能帮助到你。
添加回答
举报