簡體   English   中英

使用 Spring Boot 作為來自普通 JAR 和 Gradle 的傳遞依賴項

[英]Use Spring Boot as a transitive dependency from common JAR with Gradle

我有一個公共庫,它作為 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'

我發現了這個問題。 我沒有在配置中包含api ,因此應用程序無法解析版本。 通過更新我的公共庫中的 build.gradle 來修復,如下所示:

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

暫無
暫無

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

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