Spring 3.2를 사용 중인 java 7 애플리케이션을 java 8 애플리케이션으로 전환하는 내용을 소개한다.

먼저 spring 3.2.4를 사용 중인 java7 애플리케이션을 바로 java 8로 컴파일하면, 바로 에러가 발생한다.

Caused by: org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet:

; nested exception is java.lang.IllegalArgumentException
    at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:56)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
    at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:102)
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:266)

    ... 64 more 

원인은 spring core의 asm이 java 8을 지원하지 않는다. (참고로 3.2.4 부터 spring-asm 모듈은 spring-core로 흡수되고, 사라졌다) 3.2.9부터 spring asm이 java 8 byte code을 인식할 수 있다. 하지만, fully가 아닌 best effort 수준이다. 완벽한 java 8은 spring 4부터 사용 가능하다.

(참고로 asm 모듈은 바이트 코드 분석 및 생성 역할을 한다.)

참고 : 



* 주의 사항은 지라에 잘 쓰여져 있다. 버전 이슈가 있어서 신중하게 쓸 필요가 있다. (현재는 3.2.17까지 릴리즈 된 상태이다)

With straightforward use of -target 1.8, there aren't many limitations to begin with. Spring 3.2.13 even includes the latest ASM 5.0.3 in the meantime, so it's fully up to date at that front. The only part worth noting is the AspectJ version: If you happen to be using AspectJ and in particular load-time weaving, there may be issues on Java 8 unless you upgrade to AspectJ 1.8.5; however, Spring 3.2.13 just supports AspectJ 1.7.4 - we haven't tested it with AspectJ 1.8.x at all.

Beyond that, Spring 3.2.x simply doesn't include any dedicated Java 8 support: i.e. no JSR-310 date-time, no parameter discovery via -parameters, etc. If you don't intend to rely on those features initially, that's by no means a showstopper. I would just strongly recommend an upgrade to Spring 4.x as soon as you intend to embrace Java 8 more fully. For the time being, using Spring 3.2.13 on Java 8 will get you quite far and is entirely safe for your purposes.

Note that we'll release 3.2.14 in May, as a minimal maintenance release, so that line is still actively supported for the time being. There's also a 3.2.15 release planned towards the end of this year, again designed as a very minimal maintenance release. Please be prepared that the 3.2.x line will fade out at that point, with its eventual end of life to be expected for mid/late 2016 and in all likelihood just one further maintenance release (3.2.16) to appear until then.

그 다음으로 수정한 것은 var argument 수정이었다.

java7에서는 적당히 쓸 수 있었는데. java8에서는 ambigous 한 문법이라고 문법 에러를 발생한다. 예를 들어, 

클래스에 test(String a, Object... args)와 test(String a, Message... args)는 java7에서 동작하지만, java8에서는 동작되지 않는다.

Posted by 김용환 '김용환'