【问题标题】:maven: how to disable certain dependencies?maven:如何禁用某些依赖项?
【发布时间】:2021-06-10 08:54:12
【问题描述】:

好吧,我不是在谈论众所周知的公共日志记录问题,我知道我可以通过设置 99.0-does-not-exist 版本来禁用它。

我的问题是,某些包包含在不同的依赖项中,例如,aspectjlib 包含在 org.aspectj:aspectjlib 和 aspectj:aspectjlib 中。在某些情况下,传递依赖可能会同时引入两个 jar,而版本不同,例如 org.aspectj:aspectjlib:1.7.3、aspectj:aspectjlib:1.6.1。并且意外加载 aspectj:aspectjlib:1.6.1 并不是我的本意。那么有没有像 commons-logging 这样的方法可以完全禁用 aspectj:aspectjlib?

我使用 99.0-does-not-exist 尝试了相同的技巧,结果发现来自 maven 的错误:


[错误] 无法在项目 XXX 上执行目标:无法解决 项目 XXX:jar:1.0.0-SNAPSHOT 的依赖项:以下 无法解决工件: aspectj:aspectjlib:jar:99.0-不存在, aspectj:aspectjrt:jar:99.0-不存在, aspectj:aspectjweaver:jar:99.0-does-not-exist: 找不到工件 aspectj:aspectjlib:jar:99.0-在 tbmirror 中不存在 (http://mvnrepo.taobao.ali.com/mvn/repository) -> [帮助1]

【问题讨论】:

    标签: java maven


    【解决方案1】:

    好吧,虽然一些存储库确实提供了 99.0-does-not-exist 用于记录系统依赖项,如 log4j、slf4j-log4j、commons-logging 等,但这不是一个通用的解决方案。

    我找到了解决方案:使用“提供”范围。 澄清一下,在我上面的例子中,我有两个相互冲突的依赖:org.aspectj:aspectjlib:1.7.3,aspectj:aspectjlib:1.6.1,我想禁用aspectj:aspectjlib:1.6.1,我只需要把这个在顶级 pom 中:

    <dependency>
        <groupId>aspectj</groupId>
        <artifactId>aspectjlib</artifactId>
        <version>1.6.1</version>
        <scope>provided</scope>
    </dependency>
    

    这样,aspectj:aspectjlib:1.6.1 将永远不会出现在最终构建的lib中。

    【讨论】:

      【解决方案2】:

      您可以使用 Maven 的dependency exclusions 来消除您不想要的版本。使用您的示例:

      <dependencies>
        <dependency>
          <groupId>com.example</groupId>
          <artifactId>includes-new-aspectj</groupId>
        </dependency>
        <dependency>
          <groupId>com.example</groupId>
          <artifactId>includes-old-aspectj</groupId>
          <exclusions>
            <exclusion>
              <groupId>org.aspectj<groupId>
              <artifactId>aspectjlib</artifactId>
            <exclusion>
          </exclusions>
        </dependency>
      </dependencies>
      

      或者,您可以使用dependency management 简单地固定您想要的版本:

      <dependencyManagement>
        <dependencies>
          <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjlib</artifactId>
            <version>1.7.3</version>
          </dependency>
        </dependencies>
      </dependencyManagement>
      
      <dependencies>
        <dependency>
          <groupId>com.example</groupId>
          <artifactId>includes-new-aspectj</groupId>
        </dependency>
        <dependency>
          <groupId>com.example</groupId>
          <artifactId>includes-old-aspectj</groupId>
        </dependency>
      </dependencies>
      

      【讨论】:

        【解决方案3】:

        There is no99.0 版本为aspectj:aspectjlib,您的项目配置为使用错误版本,请检查pom.xml 中的99.0

        【讨论】:

        • 是的,我知道版本不存在,我的意图是设置一个不存在的版本,这样 maven 会像 commos-logging 一样找到一个空依赖项,显然这不起作用。
        • 如果它不能解决依赖,它就会失败,为什么你的类路径中还需要一个空 jar 呢?
        • 正如我在帖子中提到的,存在两个不同版本的aspectjlib jar,我需要排除aspectj:aspectjlib:1.6.1,并找到所有使用aspectj:aspectjlib:1.6.1 和单独排除它们是一项相当大的工作,我认为更好的方法是在顶级 pom 中添加一个不存在的版本。
        • oyu 试过mvn dependency:tree 吗?
        • 是的,我知道这可以整理出所有的依赖关系,但是如果我的 30 个依赖关系传递使用 aspectjlib,我将不得不在我的 pom 中排除它们 30 次,这将是一团糟。跨度>
        猜你喜欢
        • 2018-04-13
        • 2020-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-09
        • 2015-11-03
        • 2016-09-14
        相关资源
        最近更新 更多