Как предотвратить дублирование баночки сервлета с помощью eclipse + m2eclipse

Я использую Eclipse + Maven + m2eclipse для создания и тестирования веб-приложения в Apache Tomcat.

Я сконфигурировал сервер Tomcat внутри Eclipse и сконфигурировал сборку развертывания для своего веб-приложения, включая «Зависимости Maven» (специализация Java Build Path Entries).

Когда я развертываю и запускаю сервер, Tomcat / Catalina всегда предупреждает меня:

ИНФОРМАЦИЯ: validateJarFile (/projects/src/main/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/webapp/WEB-INF/lib/servlet-api-2.5.jar) - банка не загружена. См. Спецификацию сервлета 2.3, раздел 9.7.2. Класс нарушения: javax / servlet / Servlet.class

Это связано с тем, что m2eclipse рассматривает servlet-api-2.5 как зависимость от моего проекта и считает его частью «Maven Dependencies» и копирует его как часть сборки развертывания, но контейнер сервлетов Tomcat имеет свою собственную копию этого и не любит видеть 2 копии на пути к классу.

Я отметил зависимость моего проекта от servlet-api-2.5 в моем pom.xml с помощью

<scope>
provided
</scope>

что не позволяет автономному Maven упаковывать servlet-api-2.5 в мои сборки, но m2eclipse так не видит.

(Это не имеет большого значения, потому что предупреждение безвредно, я вижу его только во время тестирования внутри IDE, и реальные клиенты не видят его, но я все же хотел бы знать, как это исправить, потому что мне нравится чистота и Мне нравится знать, как все работает.)

Есть ли правильный способ сказать m2eclipse не развертывать этот файл или сказать Eclipse, чтобы он не позволял m2eclipse иметь последнее слово в зависимости от того, какие зависимости являются зависимостями времени выполнения?

Я нашел https://issues.sonatype.org/browse/MNGECLIPSE-1193, который упоминает

контейнер «Maven Dependencies» отражает объем времени компиляции теста, поэтому он должен иметь зависимости с «предоставленной» областью


person metamatt    schedule 06.05.2011    source источник
comment
Вы можете показать pOM для этого проекта? Вы пробовали поместить теги области в одну строку? Есть ли у вас другие зависимые проекты или переходные проекты? Вы проверили дерево зависимостей?   -  person khmarbaise    schedule 06.05.2011
comment
@khmarbaise Я проверил дерево зависимостей, используя mvn dependency: tree, и каждая ссылка на servlet-api предоставила область видимости. (Пример: javax.servlet: servlet-api: jar: 2.5: provided (версия, управляемая из 2.3; область действия, управляемая из компиляции)). На самом деле у меня есть теги области видимости в одной строке, хотя я очень надеюсь, что синтаксический анализатор xml не позаботится об этом.   -  person metamatt    schedule 06.05.2011
comment
Как вы упаковываете свою войну?   -  person khmarbaise    schedule 07.05.2011
comment
Никакой войны, только куча банок. Эта группа jar-файлов включает servlet-api-2.5.jar во временный каталог развертывания Eclipse (.project / metadata / tmp /.../ wtpwebapp), но не в моем реальном целевом каталоге, когда я собираю с помощью пакета mvn.   -  person metamatt    schedule 07.05.2011
comment
Может быть, мои вопросы были недостаточно ясны. Создаете ли вы сборку maven военный файл, который содержит правильные файлы, и как вы упаковываете через maven-war-plugin (упаковка установлена ​​как война?)?   -  person khmarbaise    schedule 08.05.2011
comment
Мы не ведем войну ни за сборку Eclipse, ни за отдельную сборку Maven. Просто куча банок.   -  person metamatt    schedule 08.05.2011


Ответы (5)


Установите дополнения для плагина m2eclipse («Интеграция Maven для WTP») с сайта обновлений http://m2eclipse.sonatype.org/sites/m2e-extras. После установки обновите конфигурацию проекта.

person nullpointer forever    schedule 30.05.2011
comment
Вау, спасибо, это работает. Я не знал, что для m2eclipse есть отдельная часть WTP. Подробнее об этом здесь, теперь, когда я знаю, что искать: http://stackoverflow.com/questions/1822290/m2eclipse-and-eclipse-wtp - person metamatt; 02.06.2011

У меня только что была похожая проблема, и я считаю, что разобрался в ней.

Если вы перейдете к настройкам конфигурации вашего сервера в Eclipse и выберете «Обслуживать модули без публикации», этого больше не должно происходить.

Maven / M2Eclipse правильно строит WAR - servlet-api-2.5.jar не будет в ваших целевых каталогах или WAR-файле.

