【问题标题】:Gradle api transitive dependencies not workingGradle api传递依赖项不起作用
【发布时间】:2021-08-13 05:31:33
【问题描述】:

我有一个库项目,用于为我的其他项目进行一些设置,其中包含许多实用程序类和实用程序库。因此,我将库的 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, ?>
}

【问题讨论】:

  • 你能试试 gradle 的低版本吗?可能是因为这个

标签: java spring spring-boot gradle build.gradle


【解决方案1】:

有关传递依赖的信息不包含在您的 jar 中。当您通过 Maven 或 Gradle 将库发布到存储库时,会发布多个文件:

  • 显然是包含所有编译代码的 .jar 文件
  • pom.xml 文件(它包含传递依赖定义)
  • 一些带有校验和的文件

当您将库 jar 复制到 lib 目录时,您的应用程序没有关于它的依赖项的信息。有几种解决方案:

  1. 将您的库发布到 Maven 存储库(Sonatype NexusJFrog Artifactory 是设置自托管存储库的最流行产品,但您也可以使用 mavenLocal())而不是将 jar 复制到 lib - 我认为这是最佳解决方案

  2. 将库构建为 fatJar(包含已编译代码及其所有依赖项的 jar 文件 - Creating a Fat Jar in Gradle

  3. 将所有库依赖项复制到lib 文件夹

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多