Spring 3应用程序中Eclipse,Tomcat和JUnit之间的类路径问题

时间:2010-11-14 21:26:32

标签: eclipse spring tomcat

我有基于Spring 3.0.3的Web应用程序,我一直在使用Eclipse 3.4进行开发。在这样做时,我一直在Eclipse中运行Tomcat 6.0.18中的Web应用程序。也就是说,我让Eclipse使用Tomcat安装意味着Tomcat将根据需要修改文件等(至少,这是我对它正在做什么的理解)。

我的问题是在web.xml中指定contextConfigLocations的值。从Eclipse中运行时,这很好用:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:applicationContext.xml
        classpath:applicationContext-security.xml
    </param-value>
</context-param>

但是,当我将应用程序打包到war文件(ROOT.war)然后将其添加到Tomcat的webapp目录并尝试启动Tomcat时,我收到一个错误,即找不到这些applicationContext文件。但是当我将其更改为下面时,Tomcat可以找到文件:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/config/applicationContext.xml
        /WEB-INF/config/applicationContext-security.xml
    </param-value>
</context-param>

我应该注意applicationContext.xml包含其他也使用classpath的applicationContext文件:short hand。在Tomcat中运行时,我需要放弃使用classpath:支持相对路径来让Tomcat看到这些文件。

大。 Tomcat和Eclise相处得很好。但JUnit 4.7不再高兴。无论出于何种原因,除非使用classpath:short hand,否则无法找到在测试类中使用@ContextConfiguration指定的文件。这是一个例子:

@ContextConfiguration(locations = {"classpath:applicationContext.xml", "classpath:applicationContext-security.xml"})
public class UserDaoTest extends AbstractTransactionalJUnit4SpringContextTests {

    @Test
    public void testCreateUser() {
    }

因此找到applicationContext.xml和applicationContext-security.xml没有问题;但是,找不到applicationContext.xml中指定的属性文件。

<bean id="appProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="singleton" value="true" />
    <property name="ignoreResourceNotFound" value="true" />
    <property name="locations">
            <list>
                    <value>/WEB-INF/config/spring/base.spring-config.properties</value>
                    <value>/WEB-INF/config/spring/local.spring-config.properties</value>
            </list>
    </property>
</bean>

但是如果我使用classpath指定这些文件的位置:short hand,找到属性文件。但是,如果我这样做,从Tomcat中的war文件运行时将找不到文件。

现在我已经创建了一个applicationContext-test.xml,它是所有其他applicationContext文件的剪切和粘贴集合,其中我使用的是classpath:short hand。这似乎很容易出错并且容易出错,我想知道所有这些技术可能存在什么问题。

非常欢迎反馈!

1 个答案:

答案 0 :(得分:2)

web.xml内容应该看起来像

    <context-param>
    <description>
                 Spring Context Configuration.
            </description>
    <param-name>contextConfigLocation</param-name>
    <!-- spring loads all -->
    <param-value>
                classpath*:spring/*.xml,
                classpath*:spring/persistence/*.xml,
                classpath*:spring/webapp/*.xml</param-value>
    </context-param>

请参阅http://static.springsource.org/spring/docs/2.5.x/reference/resources.html#resources-app-ctx-wildcards-in-resource-paths以获取进一步的参考资料

junit配置应遵循与classpath *:

相同的约定

但要注意spring可能会加载你不希望它执行的.xml上下文文件