【问题标题】:Error when running docker container "NoClassDefFoundError"运行 docker 容器“NoClassDefFoundError”时出错
【发布时间】:2020-08-16 07:46:11
【问题描述】:

我正在尝试使用 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);
  }
}

【问题讨论】:

  • error is ` at de.elbdev.backend.Application.main(Application.java:10)` 所以它确实找到了类。缺少依赖项
  • 如何构建 Dockerfile?你用com.spotify::dockerfile-maven-plugin插件吗?
  • @Nikolas 这是我根文件夹中的一个文件,我“自己”写的。我没有使用 dockerfile-maven-plugin。 emrhzc:好的,但是我该如何解决呢?我认为这就是我安装 maven-dependency-plugin 的原因。

标签: java spring-boot docker maven


【解决方案1】:

在你的 pom.xml 中,copy-dependencies 目标是在install 阶段指定的:jar 的包已经完成了,太晚了。

我正在尝试对一个简单的 Spring Boot 应用程序进行 docker 化,该应用程序是用 马文。

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

重新打包现有的 JAR 和 WAR 档案,以便它们可以执行 从命令行使用 java -jar

只需删除这些插件声明并执行mvn clean package,应该就可以了。

旁注:

FROM openjdk:最新

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

【讨论】:

  • 我在 Spring Boot (parent) 2.3.7.RELEASE 中遇到了同样的问题。我删除了 OP 提到的完全相同的插件,运行 mvn clean package 但现在我又回到了 no main manifest attribute, in /app.jar 错误。考虑我的 Dockerfile 也等于 OP。
【解决方案2】:

我和你有同样的问题。

您需要在 pom.xml 中添加插件。


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

如上输入则正常。

并检查 MANIFEST.MF(在 .jar 文件中)

Main-Class: org.springframework.boot.loader.JarLauncher   
Start-Class: {your main class}

【讨论】:

    猜你喜欢
    • 2019-12-04
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多