【问题标题】:Problems with classpath between Eclipse, Tomcat and JUnit in Spring 3 appSpring 3 应用程序中 Eclipse、Tomcat 和 JUnit 之间的类路径问题
【发布时间】:2023-03-25 09:35:02
【问题描述】:

我有一个基于 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 包括其他也使用类路径的 applicationContext 文件:简写。在 Tomcat 中运行时,我需要放弃所有使用类路径:转而使用相对路径来让 Tomcat 看到这些文件。

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

@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>

但是如果我使用类路径指定这些文件的位置:简写,就会找到属性文件。但是,如果我这样做,则从 Tomcat 中的 war 文件运行时将找不到这些文件。

现在我已经创建了一个 applicationContext-test.xml,它是所有其他 applicationContext 文件的剪切和粘贴集合,其中我使用了类路径:简写。这看起来很笨拙且容易出错,我想知道所有这些技术的问题可能是什么。

欢迎反馈!

【问题讨论】:

    标签: eclipse spring tomcat


    【解决方案1】:

    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 上下文文件

    【讨论】:

    • 顺序没关系??你确定吗??所以不可能覆盖另一个配置文件中的 bean 定义?
    • 对于参数值列表,顺序无关紧要,弹簧加载所有,但我会调整评论,对于 bean 覆盖它当然很重要,但我不会指望确定性行为
    猜你喜欢
    • 2011-08-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2020-05-30
    • 2013-04-16
    • 2015-12-15
    相关资源
    最近更新 更多