如何从jar文件加载Spring上下文xml

时间:2013-05-31 07:44:44

标签: java spring tomcat junit classpath

我正在运行Junit(SpringJUnit4ClassRunner)来访问集成测试中的一些spring bean。

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

my_tomcat_home_path / webapps // WEB-INF / lib / external.jar

,例如

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

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

...

我把Tomcat路径放到我的eclipse类路径中,然后如果我也将它包含到我的eclipse类路径中,那么我的JUnit中的以下代码就可以了

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

但是,如果我不把它放到我的eclipse类路径中(因为jar文件名可能会不时改变),那么我的下面的代码不起作用(但是Tomcat home“”仍然在eclipse类路径中):

@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

1 个答案:

答案 0 :(得分:2)

非常感谢Didxga的帮助!!

我试图删除&#34; / webapps // WEB-INF / lib&#34;,只留下* suffix.xml的包路径(实际上是* .hbm.xml),然后是@ContextConfiguration(位置如下所示:

"classpath:/internal_path_within_jar/*hbm.xml"

起初,这仍然无法正常工作。

之后,我尝试修改类路径模式,以下代码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和其他地方...

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

无论如何,我认为应该解决这篇文章中报道的问题。

非常感谢,didxga!