假设我有一个多模块maven项目。其中一个项目的POM文件如下:带插件的Maven配置文件行为
<?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>some.group</groupId>
<artifactId>parent-artifact</artifactId>
<version>0.14.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>artifact-x</artifactId>
<packaging>jar</packaging>
<name>Artifact X</name>
<dependencies>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-a</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-b</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-c</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-d</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-e</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
比方说,出于某种原因,我想移动一些依赖于这个POM文件到一个配置文件。因此,在使用profile-1
时,我将artifact-c
,artifact-d
,artifact-e
仅视为相关性。 profile-1
也用于该项目中的其他POM。我的新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>
<parent>
<groupId>some.group</groupId>
<artifactId>parent-artifact</artifactId>
<version>0.14.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>artifact-x</artifactId>
<packaging>jar</packaging>
<name>Artifact X</name>
<dependencies>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-a</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-b</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>profile-1</id>
<dependencies>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-c</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-d</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>some.group</groupId>
<artifactId>artifact-e</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</profile>
</profiles>
</project>
建设的时候,我在两种情况下,顶层POM运行mvn -Pprofile-1 clean package
。我的期望是,当指定-Pprofile-1
时,将依赖关系移至配置文件不应改变任何内容。但是这并没有发生 - 一些插件开始出现错误 - 例如。该maven-shade-plugin
没有把artifact-c
,artifact-d
和artifact-e
在阴影罐子等
我是不是做错了什么?配置文件不应该这样工作?
即使与-Pprofile-1
一起使用,这两个POM文件是不是等效的?
嘿罗伯特, 感谢您的答复。 所以,多一点信息:我没有这样做的自由 - 我试图修改已经使用配置文件进行依赖关系的Apache Hive(Hadoop-1和Hadoop-2的不同依赖关系)这就是为什么我认为这两个POM在使用profile-1时应该是等效的。情况并非如此吗? – 2014-10-28 20:35:05
我只知道Hive和Hadoop的名称,但我会说:结果是2个不同的应用程序,它们有自己的groupId/artifactId/version,所以有2个不同的poms。即使在引入分类器时,您也无法在配置文件之间做出区别,但它们仍然使用相同的“pom.xml” – 2014-10-28 21:10:30