【问题标题】:Use Spring Boot as a transitive dependency from common JAR with Gradle使用 Spring Boot 作为通用 JAR 和 Gradle 的传递依赖项
【发布时间】:2021-02-14 12:51:25
【问题描述】:

我有一个公共库,它作为 jar 发布到本地 maven,然后由一组非常瘦的客户端应用程序使用。这些应用程序基本上将自己的配置提供给公共库并将自己初始化为 Spring 应用程序。

这个通用库使用 spring boot 和一堆其他依赖项。我的问题是,我是否可以将 spring boot 定义为应用程序中的依赖项,而简单地将公共库的 spring 版本用作所有应用程序中的传递依赖项?

我觉得这应该是可能的,但是当我尝试这样做时,springframework.org.boot 类没有被解析(例如:@SpringBootApplication 注释)。

这些是我的 build.gradle 文件:

来自公共库的build.gradle

plugins {
    id 'java-library'
    id 'maven-publish'
}

group 'com.my.group'
version '1.0-SNAPSHOT'

sourceCompatibility = '11'

repositories {
    mavenLocal()
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            groupId = 'com.my.group'
            artifactId = 'common-lib'
            version = '0-alpha.1'

            from components.java
        }
    }
}

configurations {
    springBom
    compileOnly.extendsFrom(springBom)
    annotationProcessor.extendsFrom(springBom)
    implementation.extendsFrom(springBom)
}

dependencies {
    springBom enforcedPlatform('org.springframework.boot:spring-boot-dependencies:2.3.5.RELEASE')

    api 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    implementation 'org.springframework.cloud:spring-cloud-aws-messaging'

    annotationProcessor 'org.springframework.boot:spring-boot-autoconfigure-processor'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    
    // a few other non-spring dependencies
}

来自示例应用程序的 build.gradle

plugins {
    id 'java'
}

group = 'com.my.group'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenLocal()
}

dependencies {
    implementation group: 'com.my.group', name: 'common-lib', version: '0-alpha.1'
}

应用初始化示例

package com.my.group.Core;
// none of the below are resolved
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;

@SpringBootApplication(scanBasePackages = {"com.my.group"})
public class ConsumerApplication implements ApplicationRunner {

    @Autowired
    Core core;

    public ConsumerApplication() {
    }

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

    @Override
    public void run(ApplicationArguments args) {
        try {
            core.processEvents();
        } catch (ConfigurationException | InitializationException e) {
            e.printStackTrace();
        }
    }
}

如果我将以下依赖项添加到我的应用程序中,一切都会按预期工作。

springBom enforcedPlatform('org.springframework.boot:spring-boot-dependencies:2.3.5.RELEASE')
implementation 'org.springframework.boot:spring-boot-starter'

【问题讨论】:

    标签: java spring spring-boot gradle


    【解决方案1】:

    我发现了问题。我没有在配置中包含api,因此应用程序无法解析版本。通过像这样更新我的公共库中的 build.gradle 来修复:

    configurations {
        springBom
        compileOnly.extendsFrom(springBom)
        annotationProcessor.extendsFrom(springBom)
        implementation.extendsFrom(springBom)
        api.extendsFrom(springBom)
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 2019-07-26
      • 2023-03-27
      • 1970-01-01
      • 2014-03-09
      • 2015-05-15
      • 2014-04-18
      • 2015-06-28
      • 2018-01-31
      相关资源
      最近更新 更多