我尝试使用docker-compose
,docker
构建了一个演示的Spring项目,并在docker
上运行。但是创建了jar文件,并在ClassNotFoundException
命令从Dockerfile
中触发时抛出Dockerfile
。
docker-compose run
来构建和运行。StackOverflow
的解决方案,但没有解决问题。我的docker-compose
文件:
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
文件:
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
<?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
我哪里做错了?谢谢!
发布于 2022-02-20 05:26:48
我想你错过了使用插件。pluginManagement不会真正激活插件,但它只是为了让maven子模块可以使用插件。基本上,pluginManagement只是声明这个插件可以使用。
请参阅:Difference between and tag in Maven pom.xml
您仍然应该在下面使用这个插件:
<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中声明的那样。试试看。先试着在没有码头的情况下运行独立的罐子。
https://stackoverflow.com/questions/71190395
复制相似问题