对子项目和依赖项进行评分

时间:2019-11-08 10:09:44

标签: gradle

这绝对是一个初学者的问题,但是我无法使其正常工作。

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

.
/ library
/ application

我可以通过gradle install中的./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失败   ... / DateTimeAdapter.java:5:错误:包javax.xml.bind.annotation.adapters不存在   导入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文件保持较小。

1 个答案:

答案 0 :(得分:1)

application无法看到library的依赖关系,因为您已将Jackson依赖关系声明为library实现详细信息。

您打算做的是将library及其依赖项作为 api 供消费者使用。

实现配置中声明的

依赖项可以被视为“私有”,这意味着library的使用者不应访问使用这些依赖项的方法/类,否则它们将面临诸如你一个。 api 实现基本相反。

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"))

}