2014-10-28 112 views
1

假设我有一个多模块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-cartifact-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-cartifact-dartifact-e在阴影罐子等

我是不是做错了什么?配置文件不应该这样工作?

即使与-Pprofile-1一起使用,这两个POM文件是不是等效的?

回答

1

即使pom.xml允许你这样定义它,你不应该(称之为设计缺陷)。大多数情况下,仅仅在配置文件中添加依赖关系是没有意义的。有效的构造是基于OS或JDK版本的依赖项。 另外请记住,pom.xml也充当“consumer-pom”,所以使用此工件的其他项目将读取此pom文件以获取传递依赖关系。在这种情况下,您无法再激活配置文件。

总之:不要试图用配置文件来解决这个问题。必须有更好的解决方案。

+0

嘿罗伯特, 感谢您的答复。 所以,多一点信息:我没有这样做的自由 - 我试图修改已经使用配置文件进行依赖关系的Apache Hive(Hadoop-1和Hadoop-2的不同依赖关系)这就是为什么我认为这两个POM在使用profile-1时应该是等效的。情况并非如此吗? – 2014-10-28 20:35:05

+0

我只知道Hive和Hadoop的名称,但我会说:结果是2个不同的应用程序,它们有自己的groupId/artifactId/version,所以有2个不同的poms。即使在引入分类器时,您也无法在配置文件之间做出区别,但它们仍然使用相同的“pom.xml” – 2014-10-28 21:10:30