排除配置文件中的依赖项

时间:2009-11-24 13:17:57

标签: maven-2

我有一个maven模块,它有一些依赖项。在某个配置文件中,我想要排除其中一些依赖项(确切地说,所有依赖项都具有某个组ID)。但是,它们必须存在于所有其他配置文件中。有没有办法从配置文件的依赖项中指定排除项?

6 个答案:

答案 0 :(得分:13)

据我所知,没有,你无法停用依赖关系(你可以排除传递依赖,但这不是你要求的)和,你是什么目前正在使用POM(手动编辑它)是错误的。

因此,您应该将它们放在配置文件中,而不是删除依赖项:

  • 选项#1:在需要时使用配置文件或
  • 选项#2:默认情况下将配置文件标记为已激活或将其放入活动配置文件列表中,并在需要时将其停用。

第三种选择是(不是基于档案的):

  • 选项#3:将两个独立的模块中的东西分开(因为你有分开的问题)并使用继承。

答案 1 :(得分:5)

我遇到的一种方法是将依赖项放在一个单独的pom中。然后,您可以通过个人资料添加<exclusions>部分。

<dependencies>
    <dependency>
        <groupId>my.company.dependencies</groupId>
        <artifactId>my-dependencies</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <type>pom</type>
    </dependency>
</dependencies>

<profile>
    <activation>
        <activeByDefault>false</activeByDefault>
        <property>
            <name>exclude-deps</name>
        </property>
    </activation>

    <dependencies>
        <dependency>
            <groupId>my.company.dependencies</groupId>
            <artifactId>my-dependencies</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <groupId>my.company</groupId>
                    <artifactId>bad-dep-1</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>my.company</groupId>
                    <artifactId>bad-dep-2</artifactId>
                </exclusion>
            </exclusions>
       </dependency>
</dependencies>
</profile>

答案 2 :(得分:4)

我认为不可能排除直接依赖关系(至少没有提到here)。

您可以做的最好的事情是将每个案例的所需依赖项包含在不同的配置文件中(如已建议的那样),但是,您需要创建两个“互斥”配置文件,其中一个配置文件“默认处于活动状态” ”。实现这一目标的最可靠方法是使用参数进行配置文件激活,例如

<profiles>
  <profile>
    <id>default-profile</id>
    <activation>
      <property><name>!exclude</name></property>
    </activation>
    <dependencies>
      dependency-A
      dependency-B
      ...
    </dependencies>
  </profile>

  <profile>
    <id>exclude-profile</id>
    <activation>
      <property><name>exclude</name></property>
    </activation>
    <!-- exclude/replace dependencies here -->
  </profile>
</profiles> 

然后使用“mvn [goal]”将使用配置文件“default-profile”,但“mvn [goal] -Dexclude”将使用配置文件“exclude-profile”。

请注意,在某些情况下使用“activeByDefault”而不是“默认”配置文件的参数可能会有效,但也可能会导致意外行为。问题是只要在多模块构建的任何其他模块中没有其他活动配置文件,'activeByDefault'就会使配置文件处于活动状态。

答案 3 :(得分:4)

您可以将其设置为provided,而不是排除配置文件中的依赖项。这不需要任何过于复杂的配置,并且会排除最终构建中不需要的依赖项。

在所需的个人资料中,添加dependencies部分,复制要排除的部分的声明,并将其作为provided范围。

例如,假设您要排除slf4j-log4j12

<profiles>

    <!-- Other profiles -->

    <profile>
        <id>no-slf4j-log4j12</id>
        <dependencies>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.2</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </profile>

    <!-- Other profiles -->

</profiles>

答案 4 :(得分:1)

maven是一个工具,我们可以对其进行破解。

    如果您将相同的工件+版本两次定义为依赖项,则
  • maven运行良好。
  • 定义一个配置文件,通过将其更改为我们已经拥有的另一个软件包来消除工件+版本。

例如,在pom.xml中:

... other pom stuff ...
  <properties>
    <artifact1>artifact1</artifact1>
    <artifact2>artifact2</artifact2>
    <artifact1.version>0.4</artifact1.version>
    <artifact2.version>0.5</artifact2.version>
  </properties>

  <profile>
    <id>remove-artifact2</id>
    <properties>
      <artifact1>artifact1</artifact1>
      <artifact2>artifact1</artifact2>
      <artifact1.version>0.4</artifact1.version>
      <artifact2.version>0.4</artifact2.version>
    </properties>
  </profile>
  • 现在,如果您在没有配置文件的情况下安装此pom.xml,则artifact1:0.4artifact2:0.5将成为依赖项。
  • 但是如果您使用配置文件mvn -P remove-artifact2安装此pom.xml 结果pom.xml仅包含artifact1:0.4

这在api迁移期间非常方便,在api迁移中,工件被重命名并且版本不兼容。

答案 5 :(得分:0)

有点脏,但轻量级的解决方案是使用provided

与其他范围不同,您可以使用此功能:

  • 将禁用编译时和运行时依赖;与runtimetest不同,后者一次只禁用一个
  • 不会弄乱你的system范围
  • 您不需要像dependencyManagement范围要求那样指定某个虚拟jar的路径

只要您在float之外使用此黑客,就不会导入任何内容。