FileNotFoundException для файла определения компонента происходит только онлайн, а не на localhost - PullRequest
0 голосов
/ 02 октября 2011

Когда я опубликовал файл war для приложения, которое работает локально с Eclipse WTP, у меня было FileNotFoundException для файла bean.xml с определениями bean-компонентов.

SEVERE: Exception sending context initialized event to listener instance of 
    class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanDefinitionStoreException: 
   IOException parsing XML document from class path resource 
   [META-INF/spring/beans.xml]; nested exception is java.
io.FileNotFoundException: class path resource [META-INF/spring/beans.xml] 
    cannot be opened because it does not exist
    at Caused by: java.io.FileNotFoundException: class path resource 
    [META-INF/spring/beans.xml] cannot be opened because it does not exist
    ...

Я создал файл войны с помощью mvn war: war и скопировал его в папку веб-приложений Tomcat 7.

beans.xml находится в src / main / resources / META-INF / spring / beans.xml , и в моем файле pom.xml содержится следующее:

<build>
    <plugins>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.1.1</version>
            <configuration>
                <webResources>
                    <resource>
                        <directory>src/main/resources</directory>
                    </resource>
                </webResources>
            </configuration>
        </plugin>

В файле war. Beans.xml упакован в META-INF / spring / beans.xml

В моем web.xml я:

<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath:META-INF/spring/beans.xml</param-value>
</context-param>

Однако файл не найден. Как решить проблему?

ОБНОВЛЕНИЕ : как предположил Мэтью Фарвелл, bean.xml не упакован в нужном месте, поэтому его нет в пути к классам, я думаю, что он указан с параметрами maven-war-plugin, теперь я попробуйте посмотреть его документацию. Если кто-то знает, это было бы полезно.

UPDATE 2 : Как объяснено в документации по плагину maven-war-plugin , существует необязательный параметр targetPath. Я попытался, и после изменения конфигурации maven-war-plugin добавив targetPath, он был правильно упакован.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <configuration>
        <webResources>
            <resource>
                <directory>src/main/resources</directory>
                <targetPath>WEB-INF/classes</targetPath>
            </resource>
        </webResources>
    </configuration>
</plugin>

ОБНОВЛЕНИЕ 3 : По предложению Райана Стюарта, я начал свою первоначальную настройку pom, используя roo, но после этого я сделал много изменений и больше не использую roo. Каталог src / main / resources не упоминается ни в каких других местах в pom.xml (я использовал grep), однако единственный параметр, который мне кажется подозрительным:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.5</version>
    <configuration><encoding>UTF-8</encoding></configuration>
</plugin>

Я закомментировал этот плагин, но ничего не изменилось, затем я закомментировал часть конфигурации maven-war-plugin, но src / main / resources больше не добавлялся в войну, поэтому сейчас я добавил я возвращаю его, и я загружаю его, чтобы протестировать его онлайн (на самом деле это все еще промежуточный сервер, а не конечный).

ОБНОВЛЕНИЕ 4 Райан Стюарт предположил, что проблема в том, что я запускаю «mvn war: war» вместо «mvn package», и это действительно было проблемой. С моим targetPath ресурсы появились в WEB-INF / classes, но там не было никаких классов.

Я сражался в тяжелом бою, хотя вместо этого более простым решением было удалить часть конфигурации, как в обновлении 3, и использовать «mvn package» для создания файла войны. Спасибо вам обоим, Райану и Мэтью, я не только решил свою проблему, но и узнал кое-что еще о Мейвене.

Ответы [ 2 ]

2 голосов
/ 03 октября 2011

Я должен предположить, что у вас есть другая часть POM, которая исключает обработку рассматриваемого файла как ресурса пути к классам, иначе он должен работать.Либо

  1. Прекратите это делать, и все будет работать нормально - по умолчанию содержимое src / main / resources становится ресурсами classpath - или
  2. удалите classpath: изтвой путь.Без этого префикса путь, указанный в contextConfigLocation, будет сопоставлен с корнем файла WAR, и он правильно найдет ваш файл в META-INF/spring.

Если вы выберете путь 1, тогдаВы должны удалить раздел webResources, иначе файл окажется в двух местах - не проблематично, но потенциально запутанно.

2 голосов
/ 02 октября 2011

На войне / не является частью пути к классу для веб-приложения.Путь к классам включает в себя / WEB-INF / classes и все файлы в / lib.См. Apache Tomcat 6.0 - Загрузчик классов HOW-TO

WebappX - Загрузчик классов создается для каждого веб-приложения, которое развернуто в одном экземпляре Tomcat.Все распакованные классы и ресурсы в каталоге / WEB-INF / classes вашего веб-приложения, а также классы и ресурсы в файлах JAR в каталоге / WEB-INF / lib вашего веб-приложения, становятся видимыми для этого веб-приложения, но нек другим.

Другие веб-серверы будут иметь аналогичные правила.Если вы хотите сослаться на что-либо как часть пути к классам, поместите это в WEB-INF / classes .

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