Gradle 职系分项目及;依赖关系

Gradle 职系分项目及;依赖关系,gradle,Gradle,这绝对是一个初学者的问题,但我就是不能让它工作 我有一个库和一个依赖于库的应用程序 . / library / application 我可以通过/library中的gradle install安装库,然后让应用程序通过组/名称/版本依赖于库,并通过应用程序build.gradle中的mavenLocal()存储库获取库,然后在应用程序文件夹中构建应用程序。这就行了 但是我希望有一个项目,我可以用一个命令来构建应用程序,如果需要的话,还可以使用库(类似于maven-am标志) 下面是我现在在父

这绝对是一个初学者的问题,但我就是不能让它工作

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

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

但是我希望有一个项目,我可以用一个命令来构建应用程序,如果需要的话,还可以使用库(类似于maven
-am
标志)

下面是我现在在父文件夹中的内容,
build.gradle

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

project(':application') {
  dependencies {
    compile project(':library')
  }
}
include ':library', ':application'
在同一个文件夹中,我有
设置。gradle

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

project(':application') {
  dependencies {
    compile project(':library')
  }
}
include ':library', ':application'
同样,如果我进入library文件夹并运行
gradle install
,它也可以工作。我在
~/.m2
中获得工件

但是现在使用我描述的配置,如果我进入根文件夹并运行
gradleshadowjar
。。shadowJar任务只出现在
应用程序中
,然后gradle尝试编译库,但失败了,显然是因为它没有获取库依赖项

* What went wrong:
Execution failed for task ':library:compileJava'.
> Compilation failed; see the compiler error output for details.
例如,错误如下:

任务:库:compileJava失败 …/DateTimeAdapter.java:5:错误:包javax.xml.bind.annotation.adapters不存在 导入javax.xml.bind.annotation.adapters.XmlAdapter

果然,这些都是库/build.gradle=>

    implementation 'com.fasterxml.jackson.core:jackson-core:2.8.8'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.8.8'
所以我的问题是如何指定应用程序对库的依赖关系,这样我就可以运行单个命令并让maven在需要时构建库,然后应用程序。。我原以为我所做的会让第一部分通过,但它失败了,显然是因为库的可传递依赖关系。事实上,我希望接下来需要处理第二部分,即如何在application build.json中指定依赖项。我可能不得不从指定maven group/name/version坐标切换到项目名称,但我还没有做到这一点


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

应用程序
无法查看
的依赖项,因为您已将Jackson依赖项声明为实现库的详细信息

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

实现配置中声明的依赖项可被视为“私有”,这意味着
的使用者不应访问使用这些依赖项的方法/类,否则他们将面临与您相同的错误api基本上与实现相反

api配置通过插件提供

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

根项目
build.gradle.kts

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

    repositories {
        jcenter()
    }
}
rootProject.name = "example-proj"

include("application")
include("library")
dependencies {
    api("com.fasterxml.jackson.core:jackson-core:2.10.0")
    api("com.fasterxml.jackson.core:jackson-databind:2.10.0")
}
dependencies {
    implementation(project(":library"))

}
settings.gradle.kts

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

    repositories {
        jcenter()
    }
}
rootProject.name = "example-proj"

include("application")
include("library")
dependencies {
    api("com.fasterxml.jackson.core:jackson-core:2.10.0")
    api("com.fasterxml.jackson.core:jackson-databind:2.10.0")
}
dependencies {
    implementation(project(":library"))

}
build.gradle.kts

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

    repositories {
        jcenter()
    }
}
rootProject.name = "example-proj"

include("application")
include("library")
dependencies {
    api("com.fasterxml.jackson.core:jackson-core:2.10.0")
    api("com.fasterxml.jackson.core:jackson-databind:2.10.0")
}
dependencies {
    implementation(project(":library"))

}
应用程序
build.gradle.kts

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

    repositories {
        jcenter()
    }
}
rootProject.name = "example-proj"

include("application")
include("library")
dependencies {
    api("com.fasterxml.jackson.core:jackson-core:2.10.0")
    api("com.fasterxml.jackson.core:jackson-databind:2.10.0")
}
dependencies {
    implementation(project(":library"))

}

非常感谢。但我不确定你的第一句话是否反映了我的问题。因为在我的例子中,实际上并没有构建
库。我得到一个
任务:library:compileJava
失败。当基于~/.m2中的工件工作时,应用程序运行良好,即使将其作为
实现导入时也是如此。在您的解释中,我没有发现另一件事:
应用程序
应该如何依赖
?在application build.gradle中没有列出对库的任何依赖关系?依赖关系是否应该通过本地maven存储库(~/.m2,mavenLocal())?还是通过更“直接”的依赖关系?我尝试了您的设置,但没有明确指定对库的依赖,
应用程序
无法生成。但是,如果我通过本地maven repo指定它,一个简单的
gradle shadowJar
(只有应用程序有shadowJar任务)无法在本地repo中安装库。我已经更新了答案,复制/粘贴错误。对不起。但是回到您的第一条评论,是不是
应用程序
以及完全不同的文件夹?如果您在我的回答中看到,我的文件夹结构显示了
应用程序
在同一文件夹中。很抱歉,您的回答是正确的。事实上,在你回答之前,我已经让它工作了,但是我误解了我得到的错误。错误是库中的“找不到符号”。我认为这是因为gradle没有将库依赖项放在类路径中。错。问题是gradle使用java11和依赖jaxb的库,jaxb在java11中从JDK中删除。。。向库中添加对jaxb的依赖项修复了这些问题。。非常感谢。