【问题标题】:Maven dependency on zip artifactMaven 对 zip 工件的依赖
【发布时间】:2013-12-29 02:26:27
【问题描述】:

我有一个项目需要依赖另一个项目生成的 ZIP 文件。那个“其他项目”不在我的控制之下。正确构建我的项目需要 ZIP 文件。执行我的项目不需要它。我需要 Maven 为我下载 ZIP 文件。

我目前像这样创建对 ZIP 工件的依赖项:

<dependency>
    <groupId>org.foo</groupId>
    <artifactId>zeus</artifactId>
    <version>1.1</version>
    <type>zip</type>
    <scope>test</scope>
</dependency>

我的问题是范围。如果我使用除test 之外的任何东西,它会带来很多来自“其他项目”的传递依赖关系,这会搞砸我自己的项目。使用test 作为范围实际上可以完成这项工作,但它在我的 IDE 中显示为测试依赖项。所以我觉得我做错了什么。这不是测试依赖!

我查看了可用的 Maven 范围(“编译”、“提供”等),但似乎找不到与我的用例匹配的范围。我做错了吗?

【问题讨论】:

  • 我会使用 'provided' 并在最坏的情况下排除它拖拽的任何额外内容(提示:使用 mvn dependency:tree 为你的依赖结构获得一个很好的可视化)
  • @radai。我需要 Maven 为我下载依赖项。 “提供”是否这样做?
  • @radai provided 不起作用,因为这与 OP 想要的相反。 provided 表示“在编译时需要,但在运行时不是”。
  • 问题似乎出在另一个人工制品上 - 应该构建 zip 以便不与传递依赖项捆绑在一起。除了手动排除您不想要的依赖项之外,我认为唯一要做的就是使用 shade 插件。
  • @BoristheSpider。虽然我无法控制“其他项目”,但我可以在我自己的项目和“其他项目”之间创建一个中间项目,然后该中间项目将使用 shade 插件来排除依赖项。那行得通吗?我以前从未使用过阴影插件。感谢您指出。

标签: java maven


【解决方案1】:

您可以使用通配符排除所有传递依赖项:

<dependency>
    <groupId>org.foo</groupId>
    <artifactId>zeus</artifactId>
    <version>1.1</version>
    <type>zip</type>
    <scope>compile</scope>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

(来源Exclude all transitive dependencies of a single dependency

【讨论】:

    【解决方案2】:

    您必须将所有传递依赖项声明为排除项:

    <dependency>
        <groupId>org.foo</groupId>
        <artifactId>zeus</artifactId>
        <version>1.1</version>
        <type>zip</type>
        <scope>compile</scope>
        <exclusions>
           <exclusion>
              <groupId>org.foo</groupId>
              <artifactId>transitive-dep-1</artifactId>
           </exclusion>
           <exclusion>
              <groupId>org.foo</groupId>
              <artifactId>transitive-dep-2</artifactId>
           </exclusion>
           <!-- add all transitive deps. -->
        </exclusions>
    </dependency>
    

    【讨论】:

    • 谢谢。我想这可能是一场维护噩梦,因为我必须跟踪其他项目的依赖关系。我觉得我的用例很简单,而且(显然)没有明显的解决方案有点奇怪。我只想依赖一个 zip 神器……这有多难? (每当我发现自己有这样的想法时,我总是试着照照镜子,并认为我可能误解了 Maven 的概念?)
    • 出于各种原因,我将使用此解决方案(尽管在我看来是维护噩梦),而不是像其他地方建议的那样使用阴影插件。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2010-11-03
    • 2012-08-31
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多