首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Docker spring-boot-maven-plugin java jar ClassNotFoundException

Docker spring-boot-maven-plugin java jar ClassNotFoundException
EN

Stack Overflow用户
提问于 2022-02-20 00:31:48
回答 1查看 623关注 0票数 0

我尝试使用docker-composedocker构建了一个演示的Spring项目,并在docker上运行。但是创建了jar文件,并在ClassNotFoundException命令从Dockerfile中触发时抛出Dockerfile

  • I确实使用了docker-compose run来构建和运行。
  • 我尝试了许多StackOverflow的解决方案,但没有解决问题。

我的docker-compose文件:

代码语言:javascript
运行
复制
version: '3.5'
services:
  demo-service:
    container_name: demo-service
    build:
      context: ./demo
      dockerfile: dockerfile.demoservice.mvn
    ports:
      - "9091:9091"
    # depends_on:
    #   - demo-service-db

Dockerfile文件:

代码语言:javascript
运行
复制
FROM maven:3.6.3-jdk-11-slim AS build

RUN mkdir /home/app
COPY ./pom.xml /home/app/pom.xml
COPY src /home/app
RUN mvn -f /home/app/pom.xml clean package spring-boot:repackage
RUN ls /home/app/target

# Package stage
FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/demo-0.0.1-SNAPSHOT.jar /usr/local/lib/demo.jar
EXPOSE 9091
CMD [ "java", "-jar", "/usr/local/lib/demo.jar"]

pom.xml

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
        <!-- The main class to start by executing "java -jar" -->
        <!-- If I remove this, java -jar will be thrown no main manifest attribute (maven) -->
        <start-class>com.example.demo.DemoApplication</start-class>
    </properties>
...
...
...
    <build>
<!-- Didn't solve the problem: no main manifest attribute-->
      <pluginManagement>
        <plugins>
            <plugin>
        <groupId>org.springframework.boot</groupId>
<!-- Didn't solve the problem: no main manifest attribute-->
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>${project.parent.version}</version>
        <executions>
            <execution>
                <goals>
                <goal>repackage</goal>
                </goals>
                <configuration>
                    <classifier>spring-boot</classifier>
                                <manifest>
              <addClasspath>true</addClasspath>
              <!-- Didn't solve the problem: no main manifest attribute-->
<mainClass>com.example.demo.DemoApplication</mainClass>
            </manifest>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                    <!-- Unable to find main class-->
                    <!-- <skip>true</skip> -->
                    </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
      </pluginManagement>
    </build>

项目结构是初始化的,没有改变任何东西。(java/com/example/demo/DemoApplication.java的主要功能)

错误消息是:Exception in thread "main" java.lang.ClassNotFoundException: com.example.demo.DemoApplication

2.6.3

  • maven:3.6.3-jdk-11-slim

  • openjdk:11-jre-slim

  • Java版本11;
  • Spring引导版本

我哪里做错了?谢谢!

EN

Stack Overflow用户

发布于 2022-02-20 05:26:48

我想你错过了使用插件。pluginManagement不会真正激活插件,但它只是为了让maven子模块可以使用插件。基本上,pluginManagement只是声明这个插件可以使用。

请参阅:Difference between and tag in Maven pom.xml

您仍然应该在下面使用这个插件:

代码语言:javascript
运行
复制
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.example.demo.DemoApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

您可以从上面的插件中删除执行标记,就像您在pluginManagement中声明的那样。试试看。先试着在没有码头的情况下运行独立的罐子。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71190395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档