2013-05-31 54 views
1

我正在运行Junit(SpringJUnit4ClassRunner)来访问我的集成测试中的一些spring bean。如何从jar文件加载Spring上下文xml

我需要通过@ContextConfiguration加载几个xml文件,这些文件通过外部方法直接通过jar文件部署到我的Tomcat。 - 换句话说,这些文件是:

my_tomcat_home_path/web应用// WEB-INF/LIB/external.jar

my_tomcat_home_path/web应用// WEB-INF/LIB/external.jar/a.suffix.xml

my_tomcat_home_path/webapps中// WEB-INF/lib目录/ external.jar/b.suffix.xml

...

我把Tomcat的路径为我的ECL IPSE类路径,那么,如果我还包括该到我的Eclipse类路径,然后在我的JUnit下面的代码工作

@ContextConfiguration(locations = {"classpath:*suffix.xml"}) 

但是,如果我不将它放入我的日食类路径(因为jar文件名可能改变不时),那么我下面的代码不能正常工作(但Tomcat的家“”仍然在eclipse classpath中):

@ContextConfiguration(locations = {"classpath:/webapps/<my_app>/WEB-INF/lib/external.jar/*suffix.xml"}) 

可能有人请帮助我吗?

非常感谢!

额外的尝试-------------------------------

我试图使用内部的包路径jar,而不是使用external.jar本身。该代码如下所示:

@ContextConfiguration(locations = {"classpath:/webapps/<my_app>/WEB-INF/lib/path_inside_the_external_jar/*suffix.xml"}) 

在这种情况下,我不再收到“XML未找到,因为文件不存在”的问题。相反,我得到以下错误:

Caused by: java.io.FileNotFoundException: class path resource [webapps/my_app/WEB-INF/lib/path_inside_the_external_jar/] cannot be resolved to URL because it does not exist 
at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:163) 
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.isJarResource(PathMatchingResourcePatternResolver.java:406) 
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.findPathMatchingResources(PathMatchingResourcePatternResolver.java:338) 
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.getResources(PathMatchingResourcePatternResolver.java:276) 
at org.springframework.context.support.AbstractApplicationContext.getResources(AbstractApplicationContext.java:1018) 
at org.springframework.context.support.GenericApplicationContext.getResources(GenericApplicationContext.java:192) 
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:177) 
... 23 more 
+0

在您的位置配置,请不要使用external.jar而是使用* suffix.xml的包路径 – didxga

+0

嗨didxga,谢谢你的提示!我试了一下,得到的URL不存在的错误,我已经更新了帖子来显示这个尝试。 –

+0

尝试从您的位置配置中移除“/ webapps//WEB-INF/lib”。 – didxga

回答

2

非常感谢Didxga的帮助!我尝试删除“/ webapps // WEB-INF/lib”,并且只将包路径留给* suffix.xml(实际上是* .hbm.xml),然后是@ContextConfiguration(locations如下所示:

"classpath:/internal_path_within_jar/*hbm.xml" 

首先,它仍然没有工作

后来,我尝试了修改后的classpath模式,下面的代码ALMOST作品

"classpath*:/internal_path_within_jar/*hbm.xml" 

这时间,因为的hbm.xml文件被加载,我也得到了以下错误:

Caused by: java.net.UnknownHostException: hibernate.sourceforge.net 
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:195) 
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) 
at java.net.Socket.connect(Socket.java:529) 
at java.net.Socket.connect(Socket.java:478) 
at sun.net.NetworkClient.doConnect(NetworkClient.java:163) 
at sun.net.www.http.HttpClient.openServer(HttpClient.java:411) 
at sun.net.www.http.HttpClient.openServer(HttpClient.java:525) 
at sun.net.www.http.HttpClient.<init>(HttpClient.java:208) 
at sun.net.www.http.HttpClient.New(HttpClient.java:291) 
at sun.net.www.http.HttpClient.New(HttpClient.java:310) 

不过,我现在认为这是一个不同的问题,因为它是Hibernate的DTD负载问题......也许我不该加载HBM .xml在这个方法中......我被迫这样做,因为那些hbm。xml文件是在我的应用程序部署过程中生成的,并且只会出现在Tomcat的websapp/my_app/external.jar和NO其他地方...

嗯,所以我需要在那部分工作...但是如何包括一个jar到我的eclipse路径中,改变名称,但是某种模式?如* -dao.jar。 OMG ...

无论如何,我想这个帖子中报告的问题应该得到解决。

非常感谢,didxga!

+0

很高兴帮助。至于你得到的例外在这里找到解决方案http://stackoverflow.com/questions/4002885/unknown-host-exception-while-parsing-an-xml-file – didxga