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
제 생각엔BuildProperties
bean은 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"));
}
그러나 응용 프로그램콘텍스트에서 빈을 사용할 수 없는 경우는, 다음의 어느쪽인가를 시험해 주세요.
- 다음 사항을 확인합니다.
buildInfo
gradle 태스크가 올바르게 구성되었습니다.실행gradlew bootBuildInfo --debug
결과를 검증합니다. - IDE 출력 디렉토리가 gradle의 빌드 디렉토리와 다른지 확인합니다.예를 들어 intellij는
out
디렉토리(이 경우는build-info.properties
파일이 존재하지 않았습니다.) 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
'programing' 카테고리의 다른 글
Angular를 위한 사용 사례JS 및 JQuery (0) | 2023.03.25 |
---|---|
각도: 날짜 필터에 시간대가 추가됩니다. UTC를 출력하려면 어떻게 해야 합니까? (0) | 2023.03.25 |
Intelij, 타겟 JRE vesion이 프로젝트 jdk 버전과 일치하지 않습니다. (0) | 2023.03.25 |
동화책 꼬리바람.스토리북에 순풍을 추가하는 방법 (0) | 2023.03.25 |
wordpress is_home() | is_index()가 가능합니까? (0) | 2023.03.25 |