【问题标题】:Excluding Maven dependencies排除 Maven 依赖项
【发布时间】:2012-02-25 12:06:28
【问题描述】:

我有一个关于排除 maven 依赖项的问题。考虑以下

   <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
        <version>${spring-security.version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-web</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>3.1.0.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>3.1.0.RELEASE</version>
    </dependency>
    <dependency>

我正在尝试实现从 Spring 3.0.6 到 3.1.0 的过渡。 Spring security 3.1.0 依赖于 spring-security-web 版本 3.0.6 ,后者又依赖于 spring-web 3.0.6 。我需要把它全部带到 3.1.0 。所以我从 Spring security 中排除 spring-security-web ,对 spring-security-web 3.1.0 有一个单独的依赖项,这又排除了 spring-web 3.0.6 版本,我提供了一个单独的 spring-web 3.1.0 版本。这项工作,但我觉得会有一个更简单的方法。我尝试将 Spring Web 排除在 Spring 安全性下,但没有奏效。请帮忙。

【问题讨论】:

    标签: maven maven-3


    【解决方案1】:

    您可以使用dependency management mechanism

    如果您在 pom 的 &lt;dependencyManagement&gt; 部分中为 spring-security-webspring-web 创建条目并设置所需的 3.1.0 版本,则工件的托管版本将覆盖传递依赖树中指定的那些。

    我不确定这是否真的可以为您节省任何代码,但它是 IMO 更清洁的解决方案。

    【讨论】:

    • 我现在必须解决这个问题。我希望全局排除可以让它更容易..
    【解决方案2】:

    全局排除 look like they're being worked on,但在那之前...

    来自Sonatype maven reference(页面底部):

    顶级 POM 中的依赖管理不同于 定义对广泛共享的父 POM 的依赖。对于初学者来说,所有 依赖是继承的。如果 mysql-connector-java 被列为 顶级父项目的依赖关系,每个项目 层次结构将引用此依赖项。代替 添加不必要的依赖项,使用 dependencyManagement 允许 您可以整合和集中管理依赖项 不添加所有版本都继承的依赖项的版本 孩子们。换句话说,dependencyManagement 元素是 相当于一个环境变量,它允许你声明一个 项目下的任何地方的依赖项而不指定版本 号码。

    举个例子:

      <dependencies>
        <dependency>
          <groupId>commons-httpclient</groupId>
          <artifactId>commons-httpclient</artifactId>
          <version>3.1</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
          <version>3.0.5.RELEASE</version>
        </dependency>
      </dependencies>
      <dependencyManagement>
        <dependencies>
          <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <exclusions>
              <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
              </exclusion>
            </exclusions>
          </dependency>
          <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <exclusions>
              <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
              </exclusion>
            </exclusions>
          </dependency>
        </dependencies>
      </dependencyManagement>
    

    它并没有使代码整体上不那么冗长,但它确实使它在重要的地方不那么冗长。如果您仍然希望它不那么冗长,您也可以从 Sonatype 参考中follow these tips

    【讨论】:

    猜你喜欢
    • 2017-09-14
    • 2012-08-16
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2021-10-24
    • 2015-03-07
    • 1970-01-01
    相关资源
    最近更新 更多