programing

Gradle에서 BuildProperties bean 자동 배선 - NoSch BeanDefinition예외.

stoneblock 2023. 3. 25. 09:15

Gradle에서 BuildProperties bean 자동 배선 - NoSch BeanDefinition예외.

Gradle 빌드 파일에서 Java 어플리케이션 버전을 가져오려고 합니다.여기 지시사항을 따르고 있습니다.

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-build.html

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-
        plugin:1.5.7.RELEASE")
    }
}

project.version = '0.1.0'

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

springBoot  {
    buildInfo()
}

jar {
    baseName = 'ci-backend'
}

war {
   baseName = 'ci-backend'
}

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework:spring-jdbc")
    compile("joda-time:joda-time")

    compile("com.opencsv:opencsv:3.9")
    compile("org.springframework.batch:spring-batch-core")

    testCompile('org.springframework.boot:spring-boot-starter-test')
    providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
 }

gradle로 지은 후build-info.properties파일이 build/resources/main/META-INF/build-info.properties에 있습니다.

인마이@RestController빌드 속성 bean을 자동 연결하려고 합니다.

@Autowired
private BuildProperties buildProperties;

다음과 같은 에러가 발생합니다.

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.boot.info.BuildProperties' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1493)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
... 41 more

제 생각엔BuildPropertiesbean은 build-info.properties가 있으면 자동으로 생성됩니다.그것은 사실이 아닌 것 같다.

지금까지의 문제는 달랐을지도 모릅니다만, 저는 이 솔루션을 구글로 검색하려고 했습니다.다른 사람이 같은 문제에 직면했을 경우에 대비해, 이 글을 여기에 투고합니다.오류 메시지는 다음과 같습니다.

Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.boot.info.BuildProperties' available

이는 IntelliJ 내에서 실행하려고 할 때만 해당되며 명령줄에서 gradle을 사용하여 실행할 때는 해당되지 않습니다.(또한 이는 Spring Boot에만 해당될 수 있습니다.)

「빌드, 실행, 전개」-> 「빌드 툴」-> 「그라들」에서 「IDE 빌드/실행 액션의 위임」을 설정하면, IDE 로부터 빌드 할 때에 「boot Build Info」태스크를 실행할 수 있게 됩니다.

Maven 프로젝트의 경우 IntelliJ "Preferences..."에서 [Build, Execution, Deployment]> [ Build Tools ]> [ Maven ]> [ Runner ]에서 [Delegate IDE build / run actions to Maven]옵션을 선택합니다.

당신의 추정이 옳습니다.이 존재하면 콩이 자동으로 생성됩니다.

다음 자동 구성 코드를 참조하십시오.

@ConditionalOnResource(
    resources = {"${spring.info.build.location:classpath:META-INF/build-info.properties}"}
)
@ConditionalOnMissingBean
@Bean
public BuildProperties buildProperties() throws Exception {
    return new BuildProperties(this.loadFrom(this.properties.getBuild().getLocation(), "build"));
}

그러나 응용 프로그램콘텍스트에서 빈을 사용할 수 없는 경우는, 다음의 어느쪽인가를 시험해 주세요.

  1. 다음 사항을 확인합니다.buildInfogradle 태스크가 올바르게 구성되었습니다.실행gradlew bootBuildInfo --debug결과를 검증합니다.
  2. IDE 출력 디렉토리가 gradle의 빌드 디렉토리와 다른지 확인합니다.예를 들어 intellij는out디렉토리(이 경우는build-info.properties파일이 존재하지 않았습니다.)
  3. gradle 플러그인을 업그레이드해 주세요.패치가 릴리스 될 때까지 기다리지 않으면 다음 해크를 사용할 수 있습니다.https://github.com/spring-projects/spring-boot/issues/12266, 를 클릭해 주세요.

    def removeBootBuildInfoWorkaround12266 = task(type: Delete, 'removeBootBuildInfoWorkaround12266') {
        delete new File(buildDir, 'resources/main/META-INF/build-info.properties')
    }
    tasks.find { it.name == 'bootBuildInfo' }.dependsOn(removeBootBuildInfoWorkaround12266)
    

도움이 됐으면 좋겠다.

gradle Runner를 사용하도록 Intelij를 설정하여 build.properties 파일을 out 폴더에 생성해야 합니다.설정(설정) | 빌드, 실행, 전개 | 빌드 도구 | 그래들 | 러너 탭에서 IDE 빌드/실행 액션을 그래들옵션에 위임합니다.

이 질문이 오래된 건 알지만 오늘 우연히 만나서 다른 해결책을 공유하고 싶었어요.다른 패키지에 있는 IntelliJ에서 테스트를 실행하고 있었습니다(주석을 추가하여 설정을 로드하는 것을 제한할 수 있지만 메인 패키지에만 존재할 수 있습니다).

예시는 kotlin에 있습니다.

@Configuration
class IntegrationAppConfig {
    @Bean
    @ConditionalOnMissingBean(BuildProperties::class)
    fun buildProperties(): BuildProperties = BuildProperties(Properties()).also {
        logger.error("BuildProperties bean did not auto-load, creating mock BuildProperties")
    }
}

이것에 의해, 필요에 따라서 IntelliJ 를 계속 사용할 수 있습니다.Gradle 를 거치지 않아도 됩니다.

최신 버전의 Intelij에는 빌드, 실행, 전개 -> 빌드 도구 -> 그라들 -> 러너 경로가 없습니다.

같은 결과를 얻으려면 "Build, Execution, Deployment -> Build Tools -> Gradle -> Gradle projects"로 이동하고 "Build and run using:"에서 Gradle을 선택합니다.

@Mike Emery 응답에 추가하기 위해 다음과 같은 Java 코드를 찾았습니다.

@Bean @ConditionalOnMissingBean(BuildProperties.class)
BuildProperties buildProperties() {
    log.error("BuildProperties bean did not auto-load, creating it");
    return new BuildProperties(new Properties());
}

저도 같은 문제에 직면해 있었습니다만, IDE에 빌드 하는 대신 maven verion(3.3.9)을 업그레이드해 커맨드 프롬프트를 짜넣은 것도 문제가 있었습니다.이것이 나에게 있어서 이상한 일이라는 것을 알고 있습니다만, 이것은 효과가 있었습니다.

build.gradle했습니다: 이제문 resolved resolved resolved resolved resolved resolved resolved resolved resolved resolved resolved 。

springBoot {
    buildInfo()
}

IDE 에 문제가 발생했을 경우는, 이 수정을 시험해 보겠습니다.

★★★★★★★★★★★★★★★로 이동File -> Settings

."Build, Execution, Deployment"->Build Tools->Gradle->Runner

여기에 이미지 설명 입력

이 단계는 이미 저자에 의해 이루어졌지만, 나는 저자와 같은 오류를 발견했고 아무것도 도움이 되지 않았다.하지만 이 점이 도움이 되었습니다.

build.gradle에 추가해서 해결했습니다.

springBoot {
    buildInfo()
}

언급URL : https://stackoverflow.com/questions/46439505/autowiring-buildproperties-bean-from-gradle-nosuchbeandefinitionexception