父pom工件需要远程部署吗?
Do parent pom artifacts need to be remotely deployed?
我有两个项目,项目 A 和项目 B。
项目 B 是一个多模块项目,其中子模块 1-3 是 JAR,父模块是打包类型 pom
。
module-parent
|- module-child-1
|- module-child-2
|- module-child-3
父pom看起来像这样
<?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>
<groupId>my.group.id</groupId>
<artifactId>module-parent</artifactId>
<packaging>pom</packaging>
<version>2.4.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath />
</parent>
<modules>
<module>module-child-1</module>
<module>module-child-2</module>
<module>module-child-3</module>
</modules>
<properties>
<java.version>1.11</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
在所有其他子 pom.xml 文件中,我们将 <parent>
作为模块父级包含在内,并且将 maven-deploy-plugin <skip>
设置为 false。
<parent>
<groupId>my.group.id</groupId>
<artifactId>module-parent</artifactId>
<version>2.4.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
此外,module-child-1 是在 module-child-2 和 module-child-3
中定义和使用的 <dependency>
项目 A 是一个完全独立的普通项目(它不是一个多模块项目),它可以简单地将 3 个子模块中的任何一个用作其项目中的依赖项。
<dependency>
<groupId>my.group.id</groupId>
<artifactId>module-child-2</artifactId> (or module-child-1/module-child-3)
<version>1.0.0-SNAPSHOT</version>
</dependency>
我的问题是,当 运行 项目 A 上的 maven 命令 dependency:tree
时,它抛出以下错误,因为它试图在我定义的 <servers>
中搜索模块父级我的 settings.xml 文件,即使 module-parent 的类型是 pom
.
[ERROR] Failed to execute goal on Project-A: Could not resolve
dependencies for project my.group.id:Project-A:jar:0.0.1-SNAPSHOT:
Failed to collect dependencies at
my.group.id:module-child-2:jar:1.0.0-SNAPSHOT: Failed to read artifact
descriptor for my.group.id:module-child-2:jar:1.0.0-SNAPSHOT: Could
not transfer artifact my.group.id:module-parent:pom:2.4.0-SNAPSHOT
from/to MyServer-SNAPSHOT (https://example): Access Denied to:
......., ReasonPhrase:Forbidden.
pom 工件也需要远程部署吗?只有 3 个子模块已部署。我真的需要为单个 pom 文件部署单独的工件吗?
子模块中的代码非常好,但是我猜它无法从任何子模块的 <parent>
中读取,所以它可能依赖于 <parent>
改为项目 A。
是的,您也需要部署父 POM。没有父 POM,Maven 无法读取它们。您应该将包括父模块在内的所有模块部署到同一个地方。
您可以使用 Flatten Maven Plugin 从最终部署的 POM 中删除父级,以便在没有父级的情况下使用它。
不过,通常的方法是 Luciano 描述的方法。
我有两个项目,项目 A 和项目 B。
项目 B 是一个多模块项目,其中子模块 1-3 是 JAR,父模块是打包类型 pom
。
module-parent
|- module-child-1
|- module-child-2
|- module-child-3
父pom看起来像这样
<?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>
<groupId>my.group.id</groupId>
<artifactId>module-parent</artifactId>
<packaging>pom</packaging>
<version>2.4.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath />
</parent>
<modules>
<module>module-child-1</module>
<module>module-child-2</module>
<module>module-child-3</module>
</modules>
<properties>
<java.version>1.11</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
在所有其他子 pom.xml 文件中,我们将 <parent>
作为模块父级包含在内,并且将 maven-deploy-plugin <skip>
设置为 false。
<parent>
<groupId>my.group.id</groupId>
<artifactId>module-parent</artifactId>
<version>2.4.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
此外,module-child-1 是在 module-child-2 和 module-child-3
中定义和使用的<dependency>
项目 A 是一个完全独立的普通项目(它不是一个多模块项目),它可以简单地将 3 个子模块中的任何一个用作其项目中的依赖项。
<dependency>
<groupId>my.group.id</groupId>
<artifactId>module-child-2</artifactId> (or module-child-1/module-child-3)
<version>1.0.0-SNAPSHOT</version>
</dependency>
我的问题是,当 运行 项目 A 上的 maven 命令 dependency:tree
时,它抛出以下错误,因为它试图在我定义的 <servers>
中搜索模块父级我的 settings.xml 文件,即使 module-parent 的类型是 pom
.
[ERROR] Failed to execute goal on Project-A: Could not resolve dependencies for project my.group.id:Project-A:jar:0.0.1-SNAPSHOT: Failed to collect dependencies at my.group.id:module-child-2:jar:1.0.0-SNAPSHOT: Failed to read artifact descriptor for my.group.id:module-child-2:jar:1.0.0-SNAPSHOT: Could not transfer artifact my.group.id:module-parent:pom:2.4.0-SNAPSHOT from/to MyServer-SNAPSHOT (https://example): Access Denied to: ......., ReasonPhrase:Forbidden.
pom 工件也需要远程部署吗?只有 3 个子模块已部署。我真的需要为单个 pom 文件部署单独的工件吗?
子模块中的代码非常好,但是我猜它无法从任何子模块的 <parent>
中读取,所以它可能依赖于 <parent>
改为项目 A。
是的,您也需要部署父 POM。没有父 POM,Maven 无法读取它们。您应该将包括父模块在内的所有模块部署到同一个地方。
您可以使用 Flatten Maven Plugin 从最终部署的 POM 中删除父级,以便在没有父级的情况下使用它。
不过,通常的方法是 Luciano 描述的方法。