如何在 Gradle 中使用 pom 类型依赖

How to use pom type dependency in Gradle

我需要从我的 Java 库中生成传递依赖,它是 pom 类型的。这是我如何做的一个例子:

plugins {
  `java-library`
  `maven-publish`
}
repositories {
  // some maven repo
}
dependencies {
  // This is POM type dependency:
  api("org.apache.sshd:apache-sshd:1.6.0") {
    exclude(group = "org.slf4j")
  }
}
publications {
  create<MavenPublication>("maven") {
    from(components["java"])
  }
}

此配置的问题在于,在我的库的已发布 pom.xml 中,依赖项的类型为 jar(默认情况下)并声明如下:

<dependency>
  <groupId>org.apache.sshd</groupId>
  <artifactId>apache-sshd</artifactId>
  <version>1.6.0</version>
  <!-- Should declare pom type -->
  <scope>compile</scope>
  <exclusions>
    <exclusion>
      <artifactId>*</artifactId>
      <groupId>org.slf4j<groupId>
    </exclusion>
  </exclusions>
</dependency>

因此,当我尝试使用我从另一个项目发布的库时,它失败了,因为没有 apache-sshd 这样的工件,因为它的类型应该是 pom。那么如何使用 Gradle 正确发布所需的依赖项?

运行 Gradle 5.3.1 使用 Kotlin DSL。

尝试使用以下构造在 Gradle

中声明依赖关系
api("org.apache.sshd:apache-sshd:1.6.0@pom") {
   exclude(group = "org.slf4j")
   isTransitive = true
}

看起来 Gradle 默认情况下将所有依赖项作为 jar 类型使用。 Maven 插件使用此提取的类型在 pom 文件中生成依赖项部分。对于 pom 依赖,有必要将正确的值放入生成文件的类型字段中。但是,如果您为依赖项添加 pom 扩展名,Gradle 将不会解析在此工件中声明的传递依赖项。设置传递标志的值可解决此问题。

我用过如下:

compile(group: "dependency_group", name: "dependency_name", version: "dependency_name", extension: "pom")

如果你想排除传递依赖 添加 transitive 标志并将其设置为 false

compile(group: "dependency_group", name: "dependency_name", version: "dependency_name", extension: "pom"){
     transitive = false
}