Springdoc 종속성에서 GraalVM 네이티브 이미지 실패
Aug 18 2020
스프링 부트와 GraalVM 네이티브 이미지를 사용하여 샘플 애플리케이션을 만들려고하지만 Springdoc에 대한 종속성을 추가하자마자 생성 된 실행 파일은 다음과 같은 이유로 더 이상 작동하지 않습니다.
java.lang.IllegalStateException: Error processing condition on org.springdoc.core.SpringDocConfiguration.springdocBeanFactoryPostProcessor2
at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:60) ~[poc-graalvm-native.exe:na]
at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108) ~[na:na]
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:184) ~[na:na]
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:144) ~[na:na]
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120) ~[na:na]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) ~[poc-graalvm-native.exe:na]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:236) ~[poc-graalvm-native.exe:na]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:280) ~[na:na]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:96) ~[na:na]
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:707) ~[na:na]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:533) ~[na:na]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[na:na]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[poc-graalvm-native.exe:na]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) ~[poc-graalvm-native.exe:na]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[poc-graalvm-native.exe:na]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[poc-graalvm-native.exe:na]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[poc-graalvm-native.exe:na]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[poc-graalvm-native.exe:na]
at c.b.t.graal.GraalVMApplicationPoc.main(GraalVMApplicationPoc.java:31) [poc-graalvm-native.exe:na]
Caused by: java.lang.IllegalStateException: java.io.FileNotFoundException: class path resource [org/springdoc/core/CacheOrGroupedOpenApiCondition$OnCacheDisabled.class] cannot be opened because it does not exist at org.springframework.boot.autoconfigure.condition.AbstractNestedCondition$MemberConditions.getMetadata(AbstractNestedCondition.java:149) ~[poc-graalvm-native.exe:na]
at org.springframework.boot.autoconfigure.condition.AbstractNestedCondition$MemberConditions.getMemberConditions(AbstractNestedCondition.java:121) ~[poc-graalvm-native.exe:na] at org.springframework.boot.autoconfigure.condition.AbstractNestedCondition$MemberConditions.<init>(AbstractNestedCondition.java:114) ~[poc-graalvm-native.exe:na]
at org.springframework.boot.autoconfigure.condition.AbstractNestedCondition.getMatchOutcome(AbstractNestedCondition.java:62) ~[poc-graalvm-native.exe:na]
at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47) ~[poc-graalvm-native.exe:na]
... 18 common frames omitted
Caused by: java.io.FileNotFoundException: class path resource [org/springdoc/core/CacheOrGroupedOpenApiCondition$OnCacheDisabled.class] cannot be opened because it does not exist at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:180) ~[poc-graalvm-native.exe:na] at org.springframework.core.type.classreading.SimpleMetadataReader.getClassReader(SimpleMetadataReader.java:55) ~[na:na] at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:49) ~[na:na] at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103) ~[na:na] at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:81) ~[na:na] at org.springframework.boot.autoconfigure.condition.AbstractNestedCondition$MemberConditions.getMetadata(AbstractNestedCondition.java:146) ~[poc-graalvm-native.exe:na]
... 22 common frames omitted
내 현재 종속성은 다음과 같습니다.
dependencies {
implementation ('org.springframework.boot:spring-boot-starter-web') {
exclude group : 'org.apache.tomcat.embed', module : 'tomcat-embed-websocket'
}
implementation("org.springframework.boot:spring-boot-starter-actuator")
// Lombok
compileOnly("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")
testCompileOnly("org.projectlombok:lombok")
testAnnotationProcessor("org.projectlombok:lombok")
// https://mvnrepository.com/artifact/org.slf4j/jcl-over-slf4j
implementation('org.slf4j:jcl-over-slf4j:2.0.0-alpha1')
implementation('org.springdoc:springdoc-openapi-webmvc-core:1.4.4')
}
SpringDoc을 추가 할 때까지 모든 것이 잘 작동했습니다. 이미 성공하지 않고 --initialize-at-build-time에 일부 springdoc 패키지를 추가하려고 시도했습니다.
com.github.ayltai.spring-graalvm-native-plugin을 사용하여 gradle 작업을 처리하고 있으며 종속성은 다음과 같습니다.
dependencies {
implementation ('org.springframework.boot:spring-boot-starter-web') {
exclude group : 'org.apache.tomcat.embed', module : 'tomcat-embed-websocket'
}
implementation("org.springframework.boot:spring-boot-starter-actuator")
// Lombok
compileOnly("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")
testCompileOnly("org.projectlombok:lombok")
testAnnotationProcessor("org.projectlombok:lombok")
// https://mvnrepository.com/artifact/org.slf4j/jcl-over-slf4j
implementation('org.slf4j:jcl-over-slf4j:2.0.0-alpha1')
implementation('org.springdoc:springdoc-openapi-webmvc-core:1.4.4')
}
힌트를 주시면 감사하겠습니다.
답변
1 brianbro Aug 31 2020 at 09:25
현재로서는 봄 애플리케이션과 graalVM의 통합이 아직 실험 모드에 있고 다른 많은 문제에 직면 할 수 있기 때문에 공식적인 Spring Gradle 플러그인이 없습니다.
발생한 오류는 기본 구성 이미지가 완전하지 않기 때문입니다.
Spring Team에서 지원하고 springdoc-openapi의 매력처럼 작동하는 spring-graalvm-native를 사용할 수 있습니다.
사용법은 모두 여기에 설명되어 있습니다.
- https://repo.spring.io/milestone/org/springframework/experimental/spring-graalvm-native-docs/0.7.1/spring-graalvm-native-docs-0.7.1.zip!/reference/index.html#_guides
언급 한 클래스의 경우 reflect-config.json에 있어야합니다.
{
"name": "org.springdoc.core.CacheOrGroupedOpenApiCondition",
"methods": [
{
"name": "<init>",
"parameterTypes": []
}
]
}
그리고 resource-config.json에서 :
{"pattern":"\\Qorg/springdoc/core/CacheOrGroupedOpenApiCondition$OnCacheDisabled.class\\E"}, {"pattern":"\\Qorg/springdoc/core/CacheOrGroupedOpenApiCondition$OnMultipleOpenApiSupportCondition.class\\E"},
{"pattern":"\\Qorg/springdoc/core/CacheOrGroupedOpenApiCondition.class\\E"}