java - 运行docker容器 "NoClassDefFoundError"时出错

标签 java spring-boot docker maven

我正在尝试使用 Maven 构建一个简单的 Spring Boot 应用程序。

Dockerfile:

FROM openjdk:latest
COPY target/backend-1.0-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]

当我在没有容器( java -jar target/backend-1.0-SNAPSHOT.jar )的情况下运行 .jar 时,一切正常并且应用程序正在运行。

现在我用 docker build -t company/backend . 创建容器

但是当我尝试使用 docker run -p 8080:8080 company/backend 运行 docker 容器时出现以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication
        at de.company.backend.Application.main(Application.java:10)
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 1 more

docker 似乎没有找到主类,即使它是在我的 pom.xml 中定义的:
<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <mainClass>de.elbdev.backend.Application</mainClass>
</properties>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <phase>install</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>${mainClass}</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

主类:
package de.company.backend;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

最佳答案

在您的 pom.xml 中,copy-dependencies目标在 install 中指定阶段: jar 的包装已经完成为时已晚。

I am trying to dockerize a simple Spring Boot Application, built with Maven.



您不需要声明任何插件来创建一个可以由 docker 容器运行的带有 spring boot 的胖 jar。
the repackage goal of the spring boot maven plugin 声明这些插件很容易出错(并且应该只在极端情况下使用)默认情况下,附加到 maven 的 package 阶段将为您创建 fat jar:

Repackages existing JAR and WAR archives so that they can be executed from the command line using java -jar



Juste 删除这些插件声明并执行 mvn clean package它应该是好的。

边注 :

FROM openjdk:latest



不要使用 latest作为图像版本,但支持图像的特定版本,否则您可能会感到意外。使用 JDK 8 时,您可以指定 JRE 或 JDK 8,例如:FROM openjdk:8-jre-alpine .

关于java - 运行docker容器 "NoClassDefFoundError"时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61548934/

相关文章:

java - Spring Integration FileReadingMessageSource 使用 UseWatchService

docker - 如何在 Docker 容器和主机系统之间共享 Assets (图片、文本文档等)?

java - Hbase不允许使用JAVA API填充数据

java - 使用 TFramedTransport 时出现 TTransportException

reactjs - React原生上传图片 Spring boot

docker - docker引擎版本低于最低错误

azure - 如何从Azure容器实例中的容器连接到Azure中VM的内部IP

java - Windows - 创建文件时收到警告

java - 使用检测文件运行 Jetty (cobertura)

java - 无法运行具有特定配置文件的 Spring Boot JAR 文件