Как предотвратить дублирование банки сервлетов с помощью eclipse + m2eclipse - PullRequest
14 голосов
/ 06 мая 2011

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

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

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

ИНФОРМАЦИЯ: validateJarFile (/projects/src/main/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/webapp/WEB-INF/lib/servlet-api-2.5. баночка) - баночка не загружена. См. Servlet Spec 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" отражает область времени тестовой компиляции, поэтому он должен иметь зависимости с областью "обеспечен"

Ответы [ 5 ]

14 голосов
/ 30 мая 2011

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

5 голосов
/ 30 марта 2012

Обычно в вашем проекте есть зависимость, которая зависит от 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.

5 голосов
/ 08 мая 2011

У меня только что была похожая проблема, и я думаю, что дошел до ее дна.

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

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

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

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

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

4 голосов
/ 24 июня 2011

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

1 голос
/ 08 июня 2011

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

...