我有一个带有模块的 Maven 项目,我的目的是为一个模块提供一个 docker 文件。所以我所做的是:
我的模块的 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>pt.com.daniel</groupId>
<artifactId>kafka-example</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>producer</artifactId>
<properties>
<maven.compiler.source>22</maven.compiler.source>
<maven.compiler.target>22</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
父级的 pom.xml
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>pt.com.daniel</groupId>
<artifactId>kafka-example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>producer</module>
<module>consumer</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.4</version>
</parent>
<properties>
<maven.compiler.target>21</maven.compiler.target>
<maven.compiler.source>21</maven.compiler.source>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.2.4</version>
</plugin>
</plugins>
</build>
</project>
模块根目录下的 Docker 文件
FROM openjdk:22
LABEL authors="daniel castro"
ARG MAVEN_VERSION=3.9.6
ARG USER_HOME_DIR="/root"
ARG SHA=706f01b20dec0305a822ab614d51f32b07ee11d0218175e55450242e49d2156386483b506b3a4e8a03ac8611bae96395fd5eec15f50d3013d5deed6d1ee18224
ARG BASE_URL=https://apache.osuosl.org/maven/maven-3/${MAVEN_VERSION}/binaries
RUN mkdir -p /usr/share/maven /usr/share/maven/ref \
&& curl -fsSL -o /tmp/apache-maven.tar.gz ${BASE_URL}/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
&& echo "${SHA} /tmp/apache-maven.tar.gz" | sha512sum -c - \
&& tar -xzf /tmp/apache-maven.tar.gz -C /usr/share/maven --strip-components=1 \
&& rm -f /tmp/apache-maven.tar.gz \
&& ln -s /usr/share/maven/bin/mvn /usr/bin/mvn
ENV MAVEN_HOME /usr/share/maven
ENV MAVEN_CONFIG "$USER_HOME_DIR/.m2"
CMD ["mvn"]
COPY ../pom.xml /usr/src/myapp/parent-pom.xml
# cd /opt/app
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN ls -la /usr/src/myapp/
RUN ls -la /usr/src/myapp/parent-pom.xml
# Adjusting the module's pom.xml to reference the new parent-pom.xml
RUN sed -i 's/<relativePath>..\/pom.xml<\/relativePath>/<relativePath>.\/parent-pom.xml<\/relativePath>/' /usr/src/myapp/pom.xml
RUN cat /usr/src/myapp/pom.xml
RUN mvn clean install
# Refer to Maven build -> finalName
ARG JAR_FILE=target/producer-1.0-SNAPSHOT.jar.original
# cp target/spring-boot-web.jar /opt/app/app.jar
RUN cp ${JAR_FILE} /usr/src/myapp/app.jar
# java -jar /opt/app/app.jar
ENTRYPOINT ["java","-jar","app.jar"]
当我执行
C:\Users\dfcas\IdeaProjects\kafka-example\producer>docker build -t producer:1.0 .
时
我正在模块的文件夹中运行。
我收到错误,但我可以检查我的 docker 桌面日志
1.800 [INFO] Scanning for projects...
1.831 [ERROR] [ERROR] Some problems were encountered while processing the POMs:
1.831 [WARNING] 'parent.relativePath' of POM pt.com.daniel:producer:1.0-SNAPSHOT (/usr/src/myapp/pom.xml) points at pt.com.daniel:producer instead of pt.com.daniel:kafka-example, please verify your project structure @ line 6, column 13
1.831 [FATAL] Non-resolvable parent POM for pt.com.daniel:producer:1.0-SNAPSHOT: The following artifacts could not be resolved: pt.com.daniel:kafka-example:pom:1.0-SNAPSHOT (absent): Could not find artifact pt.com.daniel:kafka-example:pom:1.0-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 6, column 13
1.831 @
1.832 [ERROR] The build could not read 1 project -> [Help 1]
1.832 [ERROR]
1.832 [ERROR] The project pt.com.daniel:producer:1.0-SNAPSHOT (/usr/src/myapp/pom.xml) has 1 error
1.833 [ERROR] Non-resolvable parent POM for pt.com.daniel:producer:1.0-SNAPSHOT: The following artifacts could not be resolved: pt.com.daniel:kafka-example:pom:1.0-SNAPSHOT (absent): Could not find artifact pt.com.daniel:kafka-example:pom:1.0-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 6, column 13 -> [Help 2]
1.833 [ERROR]
1.834 [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
1.834 [ERROR] Re-run Maven using the -X switch to enable full debug logging.
1.834 [ERROR]
1.835 [ERROR] For more information about the errors and possible solutions, please read the following articles:
1.835 [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
1.835 [ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException
------
Dockerfile:29
--------------------
27 | RUN cat /usr/src/myapp/pom.xml
28 |
29 | >>> RUN mvn clean install
30 | # Refer to Maven build -> finalName
31 | ARG JAR_FILE=target/producer-1.0-SNAPSHOT.jar.original
--------------------
ERROR: failed to solve: process "/bin/sh -c mvn clean install" did not complete successfully: exit code: 1
View build details: docker-desktop://dashboard/build/default/default/re7i6ev3viyxbozsh5daja4qn
如上所述,sed 命令生成我的模块的 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>pt.com.daniel</groupId>
<artifactId>kafka-example</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>./parent-pom.xml</relativePath>
</parent>
<artifactId>producer</artifactId>
<properties>
<maven.compiler.source>22</maven.compiler.source>
<maven.compiler.target>22</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
这是因为命令 COPY ../pom.xml /usr/src/myapp/parent-pom.xml 正在复制模块 pom.xml 而不是像应该做的那样复制父模块。如何解决这个问题?
我找到了解决方法
我在 pom.xml 上添加了一个插件,将其自身复制到每个模块并重命名。这发生在 docker 构建之前
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>pt.com.daniel</groupId>
<artifactId>kafka-example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>producer</module>
<module>consumer</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.4</version>
</parent>
<properties>
<maven.compiler.target>21</maven.compiler.target>
<maven.compiler.source>21</maven.compiler.source>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.2.4</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>copy-parent-pom</id>
<phase>initialize</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<type>pom</type>
<overWrite>false</overWrite>
<outputDirectory>${project.basedir}/producer</outputDirectory>
<destFileName>parent-pom.xml</destFileName>
</artifactItem>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<type>pom</type>
<overWrite>false</overWrite>
<outputDirectory>${project.basedir}/consumer</outputDirectory>
<destFileName>parent-pom.xml</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>