无法从WAR应用程序

时间:2015-12-03 13:09:59

标签: java spring jar war

我有一个应用程序使用XML配置加载其Spring上下文。

上下文文件存储在jar的类路径中(在META-INF/context目录中)。

引入新bean,我想从同一档案的类路径中加载beanio映射文件。 Tomcat在Eclipse中运行时它都可以作为魅力,但是当我将WAR文件部署到QA环境时,我得到的应用程序无法启动。

让我走一下代码:

public class BeanIoParser implements Parser, Iterator<Message>, InitializingBean
{
    private StreamFactory streamFactory;

    private Resource resourceMapping; //Injected via Context

    @Override
    public void afterPropertiesSet() throws Exception
    {
        streamFactory = StreamFactory.newInstance();
        streamFactory.load(resourceMapping.getFile()); //boom here
    }
}

然后是上下文

<bean id="messagesParser" class="it.acme.BeanIoParser" scope="prototype">
    <property name="resourceMapping" value="classpath:META-INF/mappings/messages-beanio.xml" />
</bean>

然后是什么?嗯......我先通过解压缩war文件来仔细检查构建的jar文件。这一切都匹配。

我可以正确查看我的messages-beanio.xml文件。

但是当我启动应用程序时,我得到以下根本原因

java.io.FileNotFoundException:类路径资源[META-INF / mappings / messages-beanio.xml]无法解析为绝对文件路径,因为它不驻留在文件系统中:jar:file:/ C:/方案%20Files /阿帕奇%20Software%20Foundation / Tomcat的%208.0 /温度/ 11应用程式内/ WEB-INF / LIB / APP-3.0.0.20151105.jar!/META-INF/mappings/messages-beanio.xml

我还尝试了另一种方法,使用classpath*(因为我们在从多个jar文件加载Spring上下文时已经遇到过这个问题)

所以如果我的bean声明变成了

<property name="resourceMapping" value="classpath*:META-INF/mappings/messages-beanio.xml" />    

我的错误变为

java.io.FileNotFoundException:ServletContext资源[/classpath*:META-INF/mappings/messages-beanio.xml]无法解析为绝对文件路径 - Web应用程序存档未扩展?

我该如何解决?

1 个答案:

答案 0 :(得分:1)

解决不同的问题。我以编程方式实例化ClasspathResource,其路径以META-INF开头,而不是classpath: