文档文件:

FROM maven:latest

COPY . /usr/src/myapp

WORKDIR /usr/src/myapp

RUN mvn compile && mvn clean install

EXPOSE 8000/tcp

CMD ["mvn", "exec:java", "-Dexec.mainClass='com.demo.App'", "-e"]

生成后执行docker run -it --rm <image>,项目开始生成但失败:

[INFO] Error stacktraces are turned on.
[INFO] Scanning for projects...
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-deploy-plugin/2.8.2/maven-deploy-plugin-2.8.2.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-deploy-plugin/2.8.2/maven-deploy-plugin-2.8.2.pom (7.1 kB at 12 kB/s)
...
WARNING]
java.lang.ClassNotFoundException: 'com.demo.App'
    at org.codehaus.mojo.exec.URLClassLoaderBuilder$ExecJavaClassLoader.loadClass (URLClassLoaderBuilder.java:198)
    at java.lang.ClassLoader.loadClass (ClassLoader.java:520)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run (ExecJavaMojo.java:271)
    at java.lang.Thread.run (Thread.java:833)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  5.898 s
[INFO] Finished at: 2023-04-11T09:41:54Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.1.0:java (default-cli) on project javasnippet: An exception occurred while executing the Java class. 'com.demo.App' -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.1.0:java (default-cli) on project javasnippet: An exception occurred while executing the Java class. 'com.demo.App'
...
Caused by: java.lang.ClassNotFoundException: 'com.demo.App'
...

然后我在Dockerfile中注释掉CMD ["mvn", "exec:java", "-Dexec.mainClass='com.demo.App'", "-e"],这给了我:

FROM maven:latest

COPY . /usr/src/myapp

WORKDIR /usr/src/myapp

RUN mvn compile && mvn clean install

EXPOSE 8000/tcp

# CMD ["mvn", "exec:java", "-Dexec.mainClass='com.demo.App'", "-e"]

构建并再次运行docker run -it --rm <image> bash,进入容器:

root@c9ed5282e511:/usr/src/myapp# ls
Dockerfile  pom.xml  src  target

然后我执行mvn exec:java -Dexec.mainClass='com.demo.App' -e开始这个项目,它起作用了:

root@c9ed5282e511:/usr/src/myapp# mvn exec:java -Dexec.mainClass='com.demo.App' -e
[INFO] Error stacktraces are turned on.
[INFO] Scanning for projects...
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-deploy-plugin/2.8.2/maven-deploy-plugin-2.8.2.pom
...
Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-exec/1.3/commons-exec-1.3.jar (54 kB at 1.0 MB/s)
Server started at: Tue Apr 11 09:49:15 UTC 2023

请告诉我为什么会这样,我哪里做错了.

如果需要任何源代码,请让我知道.

推荐答案

您需要删除JSON-ARRAY-SYNTAX CMD行中的单引号

CMD ["mvn", "exec:java", "-Dexec.mainClass=com.demo.App", "-e"]
#                                          ^          ^ no single quotes

当您通过一个shell 运行它时,shell 解析器会看到单引号的字符串,忽略其中任何标点符号的特殊含义,并删除单引号.在Docker exec-form命令中,这些处理都不会发生;only转义是使该命令成为有效JSON数组所必需的.

这意味着在原始形式中,单引号被传递给实际的命令.您可以在最后一个异常中看到这一点,在该异常中,Maven试图将字符串(仍然包括单引号)解释为Java类名.

Java相关问答推荐

在Java中使用带限制的回归打印星形三角形

Java -使用空比较或instanceof?

Collections.binarySearch()使用Collections.reverseOrder()作为比较器返回-1

Java JAR环境(JRE)是否支持模块?

如何在Javascript中设置文本区域圆角的样式

缩小画布比例后更改滚动窗格的内部大小

SpringBoot+Java 17@Valid未验证POJO

无法初始化JPA实体管理器工厂:无法确定为Java类型<;类>;推荐的JdbcType

无法了解Java线程所消耗的时间

安装Java Jar应用程序的Install4j遇到ClassNotFoundException的运行时错误

如何修复PDF重建过程中的文本定位

我如何解释这个错误?必需类型:供应商R,提供:收集器对象,捕获?,java.util.List java.lang.Object>>

使用存储在字符串变量中的路径目录打开.pdf文件

从映射列表中检索所有键

try 在两个不同数组的数字之间求平均值

如何在IntelliJ IDEA的Build.sbt中添加外部JAR文件?

判断重复的两个二维表算法?

在实例化中指定泛型类型与不指定泛型类型之间的区别

在具有Quarkus Panache的PostgreSQL中将JSON数据存储为JSONB时,会将其存储为转义字符串

为什么Instant没有从UTC转换为PostgreSQL的时区?