0

jar在 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>

这个 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看到带有 Hibernate 映射文件的目录。mappings

作为健全性检查,我创建了一个简单的项目,它依赖于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文件直接复制到.war文件的WEB-INF/classes目录中。

毫不奇怪,这奏效了:

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

我将按照建议尝试实用程序 jar,但作为一项临时措施,我将修改我pom.xml的以将映射直接复制到WEB-INF/classes.

4

1 回答 1

0

您需要将罐子包装在耳朵本身内。这样的罐子被称为实用罐子。

它们是执行此操作的几种可能方法,请参阅http://www.ibm.com/developerworks/rational/library/07/1211_schrag/

于 2013-04-11T11:39:48.177 回答