2010-04-28 2 views
3

Я пытаюсь включить весну и спящий режим в приложение, запущенное на сервере Weblogic 10.3. При запуске приложения на сервере, а доступ к TestServlet проверить мою конфигурацию, я получаю следующее исключение:Конфигурация Spring & hibernate (с использованием maven): java.lang.ClassNotFoundException: org.hibernate.cfg.Configuration

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mySessionFactory' defined in class path resource [spring-config/HorizonModelPeopleConnectionsSpringContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.orm.hibernate3.LocalSessionFactoryBean]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org.hibernate.cfg.Configuration 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:448) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:156) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:284) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:91) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:75) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:65) 
    at view.com.horizon.test.SpringHibernateServlet.doGet(SpringHibernateServlet.java:27) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) 
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) 
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292) 
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26) 
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) 
    at oracle.security.wls.filter.SSOSessionSynchronizationFilter.doFilter(SSOSessionSynchronizationFilter.java:279) 
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) 
    at oracle.dms.wls.DMSServletFilter.doFilter(DMSServletFilter.java:326) 
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) 
    at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27) 
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) 
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3592) 
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121) 
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2202) 
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2108) 
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1432) 
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201) 
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:173) 
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.orm.hibernate3.LocalSessionFactoryBean]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org.hibernate.cfg.Configuration 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:756) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:721) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:384) 
    ... 31 more 
Caused by: java.lang.NoClassDefFoundError: org.hibernate.cfg.Configuration 
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.class$(LocalSessionFactoryBean.java:158) 
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.(LocalSessionFactoryBean.java:158) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:85) 
    ... 35 more 

Я проверил мое приложение и .jar файл спящего режима включен, и содержит класс он говорит, что его отсутствует: org.hibernate.cfg.Configuration.

Приложение построено с maven. Эти зависимости файла JAR с помощью пружины и зимуют:

<!-- Frameworks --> 
    <!-- Hibernate framework --> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate</artifactId> 
    <version>3.2.7.ga</version> 
</dependency> 
<!-- Hibernate uses slf4j for logging, for our purposes here use the simple backend --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
     <version>1.5.2</version> 
</dependency> 
<!-- Hibernate gives you a choice of bytecode providers between cglib and javassist --> 
<dependency> 
    <groupId>javassist</groupId> 
    <artifactId>javassist</artifactId> 
     <version>3.4.GA</version> 
</dependency> 
    <!-- Spring framework --> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-orm</artifactId> 
    <version>2.5.6</version> 
</dependency> 

Сначала я думал, что это может быть проблема с версиями весной и спящий режим библиотеки, так что я пытался с разных, но все-таки я не мог найти нигде, где он говорит, какие версии библиотек совместимы. только что получил, что потребности Spring 2.5.x зимуют> = 3,1

И это моя весна конфигурационный файл:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 
    <bean id="myDataSource" 
      class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName"> 
      <value>jdbc/WebCenterDS</value> 
     </property> 
     <!--property name="resourceRef"> 
      <value>true</value> 
     </property> 
     <property name="jndiEnvironment"> 
      <props> 
       <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop> 
       <prop key="java.naming.provider.url">t3://localhost:7001</prop> 
      </props> 
     </property--> 
    </bean> 
    <bean id="mySessionFactory" 
      class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="myDataSource"/> 
     <property name="configLocation"> 
      <value>classpath:hibernate-config/hibernate.cfg.xml</value> 
     </property> 
     <property name="mappingResources"> 
      <list> 
       <value>classpath:com/horizon/model/peopleconnections/profile/internal/bean/CustomAttribute.hbm.xml</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <value>hibernate.dialect=org.hibernate.dialect.HSQLDialect</value> 
     </property> 
    </bean> 
    <bean id="profileExtensionDAO" 
      class="com.horizon.model.peopleconnections.profile.internal.dao.ProfileExtensionDAOImpl"> 
     <property name="sessionFactory" ref="mySessionFactory"/> 
    </bean> 
</beans> 

Структура WAR я получаю следующий:

J2EETestApplication 
│ springhibernate.jsp 
│ 
└───WEB-INF 
    │ faces-config.xml 
    │ web.xml 
    │ weblogic.xml 
    │ 
    ├───classes 
    │ └───view 
    │  └───com 
    │   └───horizon 
    │    └───test 
    │      SpringHibernateServlet.class 
    │ 
    └───lib 
      activation-1.1.jar 
      antlr-2.7.6.jar 
      aopalliance-1.0.jar 
      asm-1.5.3.jar 
      asm-attrs-1.5.3.jar 
      cglib-2.1_3.jar 
      commons-codec-1.3.jar 
      commons-collections-2.1.1.jar 
      commons-logging-1.1.1.jar 
      dom4j-1.6.1.jar 
      ehcache-1.2.3.jar 
      hibernate-3.2.7.ga.jar 
      horizon-model-commons-1.0-SNAPSHOT.jar 
      horizon-model-peopleconnections-1.0-SNAPSHOT.jar 
      horizon-shared-commons-1.0-SNAPSHOT.jar 
      horizon-shared-logging-1.0-SNAPSHOT.jar 
      horizon-shared-util-1.0-SNAPSHOT.jar 
      horizon-shared-webcenter-1.0-SNAPSHOT.jar 
      horizon-shared-webcenter.jar 
      httpclient-4.0.1.jar 
      httpcore-4.0.1.jar 
      javassist-3.4.GA.jar 
      jta-1.0.1B.jar 
      log4j-1.2.14.jar 
      mail-1.4.1.jar 
      peopleconnections-profile-model-11.1.1.2.0.jar 
      saxon-9.1.0.8.jar 
      serviceframework-11.1.1.2.0.jar 
      slf4j-api-1.5.2.jar 
      slf4j-log4j12-1.5.2.jar 
      spring-beans-2.5.6.jar 
      spring-context-2.5.6.jar 
      spring-core-2.5.6.jar 
      spring-orm-2.5.6.jar 
      spring-tx-2.5.6.jar 

