Maven中与Gradle中的implementation依赖等价的是什么?

6

我最近了解到 Gradle 通过使用 "api" / "implementation" 范围来管理依赖关系,我正在尝试找出是否有一个与 Gradle 中的 "implementation" 相当的 Maven 等效项。然而,Maven 的任何依赖范围似乎都不是完全正确的 - "provided" 会使它不成为运行时依赖项,"compile" / "runtime" 似乎也无法正确处理...因此,似乎没有直接的等效项。

基本上,我有一个需要在编译时(对于我的库)/ 运行时(对于使用我的库的代码)使用的库依赖项,但我不希望它出现在依赖于我的库的代码的 "compile" 类路径中。这是否可能在 Maven 中实现?


如果我正确理解您的要求,范围 runtime 正是您正在寻找的... - khmarbaise
3个回答

3
  • 当在您的库中声明此依赖项时,应将其范围设置为compile。这样,在编译库时它将可用。
  • 但是,当在其他依赖于您的库的模块的dependencyManagement部分中声明它时,它应该具有scope=runtime。这样,在编译其他模块时,它将不会出现在类路径中。

1

据我所知,这是不可能的。

如果您想避免在代码中无意中使用传递性依赖关系,您可以使用 dependency:analysedependency:analyze-only

后者允许您在直接使用传递性依赖关系的类时失败构建。


0

你能否更具体地说明一下架构(模块、子模块)并举个例子吗?

如果我有以下模块:

  • A:依赖于依赖项x,范围为compile
  • B:依赖于依赖项A,范围为compile

现在我想让x在A构建期间处于classpath并进行编译,但我不想让x出现在B的classpath中

好的,因为它是传递性依赖关系,所以你会在B中得到x,但你可以很容易地将其排除在外(当你将依赖项A声明到B时),这样它就不会出现在classpath中。

<dependencies>
    <dependency>
      <groupId>test.test</groupId>
      <artifactId>B</artifactId>
      <version>1.0-SNAPSHOT</version>
      <exclusions>
        <exclusion>
          <groupId>test.test</groupId>
          <artifactId>x</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>

更多信息请参阅: https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接