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

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

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

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

INFO: validateJarFile (/projects/src/main/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/webapp/WEB-INF/lib/servlet-api-2.5. jar) - jar не загружен. См. Раздел Servlet Spec 2.3, раздел 9.7.2. Класс нарушения: javax/servlet/Servlet.class

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

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

<scope>
provided
</scope>

что предотвращает автономный Maven от упаковки сервлета-api-2.5 в мои сборки, но m2eclipse не видит этого.

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

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

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

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

Ответ 1

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

Ответ 2

У меня была аналогичная проблема, и я полагаю, что у меня все получилось.

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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