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

标签 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/webapps//WEB-INF/lib/external.jar/a.suffix.xml

my_tomcat_home_path/webapps//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

最佳答案

非常感谢Didxga的帮助!!

我尝试删除“/webapps//WEB-INF/lib”,只将包路径保留到*suffix.xml(实际上是*.hbm.xml),然后@ContextConfiguration(locations看起来像下面这样:

"classpath:/internal_path_within_jar/*hbm.xml"

一开始,这仍然不起作用。

之后,我尝试修改类路径模式,以下代码几乎可以工作

"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。天哪...

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

非常感谢,didxga!

关于java - 如何从 jar 文件加载 Spring 上下文 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16852269/

相关文章:

java - Ldap 单元测试模拟命名枚举

java - 将时区更改为伦敦时的日期问题

java - HttpServletResponse、addCookie() 的行为不符合预期

java - 比较器返回类型与整数不兼容

java - 如何从2点找到角度?

java - 针对目标用户和组的 Azure 应用程序配置功能标记不起作用

javascript - 在新的浏览器窗口中打开 thymeleaf 链接

html - 从 Java servlet 为 HTML5 音频控件提供音频数据

java - 在 Tomcat 服务器上使用 JSTL 标签库的问题

tomcat - 通过身份验证转发到另一个 webapp