【问题标题】:Non-resolvable parent POM on Docker BuildDocker Build 上不可解析的父 POM
【发布时间】:2019-12-13 10:17:42
【问题描述】:

我正在尝试从我的 DockerFile 构建 Docker 映像,但不断收到错误消息,例如找不到父级 pom.xml 以在 docker 文件中执行 maven 命令并构建项目。 我一直在环顾四周,您会看到人们所做的是向子元素添加 pom.xml 对父 pom.xml 的引用,您尝试向子元素添加 relativePath>.. /pom.xml/relativePath>,但仍然无法正常工作。

Maven-多模块项目

[

DockerFile

FROM alpine/git as clone
WORKDIR /app
RUN git clone https://github.com/RicardoVargasLeslie/manager.git

FROM openjdk:8-jdk-alpine as build
WORKDIR /workspace/app

COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
COPY src src

RUN ./mvnw install -DskipTests

ENTRYPOINT ["java","-jar","/Web-0.0.1-SNAPSHOT.jar"]

子 pom.xml(Web)

<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>com.imricki.manager</groupId>
        <artifactId>core</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <artifactId>Web</artifactId>
    <name>Web</name>
    <description>Web Module</description>

父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>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.imricki.manager</groupId>
    <artifactId>core</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Core</name>
    <description>Core Module</description>
    <packaging>pom</packaging>

构建镜像的 Docker 命令

docker build -t rest-api .

命令行跟踪

$ docker build -t rest-api .
Sending build context to Docker daemon  42.92MB
Step 1/11 : FROM alpine/git as clone
 ---> a1d22e4b51ad
Step 2/11 : WORKDIR /app
 ---> Using cache
 ---> e53f5b4941b5
Step 3/11 : RUN git clone https://github.com/RicardoVargasLeslie/manager.git
 ---> Using cache
 ---> 490b2afea22c
Step 4/11 : FROM openjdk:8-jdk-alpine as build
 ---> a3562aa0b991
Step 5/11 : WORKDIR /workspace/app
 ---> Using cache
 ---> 0b7c106319e9
Step 6/11 : COPY mvnw .
 ---> Using cache
 ---> 2c7ab0b79d25
Step 7/11 : COPY .mvn .mvn
 ---> Using cache
 ---> eb9ec36b737a
Step 8/11 : COPY pom.xml .
 ---> Using cache
 ---> 2296a5fbd6ae
Step 9/11 : COPY src src
 ---> Using cache
 ---> 022a609f4376
Step 10/11 : RUN ./mvnw install -DskipTests
 ---> Running in 897cff2e3c3b
[INFO] Scanning for projects...
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[FATAL] Non-resolvable parent POM for com.imricki.manager:Web:[unknown-version]: Could not find artifact com.imricki.manager:core:pom:0.0.1-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 5, column 10
 @
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]
[ERROR]   The project com.imricki.manager:Web:[unknown-version] (/workspace/app/pom.xml) has 1 error
[ERROR]     Non-resolvable parent POM for com.imricki.manager:Web:[unknown-version]: Could not find artifact com.imricki.manager:core:pom:0.0.1-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 5, column 10 -> [Help 2]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException
The command '/bin/sh -c ./mvnw install -DskipTests' returned a non-zero code: 1

我不确定发生了什么问题或如何使构建工作,感谢您的帮助。

【问题讨论】:

  • 出于兴趣,您为什么希望您的容器运行 maven 构建?这可以由主机运行,您只需将.jar 复制到您的容器中
  • 让它更加自动化,不必在主机上构建
  • 一般来说,像 Jenkins 这样的专用构建服务器用于此类任务,生成的工件用于构建容器,但对于本地开发,您的方式可行

标签: java maven spring-boot docker pom.xml


【解决方案1】:

Maven 是一种工具,它支持以声明方式管理项目的依赖项。它通过标准化项目共享 jar 和 pom 文件(工件)的方式来实现这一点,并使用 maven 坐标来声明项目依赖项(groupId、artifactId 和 version),然后在大型公共 maven jar 和 pom 文件存储库中查找称为 Maven 中心。

为了将您的 jar/pom 文件(例如您的核心)作为 maven 工件进行管理,您需要将您的工件部署到 Maven Central(任何人都可以访问的公共存储库)或某个位置的私有存储库您的专用网络(甚至在 Internet 上,并且可能带有身份验证)。对于私有存储库,您需要包含您的私有存储库,以便您的 Maven 执行不仅在 Maven Central 中查找工件,而且还在您的私有存储库中查找。您可以通过将以下内容添加到您的 settings.xml 文件来实现此目的:

<!-- Authentication here -->
<servers>
  <server>
      <id>nexus</id>
      <username>some_username</username>
      <password>some_passowrd</password>
    </server>
</servers>
...
 <profiles>
    <profile>
      <id>nexus</id>
      <!--Override the repository (and pluginRepository) "central" from the
   Maven Super POM -->
      <repositories>
        <repository>
          <id>nexus-release</id>
          <name>nexus-release</name>
          <url>http://hostname_or_ip_address/content/repositories/releases</url>
        </repository>
        <repository>
          <id>nexus-thirdparty</id>
          <name>nexus-thirdparty</name>
          <url>http://hostname_or_ip_address/content/repositories/thirdparty</url>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>nexus-plugin-release</id>
          <name>nexus-plugin-release</name>
          <url>http://hostname_or_ip_address/content/repositories/releases/</url>
        </pluginRepository>
        <pluginRepository>
          <id>nexus-plugin-third-party</id>
          <name>nexus-plugin-third-party</name>
          <url>http://hostname_or_ip_address/content/repositories/thirdparty/</url>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
...

我注意到您的孩子 pom.xml 文件引用了一个自定义父模块。您需要确保您的父模块位于 maven 存储库 (Nexus/Artifactory) 中,并且您提供了一个 settings.xml 文件,其中包含 Docker 容器的存储库设置,以便能够拉取父 pom。

【讨论】:

  • 我不确定我是否完全明白你的问题。请编辑您的评论
  • 我知道这一点,解决方案是让您将您的 web 模块 dockerize。您需要在容器中运行 maven 构建会增加复杂性,因此您的容器具有组装应用程序和运行时的双重角色。让我知道它是怎么回事
  • 您是否已将父 pom 部署到 maven 存储库?
  • 没错。如果愿意,您也可以将存储库作为 Docker 容器运行。当你走 Docker 路线时,你必须确保你的 Docker 容器或在同一个网络上。最后我检查了当你运行你的 web Docker 容器时你可以使用链接标志
  • 我不太明白。当我们有父 pom.xml 时,我们如何 dockerize 一个 springboot 应用程序?
猜你喜欢
  • 2023-04-01
  • 2011-11-28
  • 2022-01-07
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
相关资源
最近更新 更多