这绝对是一个初学者的问题,但是我无法使其正常工作。
我有一个库和一个依赖该库的应用程序。
.
/ 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文件保持较小。
答案 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"))
}