Проблемы с classpath между Eclipse, Tomcat и JUnit в приложении Spring 3 - PullRequest
3 голосов
/ 15 ноября 2010

У меня есть веб-приложение, основанное на Spring 3.0.3, которое я разрабатывал с использованием Eclipse 3.4.При этом я запускал веб-приложение в Tomcat 6.0.18 из Eclipse.То есть у меня Eclipse использует установку Tomcat, что означает, что Tomcat будет при необходимости изменять файлы и т. Д. (По крайней мере, это мое понимание того, что он делает).

Моя проблема заключается в указании значений для contextConfigLocationsв web.xml.При запуске из 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 и пытаюсь запустить 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, которые также используют короткий путь classpath:.При работе в Tomcat мне нужно полностью отказаться от использования classpath: в пользу относительных путей, чтобы 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>

Но если я укажу расположение этих файлов с помощью короткого пути classpath: файлы свойств будут найдены.Однако если я сделаю это, файлы не будут найдены при запуске из файла war в Tomcat.

На данный момент я создал файл applicationContext-test.xml, который представляет собой конгломерат вырезания и вставкивсе остальные файлы applicationContext, в которых я использую короткий путь classpath:Это кажется хакерским и подверженным ошибкам, и мне интересно, что проблема может быть во всех этих технологий.

Обратная связь приветствуется!

1 Ответ

2 голосов
/ 17 ноября 2010

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-файлы контекста, которые вы не хотите делать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...