docker with maven jar



我正在docker容器中运行一个maven项目,我得到了找不到或加载主类错误。

FROM maven:3.6.0-jdk-11-slim AS build
COPY src src
COPY pom.xml .
RUN mvn -f pom.xml clean package install
FROM openjdk:8-jre
COPY --from=build /target /opt/target
WORKDIR /target
RUN ls
CMD ["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

这不是Docker问题,而是Java问题。有几种方法可以定义类路径条目来运行可执行jar。

阴影或优步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>

正如您所看到的,通配符(*(字符和多个类路径元素都允许用:分隔所以

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

Docker

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

MANIFEST方法中的类路径

在您将所有这些依赖工件收集到一个文件夹中后,只需在META-INF/MANIFEST中添加一个Class-Path条目。MF文件如下:

Class-Path: . lib/*

并运行

java -jar Customer.jar

或Docker

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

其中哪一个是最好的取决于很多事情,你必须做出选择。

编辑:

根据更新的问题,uber jar似乎是由汇编插件使用带有依赖项预定义描述符的jar创建的。这将创建另一个jar文件,放在目标(输出(文件夹下,其名称以-jar-with-dependencies.jar结尾

  1. 使用基本工件的jar插件
  2. 进行双重检查以确保所有<mainClass>条目都指向一个现有类。你在同一个问题中提到了三个不同的主课。
    • com.companyname.Customer

    • com.mycompany.Customer

    • com.company.customers.Customer

  3. 注意Linux和Java都是区分大小写的。在此基础上,类名必须完全为Customer,并且所有文件夹名称都必须小写

希望能有所帮助。

最新更新