Есть ли зависимость или конфигурация пропали?

Если я использую спящий режим без пружины, используя (с теми же библиотеками) я не получаю ClassDefNotFoundException:

импорта java.net.URL;

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 


public class HibernateUtil { 

    private static final SessionFactory sessionFactory = buildSessionFactory(); 

    private static SessionFactory buildSessionFactory() { 
     try { 
      // Create the SessionFactory from hibernate.cfg.xml 
      URL hibernateConfigURL = HibernateUtil.class.getClassLoader().getResource("hibernate-config/hibernate.cfg.xml"); 
      return new Configuration().configure(hibernateConfigURL).buildSessionFactory(); 
     } 
     catch (Throwable ex) { 
      // Make sure you log the exception, as it might be swallowed 
      System.err.println("Initial SessionFactory creation failed." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 
} 

Это заставляет меня думать, что это не проблема в том, что библиотека спящего режима не выбрана должным образом. Библиотеки Spring, похоже, правильно подобраны, когда он начинает строить компоненты из ApplicationContent. Может быть, проблема в том, что эти две библиотеки не видят друг друга?

+0

Have вы проверили, нет ли спящего режима или Spring JAR, расположенного в другом месте в пути к классу webapp, возможно, как часть общей/серверной библиотеки? –

+0

Сначала я подумал, что это может быть причиной того, что я изначально развертывался на сервере с множеством библиотек, но позже я развернулся на другом сервере (интегрированном в IDE Oracle JDeveloper), который, как я полагаю (но не на 100% уверен), содержат любую пружину или спящий режим и по-прежнему получают ту же ошибку. Знаете ли вы какое-либо приложение или полезность, чтобы проверить, находится ли jar или класс в одном загрузчике класса, чтобы быть уверенным на 100%? –

ответ

0

Вы пропустили зависимость от спящего ядра ... пример в документах.

http://docs.jboss.org/hibernate/stable/core/reference/en/html/tutorial.html#tutorial-firstapp-mvn

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
    </dependency> 
+0

Привет, моим первым подходом было использование org.hibernate: hibernate-core: 3.3.2-GA вместо hibernate-3.2.7.ga.jar. Оба уже включают недостающий класс, не должно ли быть ни с кем из них? –

4

Я думаю, что ваше приложение не использует Spring JARs внутри веб-приложение, но тот, предоставленный WebLogic и те, которые не могут «видеть» JAR гибернации внутри войны.

Рассказывать Weblogic посмотреть в файл войны, обеспечить WEB-INF/weblogic.xml с prefer-web-inf-classes набором а для true (это требуется для спящего режима в любом случае из-за версии ANTLR комплектных в ВПУ):

<?xml version="1.0" encoding="UTF-8"?> 
<weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90" xmlns:j2ee="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-web-app.xsd"> 
    <context-root>/myApp</context-root> 
    <container-descriptor> 
    <prefer-web-inf-classes>true</prefer-web-inf-classes> 
    </container-descriptor> 
</weblogic-web-app> 
+0

снова +1, и снова моя точка в том, почему это не значение по умолчанию :) Вы видите - из-за этого возникает слишком много проблем с classpath, и вы почти всегда должны использовать эти (или подобные) настройки. Серверы приложений выпускаются реже по сравнению с небольшими обновлениями в связанных библиотеках. – Bozho

+0

@Bozho Я получаю вашу точку зрения, но, тем не менее, главная стратегия загрузчика классов - это то, что я ожидаю (используя другую стратегию = знаю, что вы делаете). –

+0

да, вы ожидаете этого. И будет знать, какая настройка изменится в 99% случаев. Другие этого не ожидают :) Тем не менее, в каком случае на самом деле имеет смысл иметь загруженную библиотеку, а не одну в приложении? – Bozho

0

я имел компиляцию ' org.hibernate: hibernate-core: 4.1.9 '

Я заменил его компиляцией' org.hibernate: hibernate-core: 3.3.2.GA»

это Gradle синтаксис, преобразование в Maven разве трудно

0

В дополнение к вашему ответу @Rafeeq, это сделал трюк должен упаковывают вы используете Maven зависимость от pom.xml

<dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>3.3.2.GA</version> 
     </dependency> 
Смежные вопросы