首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当Project没有自己的类时,Gradle 'Implementation‘依赖项是运行时范围的

当Project没有自己的类时,Gradle 'Implementation‘依赖项是运行时范围的
EN

Stack Overflow用户
提问于 2019-06-04 18:52:58
回答 1查看 1.5K关注 0票数 1

我已经为一个定制的Spring启动程序构建了一个Gradle多项目。按照Starter约定,我的类都在一个“自动配置”项目中,并且我有一个单独的“初学者”项目,它只带来使用自动配置所需的依赖关系。

多项目构建产生两个不可运行的jars,一个用于自动配置子项目,一个用于初学者子项目。我的新项目就是使用这个初学者,但是当我使用来自传递依赖的类时,我的项目在类路径上的任何地方都找不到它们。

当我深入了解初学者jar时,我发现它定义的所有依赖项都是运行时作用域,这将解释问题的原因。我可以通过将初学者中的所有依赖项设置为“编译”而不是“实现”来“解决”问题,但我的理解是,“编译”即将结束,而且“实现”依赖关系应该是编译范围的。有人能告诉我需要什么额外的配置才能将初学者依赖项定义为“实现”,而不会在结果jar中将它们的作用域定义为“运行时”?

我的初学者/自动配置多项目 gradle文件:

代码语言:javascript
复制
plugins {
    id 'org.springframework.boot' version '2.1.4.RELEASE' apply false
    id 'io.spring.dependency-management' version '1.0.7.RELEASE' apply false
}

wrapper {
    gradleVersion = '5.2.1'
}

repositories {
    mavenLocal()
    // private repo info omitted
    mavenCentral()
    jcenter()
}

subprojects {
    apply plugin: 'java'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'
    apply plugin: 'maven-publish'
    apply plugin: 'java-library'

    group = 'com.mystarter'

    repositories {
        mavenLocal()
        // private repo info omitted
        mavenCentral()
        jcenter()
    }

    dependencies {
        annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor"
        annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
    }

    bootJar {
        enabled = false
    }

    jar {
        enabled = true
    }

    javadoc {
        failOnError = false
        options.addStringOption('Xdoclint:none', '-quiet')
    }

    task sourcesJar(type: Jar) {
        from sourceSets.main.allJava
        classifier = 'sources'
    }
    task javadocJar(type: Jar) {
        from javadoc
        classifier = 'javadoc'
    }

    publishing {
        publications {
            myProjStarterArtifacts(MavenPublication) {
                from components.java
                artifact sourcesJar
                artifact javadocJar
            }
        }
        repositories {
            // private repo info omitted
        }
    }

    tasks.build.finalizedBy tasks.publishToMavenLocal
}

我的初学者子项目的构建文件:

代码语言:javascript
复制
dependencies {
    compile project(':myproj-spring-boot-autoconfig')

    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.security:spring-security-cas'
    implementation 'org.springframework.security:spring-security-ldap'
}

如果我将上面的“实现”行更改为“编译”行,则生成的pom文件将停止生成这4个依赖项的“运行时”作用域,而将它们正确地限定为“编译”。顺便提一句,“编译项目”行工作得很好,只是那些“实现”行似乎不像我所期望的那样工作,当项目没有自己的类时。

我的新项目依赖于我的启动:

代码语言:javascript
复制
dependencies {
    implementation('com.myproj:myproj-spring-boot-starter:1.0.0')
    // other dependencies
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-13 08:48:44

在Gradle项目中定义的implementation依赖只对该项目的使用者(即通过设计)的runtimeClasspath进行传递。

如果您有一个没有代码但只定义依赖项的项目,请考虑为它使用java-platform插件,它允许您指定约束和可选的依赖项。

否则,如果您希望项目在编译时向使用者公开其依赖项,则应该使用api配置来声明它们,而不是compile,因为compile确实正在退出。

有关更多细节,请参见文档

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56449729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档