如何docker构建带有模块的maven项目?

问题描述 投票:0回答:1

我有一个带有模块的 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 而不是像应该做的那样复制父模块。如何解决这个问题?

docker
1个回答
0
投票

我找到了解决方法

我在 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>
© www.soinside.com 2019 - 2024. All rights reserved.