gradle - 对子项目和依赖项进行评分
问题描述
这绝对是一个初学者的 gradle 问题,但我无法让它发挥作用。
我有一个库和一个依赖于该库的应用程序。
.
/ library
/ application
我可以通过gradle install
in安装库./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 文件很小。
解决方案
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"))
}
推荐阅读
- python - 如何刷新 PyQt5 中的分组框?
- sql - 如何将查询中的数据与数据列表连接起来?
- time-series - 时间序列和样本之间的差异(Prometheus/任何 TSDB)
- java - java Stripe api调用完成快速帐户连接的正确函数是什么?
- r - 如何在 ggplot2 中绘制模型的 mle2 拟合以及数据?
- docker - 如何在 Dockerfile 中设置 JVM 设置
- autodesk-forge - 为什么您计划将默认的 IFC 模型衍生处理器从 Navisworks 导入器更改为 Revit 导入器?
- python - Pandas:按子组的出现次数过滤行
- php - 使用 Simplexml 的 Xpath 根据 PHP 中的值过滤节点
- hashmap - 将 struts 1 嵌套标签迁移到 struts 2