Java-buildpack: JBPλŠ” Spring Boot 2.0을 μ§€μ›ν•©λ‹ˆκΉŒ?

에 λ§Œλ“  2017λ…„ 09μ›” 01일  Β·  6μ½”λ©˜νŠΈ  Β·  좜처: cloudfoundry/java-buildpack

λͺ¨λ“  6 λŒ“κΈ€

아직 ν…ŒμŠ€νŠΈν•˜μ§€ μ•Šμ•˜μ§€λ§Œ μ‹€ν–‰ 방식( java -jar )이 λ³€κ²½λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ λ³€κ²½λ˜μ§€ μ•Šμ„ 것이라고 믿을 μ΄μœ κ°€ μ—†μŠ΅λ‹ˆλ‹€.

μ‹€μ œλ‘œ ν˜„μž¬ M3에 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이것은 MongoDBλ₯Ό μ‚¬μš©ν•  λ•Œλ§Œ λ°œμƒν•©λ‹ˆλ‹€. Cloud FoundryλŠ” MongoDB 연결을 μž¬κ΅¬μ„±ν•˜λ €κ³  μ‹œλ„ν•˜κ³  NoSuchMethodError λ©λ‹ˆλ‹€.

λ‚΄κ°€ λ³Ό 수 μžˆλŠ” ν•œ 이것은 spring-data-mongo μ’…μ†μ„±μ˜ μ£Όμš” λ³€κ²½ 사항 λ•Œλ¬Έμž…λ‹ˆλ‹€.

섀정은 λ‹€μŒμ„ μœ„ν•œ μŠ€νƒ€ν„°κ°€ ν¬ν•¨λœ κΈ°λ³Έ Spring Boot 2.0.0.M3 μ•±μž…λ‹ˆλ‹€.

  • 앑좔에이터
  • 데이터 λͺ½κ³ 
  • 편물
  • λ“±.

ν”„λ‘œμ νŠΈλŠ” μ—¬κΈ°μ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€:
https://github.com/nt-ca-aqe/library-app/tree/master/library-service

둜그 발췌:

2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] 2017-09-13 10:56:07.083 ERROR [] --- [ main] o.s.boot.SpringApplication : Application startup failed
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] java.lang.NoSuchMethodError: org.springframework.data.mongodb.core.SimpleMongoDbFactory.<init>(Lcom/mongodb/Mongo;Ljava/lang/String;)V
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.cloudfoundry.reconfiguration.org.springframework.cloud.service.document.MongoDbFactoryCreator.createMongoDbFactory(MongoDbFactoryCreator.java:50)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.cloudfoundry.reconfiguration.org.springframework.cloud.service.document.MongoDbFactoryCreator.create(MongoDbFactoryCreator.java:37)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.cloudfoundry.reconfiguration.org.springframework.cloud.service.document.MongoDbFactoryCreator.create(MongoDbFactoryCreator.java:31)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.cloudfoundry.reconfiguration.org.springframework.cloud.Cloud.getServiceConnector(Cloud.java:245)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.cloudfoundry.reconfiguration.org.springframework.cloud.Cloud.getSingletonServiceConnector(Cloud.java:155)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.cloudfoundry.reconfiguration.spring.AbstractCloudServiceBeanFactoryPostProcessor.reconfigureBean(AbstractCloudServiceBeanFactoryPostProcessor.java:119)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.cloudfoundry.reconfiguration.spring.AbstractCloudServiceBeanFactoryPostProcessor.processBean(AbstractCloudServiceBeanFactoryPostProcessor.java:112)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.cloudfoundry.reconfiguration.spring.AbstractCloudServiceBeanFactoryPostProcessor.processBeans(AbstractCloudServiceBeanFactoryPostProcessor.java:97)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.cloudfoundry.reconfiguration.spring.AbstractCloudServiceBeanFactoryPostProcessor.postProcessBeanFactory(AbstractCloudServiceBeanFactoryPostProcessor.java:63)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:282)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:127)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:693)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:122)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:386)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1245)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1233)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at library.service.ApplicationKt.main(Application.kt:17)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at java.lang.reflect.Method.invoke(Method.java:498)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
2017-09-13T12:56:07.084+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
2017-09-13T12:56:07.085+02:00 [APP/PROC/WEB/0] [OUT] 2017-09-13 10:56:07.085 INFO [] --- [ main] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext<strong i="19">@2cfb4a64</strong>: startup date [Wed Sep 13 10:56:02 UTC 2017]; root of context hierarchy
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] 2017-09-13 10:56:07.087 WARN [] --- [ main] ConfigServletWebServerApplicationContext : Exception thrown from LifecycleProcessor on context close
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext<strong i="20">@2cfb4a64</strong>: startup date [Wed Sep 13 10:56:02 UTC 2017]; root of context hierarchy
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.context.support.AbstractApplicationContext.getLifecycleProcessor(AbstractApplicationContext.java:433)
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1004)
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:963)
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:808)
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.SpringApplication.run(SpringApplication.java:338)
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1245)
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1233)
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at library.service.ApplicationKt.main(Application.kt:17)
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at java.lang.reflect.Method.invoke(Method.java:498)
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
2017-09-13T12:56:07.088+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] 2017-09-13 10:56:07.089 ERROR [] --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Destroy method on bean with name 'org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory' threw an exception
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext<strong i="21">@2cfb4a64</strong>: startup date [Wed Sep 13 10:56:02 UTC 2017]; root of context hierarchy
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:420)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.context.support.ApplicationListenerDetector.postProcessBeforeDestruction(ApplicationListenerDetector.java:95)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:240)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:582)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:558)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:952)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:527)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.destroySingletons(FactoryBeanRegistrySupport.java:228)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:959)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1035)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1011)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:963)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:808)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.SpringApplication.run(SpringApplication.java:338)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1245)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1233)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at library.service.ApplicationKt.main(Application.kt:17)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at java.lang.reflect.Method.invoke(Method.java:498)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
2017-09-13T12:56:07.089+02:00 [APP/PROC/WEB/0] [OUT] at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
2017-09-13T12:56:07.446+02:00 [APP/PROC/WEB/0] [OUT] Exit status 1

