2013-04-11 2 views
0

У меня возникла проблема с ресурсами Hibernate, которые не найдены при развертывании в файле jar на сервере приложений Oracle.Спящие сопоставления не найдены при развертывании на сервере приложений Oracle?

У меня есть несколько файлов отображения Hibernate, определенные в LocalSessionFactoryBean следующим образом:

определение
<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="mappingLocations"> 
    <list> 
     <value>classpath:/mapping/*.hbm.xml</value> 
    </list> 
    </property> 
    ... 
</bean> 

Этот компонент находится в файле applicationContext.xml.

В Hibernate отображений, классы, на которые ссылаются эти отображения, и файл applicationContext.xml расположены в модуле foo, который генерирует артефакт foo.jar.

Я создал .ear, который ссылается на foo.jar и использует тот же файл applicationContext.xml. Когда я раскрываю, что .ear на сервере приложений Oracle я вижу следующее сообщение об ошибке:

java.io.FileNotFoundException: class path resource [mapping/] cannot be resolved to absolute file path because it does not reside in the file system: code-source:/.../oas10.1.3/j2ee/.../applications/.../WEB-INF/lib/foo.jar!mapping/

Когда я анализирую /WEB-INF/lib/foo.jar я могу видеть mappings каталог с файлами отображения Hibernate, как ожидалось.

В проверке разумности я создал простой проект с зависимостью от foo и которая проходит следующий тест:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:applicationContext.xml"}) 
public class AppTest { 

    @Autowired SessionFactory sessionFactory; 

    @Test 
    public void loadObjects() { 
    Session session = sessionFactory.openSession(); 
    List<Foo> results = session.createQuery("from Foo").list(); 
    System.out.println("found " + results.size() + " results"); 
    } 
} 

Это работает, как ожидалось: пробеги запросов HQL и я получаю обратно правильное количество Foo объекты из базы данных.

Так почему же это простое приложение, ссылающееся на ресурсы сопоставления в foo.jar, работает, но делать то же самое на сервере приложений Oracle приводит к тому, что ресурсы не найдены?

редактировать: Я попытался с помощью mappingJarLocations вместо mappingLocations:

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="mappingJarLocations"> 
    <list> 
     <value>WEB-INF/lib/foo.jar</value> 
    </list> 
    </property> 
    ... 
</bean> 

и получил FileNotFoundException.

редактировать: Я вернулся к использованию mappingLocations вместо mappingJarLocations (как в моем первом примере), но на этот раз я скопировал *.hbm.xml файлы непосредственно в WEB-INF/classes каталог .war файла.

Не удивительно, это сработало:

setMappingLocations() - file:/.../oas10.1.3/j2ee/.../applications/.../raps-site-9.0/WEB-INF/classes/mapping/Address.hbm.xml

Я попробую коммунальные банки, как предложено, но в качестве временной меры, я изменю свою pom.xml скопировать отображения непосредственно в WEB-INF/classes.

ответ

0

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

Это несколько возможных способов сделать это, см. http://www.ibm.com/developerworks/rational/library/07/1211_schrag/

+0

Спасибо за ответ. В настоящее время 'foo.jar' существует в файле' bar.war', который затем помещается в '.ear'. При развертывании существует файл 'WEB-INF/lib/foo.jar'. Требуется ли создание утилиты? –

+0

AFAIK в банке утилиты должен находиться в корне '.ear' и указан манифест' bar.war' см. Http://stackoverflow.com/questions/15828781/architecture-of-a-java-ee- проект или http://www.coderanch.com/t/309491/EJB-JEE/java/utility-JAR-EAR-WAR – Gab

+0

Фактически я указал свойство 'mappingJarLocations' с' file: **/foo.jar' и это похоже на трюк. Но теперь я получаю исключения «неизвестной сущности». Два шага вперед, один шаг назад ... –

Смежные вопросы