Maven通过插件描述行为

时间:2014-10-28 18:17:35

标签: maven multi-module

假设我有一个多模块maven项目。该项目的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>
    <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文件中的一些依赖项移动到配置文件中。因此,我在使用artifact-c时仅将artifact-dartifact-eprofile-1移动为依赖项。 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 个答案:

答案 0 :(得分:1)

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

总之:不要试图用个人资料来解决这个问题。必须有一个更好的解决方案。