예, 이것은 μžλ™ μž¬κ΅¬μ„± λ¬Έμ œμž…λ‹ˆλ‹€. μš°λ¦¬λŠ” Spring Data둜의 μ£Όμš” 버전 μ—…κ·Έλ ˆμ΄λ“œλ₯Ό μœ„ν•΄ μ€€λΉ„λ˜μ§€ μ•Šμ•˜μ„ 수 μžˆλŠ” Spring Cloud Connectors의 버전에 μ˜μ‘΄ν•©λ‹ˆλ‹€. @scottfrederick 은 이것을 μ•Œκ³  있고 λ‚΄κ°€ ν•΄μ•Ό ν•  일은 Spring Cloud Connectors의 μƒˆ 버전을 μ‚¬μš©ν•˜κΈ° μ‹œμž‘ν•˜λŠ” κ²ƒλΏμž…λ‹ˆκΉŒ?

Java ν…ŒμŠ€νŠΈ μ‘μš© ν”„λ‘œκ·Έλž¨μ„ Boot 2.0 으둜 μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€. κ·Έ μž‘μ—…μ— λ”°λ₯΄λ©΄ λ¬Έμ œκ°€ μžˆλŠ” κ²ƒμœΌλ‘œ λ³΄μ΄λŠ” μœ μΌν•œ 것은 Spring Data Mongo의 μžλ™ μž¬κ΅¬μ„±μ΄ 깨진 것 κ°™λ‹€(API λ³€κ²½). λ‚˜λŠ” 이 문제λ₯Ό 이에 λŒ€ν•œ μ§€ν‘œλ‘œ 남겨두고 μˆ˜μ • 사항이 마련되면 닫을 κ²ƒμž…λ‹ˆλ‹€.

μ–Έμ œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? λ˜ν•œ ν˜„μž¬ 적용 κ°€λŠ₯ν•œ ν•΄κ²° 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

μš°λ¦¬λŠ” μ œκ³΅μ— 맀우 κ°€κΉμ§€λ§Œ @scottfrederick 이 Spring Cloud Connectors의 릴리슀λ₯Ό μˆ˜ν–‰ν•˜κΈ°λ₯Ό μ—¬μ „νžˆ 기닀리고 μžˆμŠ΅λ‹ˆλ‹€. μžλ™ μž¬κ΅¬μ„±μ„ λ‹¨μˆœν™”ν•˜κ³  Spring Cloud Connectors 2.xλ₯Ό μ‚¬μš©ν•˜λ„λ‘ μ—…κ·Έλ ˆμ΄λ“œν•˜κΈ° μœ„ν•΄ μƒλ‹Ήν•œ μž‘μ—… 을 λŠ” κ΅¬μ„±λœ λͺ¨λ“  μœ ν˜•μ΄ Boot 1.x와 Boot 2.xμ—μ„œ λͺ¨λ‘ ν˜Έν™˜λ˜λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ μ œμΆœν–ˆμŠ΅λ‹ˆλ‹€ . 이것은 ν¬ν•¨λ˜μ—ˆμ§€λ§Œ 아직 ν…ŒμŠ€νŠΈ μ€‘μž…λ‹ˆλ‹€. 일단 μΆœμ‹œλ˜λ©΄ μš°λ¦¬λŠ” 그것을 μ†ŒλΉ„ ν•˜κ³  μžλ™ μž¬κ΅¬μ„±μ˜ μƒˆ 버전을 μ•ΌμƒμœΌλ‘œ κ°€μ Έμ˜¬ κ²ƒμž…λ‹ˆλ‹€.

MongoDB μžλ™ μž¬κ΅¬μ„±μ„ μ œμ™Έν•œ λͺ¨λ“  것이 였늘 μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜λ―€λ‘œ μ‹€μ œλ‘œ ν•΄κ²°ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. MongoDB의 μžλ™ μž¬κ΅¬μ„±μ„ μ‹œλ„ν•˜λŠ” 경우 μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•˜λ„λ‘ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λͺ…μ‹œμ μœΌλ‘œ κ΅¬μ„±ν•˜λŠ” 것 μ™Έμ—λŠ” ν•΄κ²° 방법이 μ—†μŠ΅λ‹ˆλ‹€(μ–΄μ¨Œλ“  μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. μžλ™ μž¬κ΅¬μ„±μ€ ν”„λ‘œλ•μ…˜ μ‹œμŠ€ν…œμ— 쒋은 선택이 μ•„λ‹™λ‹ˆλ‹€).

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