Но проблема в том, что когда вы развертываете приложение через eclipse на своем tomcat, Eclipse не использует ваши maven-каталоги WAR / target по умолчанию, он просто использует обычные настройки Eclipse "export" для вашего проекта. Таким образом, он видит в ваших «Модулях Java EE» (или «Списке сборки развертывания», если вы используете Helios) список всех jar-файлов в ваших Maven_Dependencies, но он не учитывает область действия и просто развертывает все jar-файлы.

Если вы выберете опцию обслуживания без публикации, Eclipst / Tomcat должен просто запустить приложение прямо из вашего целевого каталога, чтобы учитывать области maven.

Это никогда не повлияет на ваши живые развертывания (если вы не развертываете через eclipse!), Поскольку maven делает правильные вещи, но иногда это может вызывать проблемы локально, так как вы можете избежать конфликтующих jar-файлов сервлетов / jsp, которые могут вызвать исключения классов и общие страдания. ..

person rhinds    schedule 07.05.2011
comment
Спасибо, звучит очень правдоподобно. Похоже, у меня это не работает, потому что, когда я выбираю Обслуживание модулей без публикации и запускаю сервер, он не запускается со стеком вызовов, таким как jira.codehaus.org/browse/MTOMCAT-6 и jira.codehaus.org/browse/MTOMCAT-49 (но №6 был исправлен давно, а №49 не удалось указать scope = при условии, что я и делаю). Я не думаю, что на самом деле использую mtomcat, так что это, вероятно, не та же причина, но это не очень хорошо. - person metamatt; 08.05.2011
comment
Вы используете Eclipse Helios или более старую версию? - person rhinds; 08.05.2011
comment
Можете ли вы предоставить трассировку стека, которую вы получаете, когда пытаетесь обслуживать модули без публикации? Похоже, вы можете столкнуться с теми же проблемами, что и я, пытаясь заставить Helios нормально работать с настройкой maven и обслуживать модули без публикации (stackoverflow.com/questions/5924720/) - person rhinds; 09.05.2011
comment
Здесь: pastebin.com/NcqncHe3. То же самое повторяется для пары других классов, которые нельзя преобразовать в javax.servlet.Filter. (Обратите внимание, что o.sf.wfDelegatingFilterProxy действительно реализует javax.servlet.Filter, поэтому приведение должно быть законным - static.springsource.org/spring/docs/1.2.9/api/org/) - person metamatt; 10.05.2011
comment
Да, это похоже на трассировку стека, которую я получаю, когда пытаюсь обслуживать без публикации. К сожалению, я все еще пытаюсь разобраться в этом (пока что просто не обслуживаю без публикации и вручную удаляя банки на моем локальном сервере), но обновлю, если найду что-нибудь еще - person rhinds; 11.05.2011
comment
Хорошо, я заметил одну вещь, которая может решить эту проблему для вас - кажется, что если вы перейдете к свойствам ›Путь сборки Java› Источник, вы должны увидеть все свои папки maven в списке - похоже, когда я импортировал свой проект maven в Eclipse распознал все папки, но в src / main / resources он устанавливает Excluded: ** Что очень странно, поскольку это, очевидно, означает, что все ваши ресурсы исключены - попробуйте отредактировать его, чтобы он сказал Excluded: None и повторите попытку - person rhinds; 20.05.2011

Обычно в вашем проекте есть зависимость, зависящая от servlet-apî.jar

По умолчанию Maven пытается импортировать вашу зависимость + зависимости импортированной зависимости.

Если вы хотите исключить конкретную «подчиненную зависимость», вы можете дать maven такую ​​конфигурацию:

<dependency>
    <groupId>com.hpsworldwide.mbtrs.switch</groupId>
    <artifactId>YOUR_DEPENDENCY</artifactId>
    <version>1.0</version>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

тогда maven импортирует YOUR_DEPENDENCY + все зависимости YOUR_DEPENDENCY, но исключит servlet-api из зависимостей YOUR_DEPENDENCY.

person Mohammed Ali    schedule 30.03.2012

Если вы используете Indigo, вы можете найти плагин WTP, щелкнув «Окно» -> «Настройки» -> «Maven» -> «Открытие» -> «Открыть каталог».

person Simon Jester    schedule 24.06.2011

Один совет: после установки «Maven Integration for WTP» и обновления конфигурации проекта проверьте каталог / WEB-INF / lib и удалите все JAR внутри. Теперь очистите рабочий каталог Tomcat и запустите его снова.

person nullpointer forever    schedule 08.06.2011