Gradle api 传递依赖不工作
Gradle api transitive dependencies not working
我有一个库项目,我用它来为我的其他项目进行一些设置,该项目有很多实用程序分类,还包括实用程序库。因此,我将库的 build.gradle 中的所有“实现”调用更改为“api”调用,因此我不需要一次又一次地重新导入依赖项。构建库并将 jar 从我的库文件夹移动到我的主项目中的 lib 文件夹后,我可以访问我的库中的所有 类,但是传递依赖项在我的主项目中不可用。
我也尝试过使用 implementation 和 transitive = true,但没有成功。
我正在使用 AdoptOpenJDK 16 和 Gradle 7.0,我已经尝试在清理缓存后重建所有内容。
图书馆的build.gradle
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
}
plugins {
id 'java-library'
id 'idea'
id 'org.springframework.boot' version '2.5.0'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
group = 'com.mygroup'
archivesBaseName = 'utilities'
version = '1.0.2'
bootJar {
enabled = false
}
jar {
enabled = true
}
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
// Spring
api('org.springframework.boot:spring-boot-starter-web')
api('org.springframework.boot:spring-boot-starter-validation')
api('org.springframework.boot:spring-boot-starter-logging')
api('org.springframework.boot:spring-boot-starter-log4j2')
api('org.springframework.boot:spring-boot-starter-test')
api('io.springfox:springfox-boot-starter:3.0.0')
// Utilities
api('io.sentry:sentry-spring:4.3.0')
api('joda-time:joda-time:2.10.10')
api('commons-codec:commons-codec:1.15')
api('org.apache.commons:commons-lang3:3.12.0')
api('org.apache.commons:commons-csv:1.8')
api('org.apache.commons:commons-math3:3.6.1')
api('org.projectlombok:lombok:1.18.20')
api('org.springframework.boot:spring-boot-configuration-processor')
// Annotation Processor
annotationProcessor('org.projectlombok:lombok:1.18.20')
annotationProcessor('org.springframework.boot:spring-boot-configuration-processor')
// Tests
testAnnotationProcessor('org.projectlombok:lombok:1.18.20')
testAnnotationProcessor('org.springframework.boot:spring-boot-starter-test')
testImplementation('org.springframework.boot:spring-boot-starter-test')
}
test {
useJUnitPlatform()
systemProperties = System.properties as Map<String, ?>
}
应用程序的 build.gradle
buildscript {
repositories {
mavenLocal()
mavenCentral()
maven {
url 'https://plugins.gradle.org/m2/'
}
}
}
plugins {
id 'java'
id 'idea'
id 'org.springframework.boot' version '2.5.0'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
group = 'com.mygroup'
archivesBaseName = 'application'
version = '1.0.2'
bootJar {
enabled = true
}
jar {
enabled = false
}
repositories {
mavenLocal()
mavenCentral()
flatDir dirs: 'lib'
}
dependencies {
// Local
implementation('com.mygroup:utilities:1.0.2')
testImplementation('com.mygroup:utilities:1.0.2')
annotationProcessor('com.mygroup:utilities:1.0.2')
testAnnotationProcessor('com.mygroup:utilities:1.0.2')
// Additional dependencies
implementation('org.springframework.boot:spring-boot-starter-data-mongodb')
implementation('com.graphql-java:graphql-spring-boot-starter:5.0.2')
implementation('com.graphql-java:graphiql-spring-boot-starter:5.0.2')
implementation('com.graphql-java:graphql-java-tools:5.2.4')
}
test {
useJUnitPlatform()
systemProperties = System.properties as Map<String, ?>
}
有关传递依赖项的信息未包含在您的 jar 中。当您通过 Maven 或 Gradle 将库发布到存储库时,有几个文件正在发布:
- 显然是包含所有编译代码的 .jar 文件
- pom.xml 文件(它包含传递依赖项定义)
- 一些带校验和的文件
当您将库 jar 复制到 lib
目录时,您的应用程序没有关于它的依赖项的信息。有几种解决方法:
将您的库发布到 Maven 存储库(Sonatype Nexus or JFrog Artifactory 是设置自托管存储库的最受欢迎的产品,但您也可以使用 mavenLocal()
)而不是将 jar 复制到 lib
- 我认为这是最好的解决方案
将库构建为 fatJar(包含已编译代码及其所有依赖项的 jar 文件 - Creating a Fat Jar in Gradle)
将所有库依赖项复制到 lib
文件夹
我有一个库项目,我用它来为我的其他项目进行一些设置,该项目有很多实用程序分类,还包括实用程序库。因此,我将库的 build.gradle 中的所有“实现”调用更改为“api”调用,因此我不需要一次又一次地重新导入依赖项。构建库并将 jar 从我的库文件夹移动到我的主项目中的 lib 文件夹后,我可以访问我的库中的所有 类,但是传递依赖项在我的主项目中不可用。
我也尝试过使用 implementation 和 transitive = true,但没有成功。
我正在使用 AdoptOpenJDK 16 和 Gradle 7.0,我已经尝试在清理缓存后重建所有内容。
图书馆的build.gradle
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
}
plugins {
id 'java-library'
id 'idea'
id 'org.springframework.boot' version '2.5.0'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
group = 'com.mygroup'
archivesBaseName = 'utilities'
version = '1.0.2'
bootJar {
enabled = false
}
jar {
enabled = true
}
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
// Spring
api('org.springframework.boot:spring-boot-starter-web')
api('org.springframework.boot:spring-boot-starter-validation')
api('org.springframework.boot:spring-boot-starter-logging')
api('org.springframework.boot:spring-boot-starter-log4j2')
api('org.springframework.boot:spring-boot-starter-test')
api('io.springfox:springfox-boot-starter:3.0.0')
// Utilities
api('io.sentry:sentry-spring:4.3.0')
api('joda-time:joda-time:2.10.10')
api('commons-codec:commons-codec:1.15')
api('org.apache.commons:commons-lang3:3.12.0')
api('org.apache.commons:commons-csv:1.8')
api('org.apache.commons:commons-math3:3.6.1')
api('org.projectlombok:lombok:1.18.20')
api('org.springframework.boot:spring-boot-configuration-processor')
// Annotation Processor
annotationProcessor('org.projectlombok:lombok:1.18.20')
annotationProcessor('org.springframework.boot:spring-boot-configuration-processor')
// Tests
testAnnotationProcessor('org.projectlombok:lombok:1.18.20')
testAnnotationProcessor('org.springframework.boot:spring-boot-starter-test')
testImplementation('org.springframework.boot:spring-boot-starter-test')
}
test {
useJUnitPlatform()
systemProperties = System.properties as Map<String, ?>
}
应用程序的 build.gradle
buildscript {
repositories {
mavenLocal()
mavenCentral()
maven {
url 'https://plugins.gradle.org/m2/'
}
}
}
plugins {
id 'java'
id 'idea'
id 'org.springframework.boot' version '2.5.0'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
group = 'com.mygroup'
archivesBaseName = 'application'
version = '1.0.2'
bootJar {
enabled = true
}
jar {
enabled = false
}
repositories {
mavenLocal()
mavenCentral()
flatDir dirs: 'lib'
}
dependencies {
// Local
implementation('com.mygroup:utilities:1.0.2')
testImplementation('com.mygroup:utilities:1.0.2')
annotationProcessor('com.mygroup:utilities:1.0.2')
testAnnotationProcessor('com.mygroup:utilities:1.0.2')
// Additional dependencies
implementation('org.springframework.boot:spring-boot-starter-data-mongodb')
implementation('com.graphql-java:graphql-spring-boot-starter:5.0.2')
implementation('com.graphql-java:graphiql-spring-boot-starter:5.0.2')
implementation('com.graphql-java:graphql-java-tools:5.2.4')
}
test {
useJUnitPlatform()
systemProperties = System.properties as Map<String, ?>
}
有关传递依赖项的信息未包含在您的 jar 中。当您通过 Maven 或 Gradle 将库发布到存储库时,有几个文件正在发布:
- 显然是包含所有编译代码的 .jar 文件
- pom.xml 文件(它包含传递依赖项定义)
- 一些带校验和的文件
当您将库 jar 复制到 lib
目录时,您的应用程序没有关于它的依赖项的信息。有几种解决方法:
将您的库发布到 Maven 存储库(Sonatype Nexus or JFrog Artifactory 是设置自托管存储库的最受欢迎的产品,但您也可以使用
mavenLocal()
)而不是将 jar 复制到lib
- 我认为这是最好的解决方案将库构建为 fatJar(包含已编译代码及其所有依赖项的 jar 文件 - Creating a Fat Jar in Gradle)
将所有库依赖项复制到
lib
文件夹