Weblogic 10.3.X에서 JPA 2.0 어플 구동 시키기 기술

요즘 매일 같이 험난한 장벽이 앞을 가로 막네요… -_-

웹로직을 처음 써보다보니 이게 내문제인지 웹로직문제인지… 암튼 한 12시간 정도 걸려 어플을 구동시켰네요. 

웹로직에 어플을 올리려고 하다 만난 문제중 가장 위험한 문제였던 JPA 버전 미스매치 문제에 대한 나름대로의 해결책을 적어 보았습니다. 



Weglogic 10.3.x는 기본적으로 JPA 1.0 기반의 WAS이죠  
여기에서 JPA 2.0 어플을 기동시키면 Weblogic에서 제공하는 JPA 1.0 라이브러리들과 충돌을 일으킵니다. 
Webllogic 구동 스크립트에 Classpath를 지정하면 hibernate-validator와 충돌을 일으키거나 또는 classpath에서 EntityManager를 찾을수 없다고 나오는등 매우 다양한 오류가 발생합니다. 


장시간의 조사결과 매우 간단하게 해결 하는 방법을 알아 냈습니다. 
(very thank you to  http://mightymediocremusings.wordpress.com/2012/07/16/configuring-your-hibernate-jpa-2-0-application-to-work-in-weblogic-10/ ) 





다음 과정을 거치면 서버 설정 또는 구동 스크립트의 변경없이 JPA 2.0 어플을 구동시킬수 있다. 

1. META-INF/persistence.xml의 파일명을 project-persistence.xml로 변경한다. 
웹로직은 웹어플리케이션의 /WEB-INF/classes/META-INF/persistence.xml 이 존재하면 JPA 엔진을 구동시키는데,  파일명을 변경하면 이를 회피할수 있게 된다. 


2. Spring에서 JPA 2.0 구동 설정을 1번에서 변경한 파일을 사용하게 변경한다. 
@Bean
public EntityManagerFactory entityManagerFactory() {
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setPersistenceXmlLocation("classpath:META-INF/project-persistence.xml");
factory.setDataSource(dataSource);
factory.setPersistenceUnitName(persistentUnitName);
factory.setPackagesToScan(packagesToScan);
factory.setJpaVendorAdapter(jpaVendorAdapter);
factory.afterPropertiesSet();
return factory.getObject();
}


3. /WEB-INF/weblogic.xml에 <prefer-application-packages> 설정을 추가한다. 
이 설정을 통해 weblogic의 라이브러리가 아닌 어플리케이션의 라이브러리를 사용하게 된다. 
JPA 뿐만이 아니고 Spring도 포함시켜야 weblogic에 포함된 예전 버전의 스프링을 사용하지 않게 된다. 


<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app
xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.2/weblogic-web-app.xsd">
<wls:container-descriptor>
<wls:prefer-application-packages>
    <wls:package-name>antlr.*</wls:package-name>
    <wls:package-name>org.apache.commons.*</wls:package-name>
    <wls:package-name>org.apache.xmlbeans.*</wls:package-name>
    <wls:package-name>org.springframework.*</wls:package-name>
    <wls:package-name>org.hibernate.*</wls:package-name>
    <wls:package-name>javax.persistence.*</wls:package-name>
    <wls:package-name>org.joda.*</wls:package-name>
   </wls:prefer-application-packages>
  </wls:container-descriptor>
 </wls:weblogic-web-app>


이상의 과정을 거치면 간단하게 JPA 2.0 기반의 어플리케이션을 weblogic 10.3.X에 올릴수 있다. 

유사한 문제들이 JPA 1.0 기반의 WAS들에서 발생하는데 이 방법을 통해 대체로 해결 되는것으로 보입니다. 


덧글

  • 난누구여긴어디 2013/05/30 02:16 #

    WAS 사용하다보면 이런 문제들이 의외로 많더군요.
    저도 예전에 SOAP 관련 라이브러리 버전 불일치나 JVM 버전 불일치 문제로 고생해본 경험이 있습니다.
    며칠전 아는분께서 제우스에서는 Get과 Post 밖에 지원하지 않아 Rest 서비스가 힘들다고 하더군요.
    어쨌든 힘내세요~! ^^
※ 로그인 사용자만 덧글을 남길 수 있습니다.