JEUS 7.0 Hibernate 5.x 설정 가이드
1. 개요
JEUS7.0에서 Spring Framework+ hibernate Validator 5.x 으로 개발한 Application을 Deploy시에 Validation-api
버전이슈로아래와 같은 Java.lang.NoSuchMethodError가 발생하며 Deploy가 fail 되는 현상이 있습니다.
Java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider; |
JEUS7.0의 경우Validation-api의 spec은 1.0 이며, $JEUS_HOME/lib/system/javaee.jar에 포함되어 있습니다.
HibernateValidator 5.x을사용하는 경우 아래와 같이 Validation-api 1.1을 참조하고 있습니다.
Reference implementation Hibernate Validator 5.x is the reference implementation Bean Validation 1.1! |
이현상은 런타임 시점에 JEUS 7.0의 Validation-api를먼저 참조하여 발생하는 현상입니다.
기존에는 $JEUS_HOME/lib/endorsed에validation-api-1.1.0.Final.jar 추가하는 방식으로 설정하여 해결하였습니다.
그러나, 이 방법은 아래와 같이 문제점이 발생할 수 있습니다.
1)Hibernate 5.x를사용하기 위하여 JEUS7.0 전체 ClassLoader에영향을 주기 때문에 application마다hibernate-validator의 버전이 상이하여 validation-api spec이서로 다른 경우에 이슈가 발생할 수 있습니다.
2)JEUS 7.0 fix4의경우 webadmin이 validation-api spec이슈로 deploy fail이 발생하는 이슈가 발생합니다.
( 조치방법 :$JEUS_HOME/lib/shared에 hibernate-validator를 5.x로 업그레이드해야 합니다. )
다른 방법으로 Boot Classloader Append Class Path 설정방법은 JEUS 7.0 전체 ClassLoader에 영향없이 특정 MS
(ManagedServer)만 설정이 가능합니다.
2. 설정방법
2.1Boot Classloader Append Class Path 설정
아래의 webadmin 화면에서validation-api-1.1.0.Final.jar 라이브러리의 절대경로를 설정 후에MS(ManagedServer)를
재기동하시면됩니다.
( 참고사항 : 이 설정은$JEUS_HOME/lib/system 보다 런타임 시점에 ClassLoading 순서가더 우선순위입니다. )
ü Servers> MS(ManagedServer)선택 > Basic > Basic Info > 고급선택사항 > BootClassloader Append Class Path
1) 설정방법
①Webadmin 메뉴 이동 : Servers > MS(ManagedServer)선택 > Basic > Basic Info > 고급선택사항 > BootClassloader Append Class Path ②Lock & Edit 버튼 클릭 ③ Boot Classloader Append Class Path 설정 추가 ( 예제 : /wasapp/shimsh/WEB-INF/lib/validation-api-1.1.0.Final.jar: /wasapp/shimsh/WEB-INF/lib/hibernate-jpa-2.1-api-1.0.0.Final.jar ) ④ Activate 버튼 클릭 ⑤ 설정한 MS(ManagedServer) stop ⑥ 설정한 MS(ManagedServer) start ⑦ Application Deploy |
2) 설정예제
① webadmin 메뉴 이동 : Servers > server1 > Basic > Basic Info > 고급선택사항 > Boot Classloader Append Class Path ② Lock & Edit 버튼 클릭 ③ Boot Classloader Append Class Path 설정 추가 : /wasapp/shimsh/WEB-INF/lib/validation-api-1.1.0.Final.jar: /wasapp/shimsh/WEB-INF/lib/hibernate-jpa-2.1-api-1.0.0.Final.jar ④ Activate 버튼 클릭 ⑤ server1 stop ⑥ server1 start ⑦ Application Deploy ⑧ 참고자료 ( Server1 프로세스 확인 방법 ) 설정한 라이브러리가 bootstrap.jar 뒤에 오는 것을 확인할 수 있습니다..
|
3. 결론
3.1hibernate-validator 5.x를사용하는 경우
JEUS7.0 webadmin에서 Boot Classloader Append Class Path 설정방법으로validation-api-1.1.0.Final.jar 경로를
설정합니다. 설정 이후에는 domain.xml에 아래의 내용이 추가되며, 설정한 MS를 재기동하면 적용됩니다.
<user-interceptor> <boot-classloader-append-class-path>/wasapp/shimsh/WEB-INF/lib/validation-api-1.1.0.Final.jar</boot-classloader-append-class-path> </user-interceptor> |
3.2hibernate-validator 5.x 과 jpa2.1을 사용하는 경우 ( JEUS 7.0의 JPA Spec은 2.0 )
JEUS7.0 webadmin에서 Boot Classloader Append Class Path 설정방법으로 validation-api-1.1.0.Final.jar,hibernate-jpa-2.1-api-1.0.0.Final.jar 경로를 설정합니다. 설정이후에는 domain.xml에 아래의 내용이 추가되며, 설정한 MS를 재기동하면 적용됩니다.
<user-interceptor> <boot-classloader-append-class-path>/wasapp/shimsh/WEB-INF/lib/validation-api-1.1.0.Final.jar:/home/shimsh/WEB-INF/lib/hibernate-jpa-2.1-api-1.0.0.Final.jar</boot-classloader-append-class-path> </user-interceptor> |
3.3 결론
개발된 Application이 라이브러리의 dependency가 있어 validation-api 나 JPA 등의 Spec이 JEUS 7.0과
다른경우에 위와 같이 JEUS 7.0 webadmin에서 BootClassloader Append Class Path 설정방법으로 해결하시기
바랍니다. (단,$JEUS_HOME/lib/endorsed에 있는 라이브러리는 제외)
4. 참고자료
4.1 런타임시점의 ClassLoading 우선순위 비교
◈ {Application-path}/WEB-INF/lib 와$JEUS_HOME/lib/shared 비교
1) Hibernate-validator 라이브러리 확인 : 동일 Class 존재함.
{Application-path}/WEB-INF/lib | stech:/wasapp/shimsh/WEB-INF/lib> jar tvf hibernate-validator-5.1.3.Final.jar | grep Version |
$JEUS_HOME/lib/shared | stech:/home/shimsh/jeus7004/lib/shared/hibernate-validator_4.3.1.Final> jar tvf hibernate-validator-repack.jar | grep -i version |
2) findClass.jsp로 확인결과
{Application-path}/WEB-INF/lib가 $JEUS_HOME/lib/shared 보다 런타임시점에 ClassLoading 순서가 더 빠름. |
3) 결론
MS(ManagedServer)에 deploy한 application의 라이브러리는 $JEUS_HOME/lib/shared의라이브러리보다
런타임 시점에 ClassLoading 우선 순위가 높기 때문에 영향을 받지 않습니다.
덧글