首页 > 解决方案 > 对子项目和依赖项进行评分

问题描述

这绝对是一个初学者的 gradle 问题,但我无法让它发挥作用。

我有一个库和一个依赖于该库的应用程序。

.
/ library
/ application

我可以通过gradle installin安装库./library,然后通过组/名称/版本让应用程序依赖于库,并通过mavenLocal()应用程序中的存储库获取库build.gradle,然后在文件夹中构建应用程序application。那行得通。

但我想要一个项目,并且我可以有一个命令来构建应用程序,如果需要,也可以构建库(类似于 maven-am标志)。

这是我现在在父文件夹中拥有的内容build.gradle

subprojects {
  apply plugin: "java"
  repositories {
      mavenCentral()
  }
}

project(':application') {
  dependencies {
    compile project(':library')
  }
}

在同一个文件夹中,我有settings.gradle

include ':library', ':application'

同样,如果我进入库文件夹并运行gradle install,它可以工作。我在我的~/.m2.

但是现在使用我描述的配置,如果我进入根文件夹并运行gradle shadowJar.. 并且 shadowJar 任务仅存在于 中application,那么 gradle 会尝试编译库但失败,显然是因为它没有获取库依赖项。

* What went wrong:
Execution failed for task ':library:compileJava'.
> Compilation failed; see the compiler error output for details.

例如,错误是这样的:

任务 :library:compileJava FAILED .../DateTimeAdapter.java:5: 错误:包 javax.xml.bind.annotation.adapters 不存在 import javax.xml.bind.annotation.adapters.XmlAdapter;

果然这些是 library/build.gradle => 中的依赖项

    implementation 'com.fasterxml.jackson.core:jackson-core:2.8.8'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.8.8'

所以我的问题是如何指定应用程序对库的依赖关系,以便我可以运行单个命令并在需要时让 maven 构建库,然后构建应用程序。我以为我所做的会通过第一部分,但是它失败了,显然是由于库的传递依赖。我实际上希望在那之后我需要处理第二部分,即如何在应用程序 build.json 中指定依赖项。我可能不得不从指定 maven 组/名称/版本坐标切换到项目名称,但我还没有做到这一点。

我绝对不想在根 gradle 文件中列出库依赖项:我希望库处理它的依赖项,并应用它的依赖项,我想保持根 gradle 文件很小。

标签: gradle

解决方案


application无法查看依赖项,library因为您已将 Jackson 依赖声明为library.

您打算做的是将您的library及其依赖项公开为消费者的api 。

在实现配置中声明的依赖项可以被认为是“私有的”,这意味着您的消费者library不应访问使用这些依赖项的方法/类,否则他们将面临像您一样的错误。api基本上是implementation的对立面。

api配置可通过插件java-library获得。

您要实现的目标的完整工作示例(Kotlin DSL):

├── application
│   └── build.gradle.kts
├── build.gradle.kts
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── library
│   └── build.gradle.kts
└── settings.gradle.kts

根项目build.gradle.kts

subprojects {
    apply {
        plugin("java-library")
    }

    repositories {
        jcenter()
    }
}

settings.gradle.kts

rootProject.name = "example-proj"

include("application")
include("library")

图书馆build.gradle.kts

dependencies {
    api("com.fasterxml.jackson.core:jackson-core:2.10.0")
    api("com.fasterxml.jackson.core:jackson-databind:2.10.0")
}

应用build.gradle.kts

dependencies {
    implementation(project(":library"))

}

推荐阅读