猿问

带有 Maven jar 的 docker

我正在 docker 容器中运行 Maven 项目,出现 Could not find or load main class 错误。


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


翻过高山走不出你
浏览 103回答 1
1回答

jeck猫

这不是 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.Customercom.company.customers.Customer注意Linux和Java都是区分大小写的。在此基础上,类名必须准确无误Customer,所有文件夹名称必须小写。希望能帮助到你。
随时随地看视频慕课网APP

相关分类

Java
我要回答