我有一个基于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
进行了测试,但问题仍然存在。
答案 0 :(得分:1)
%20是对空格进行URL编码的常用方法。
听起来像是在处理像普通文件名这样的URL,这是不正确的。这些信息如何传递给Ejb3Configuration?
答案 1 :(得分:0)
事实上,这是由于我使用的hibernate-entitymanager
版本中存在错误(3.3.1.ga
)。
将此版本替换为最新版本(3.4.0.GA
),问题不再发生。