如果我的目录名包含空格,Hibernate无法加载JAR文件!

时间:2009-12-16 15:21:17

标签: java hibernate spring

我有一个基于Swing,Spring 2.5.2,Hibernate 3.3.1的应用程序。

如果我的应用程序是从包含空格字符的目录运行的,例如D:\hudson\jobs\FooBar - Fast Build,那么我收到此错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring-persistence.xml]: Invocation of init method failed; nested exception is java.lang.RuntimeException: error trying to scan <jar-file>: file:/D:/hudson/jobs/FooBar%20-%20Fast%20Build/workspace/commons/target/classes/
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1302)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:463)
    ...
Caused by: java.lang.RuntimeException: error trying to scan <jar-file>: file:/D:/hudson/jobs/FooBar%20-%20Fast%20Build/workspace/commons/target/classes/
    at org.hibernate.ejb.Ejb3Configuration.scanForClasses(Ejb3Configuration.java:635)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:350)
    ...
Caused by: java.lang.RuntimeException: java.io.FileNotFoundException: D:\hudson\jobs\FooBar%20-%20Fast%20Build\workspace\commons\target\classes (The system cannot find the path specified)
    at org.jboss.util.file.JarArchiveBrowser.<init>(JarArchiveBrowser.java:74)
    at org.jboss.util.file.FileProtocolArchiveBrowserFactory.create(FileProtocolArchiveBrowserFactory.java:48)
    ...
Caused by: java.io.FileNotFoundException: D:\hudson\jobs\FooBar%20-%20Fast%20Build\workspace\commons\target\classes (The system cannot find the path specified)
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(ZipFile.java:114)
    at java.util.jar.JarFile.<init>(JarFile.java:133)
    at java.util.jar.JarFile.<init>(JarFile.java:97)
    at org.jboss.util.file.JarArchiveBrowser.<init>(JarArchiveBrowser.java:69)
    ... 49 more

(请注意,在这种情况下,在Hudson作业启动的单元测试期间会发生错误)

如您所见,每个空格字符都被URL中的%20替换,这可能是问题的根源......

你知道为什么会这样,以及如何解决它(当然,重新命名我的应用程序的整个路径将解决问题,但它不是我正在寻找的那种答案;))?

ps:我不知道它是否可以帮到你,但是entityManagerFactory文件中创建了bean spring-persistence.xml,其定义如下:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="oraclePersistenceUnit"/>
    <property name="dataSource" ref="dataSource"/>
</bean>

(属性在spring定义的另一个地方或persistence.xml文件中定义)


在我的应用程序中运行以下代码时抛出错误:

applicationContext = new ClassPathXmlApplicationContext("/my-spring-config.xml");

my-spring-config位于我的应用程序的src/main/resources目录中 我也用FileSystemXmlApplicationContext进行了测试,但问题仍然存在。

2 个答案:

答案 0 :(得分:1)

%20是对空格进行URL编码的常用方法。

听起来像是在处理像普通文件名这样的URL,这是不正确的。这些信息如何传递给Ejb3Configuration?

答案 1 :(得分:0)

事实上,这是由于我使用的hibernate-entitymanager版本中存在错误(3.3.1.ga)。

将此版本替换为最新版本(3.4.0.GA),问题不再发生。