簡體   English   中英

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目錄時,您的應用程序沒有關於它的依賴項的信息。 有幾種解決方案:

  1. 將您的庫發布到 Maven 存儲庫( Sonatype NexusJFrog Artifactory是最流行的產品來設置自托管存儲庫,但您也可以使用mavenLocal() )而不是將 jar 復制到lib - 我認為這是最好的解決方案

  2. 將庫構建為 fatJar(帶有已編譯代碼及其所有依賴項的 jar 文件 -在 Gradle 中創建 Fat Jar

  3. 將所有庫依賴項復制到lib文件夾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM