Eclipse/Tomcat публикует ненужные/проблемные зависимости

Итак, сначала немного предыстории.

Я работаю над преобразованием веб-проекта Eclipse Java в Gradle. Мы используем фреймворк Vaadin и в настоящее время управляем проектом с помощью Ant/Maven/Ivy. У нас есть еще один проект, содержащий общий код, от которого зависит веб-проект. В обоих проектах файлы нашей библиотеки, JAR, просто включаются в исходный код и фиксируются в нашей системе контроля версий. С переходом на Gradle мы будем использовать предпочтительный метод извлечения наших зависимостей из репозитория; в основном Maven Central.

Я завершил создание сценариев сборки Gradle, которые соответствуют нашим текущим сценариям сборки Ant. У меня есть один скрипт сборки Gradle для каждого проекта, а также один в корне для внедрения конфигурации вместе с файлом настроек. Я использую плагины java и eclipse для обоих проектов и дополнительно плагины war и vaadin для веб-проекта. .

Теперь к проблеме. Когда я использую Gradle для создания WAR, он работает отлично, и каталог WEB-INF/lib содержит только те файлы JAR, которые я ожидал, основываясь на конфигурации зависимостей. Однако, когда я использую Tomcat внутри Eclipse для публикации проекта, я получаю кучу дополнительных JAR-файлов в каталоге WEB-INF/lib. Большинство JAR-файлов безвредны и просто не нужны, поэтому я исключил их из WAR, но есть пара, которые на самом деле проблематичны, потому что они уже есть у Tomcat. В одном случае он просто игнорирует JAR, и я получаю обычное сообщение:

[Tomcat] validateJarFile(*) - jar не загружен.

В другом случае я фактически получаю исключения в консоли, что беспокоит, даже если приложение работает правильно. Я также заметил, что все зависимости, связанные с конфигурацией testCompile, также публикуются, что действительно кажется неправильным.

Точные JAR-файлы, вызывающие нарушения, — это tomcat-jdbc и servlet-api-2.5. JAR tomcat-jdbc требуется для компиляции нашего общего кода. JAR servlet-api-2.5 на самом деле является просто транзитивной зависимостью от vaadin-client-compiler. Я удалил зависимость для vaadin-client-compiler в нашем веб-проекте, потому что она не кажется необходимой, но похоже, что она все еще подтягивается конфигурацией в < strong>vaadin плагин для Gradle. Однако в обоих случаях я использую конфигурацию providedCompile плагина war, чтобы исключить их из WAR.

Итак, мой вопрос: как мне запретить Tomcat/Eclipse публиковать эти JAR-файлы? Как взаимодействуют Gradle и Tomcat/Eclipse или вообще общаются? Из того, что я могу понять, кажется, что Gradle и Tomcat/Eclipse взаимодействуют только косвенно через .classpath, который изменяет плагин eclipse для Gradle. Кроме того, я попробовал плагин eclipse-wtp для Gradle. Похоже, это не решило проблему, потому что проблемные JAR-файлы все еще копировались. На самом деле я даже не уверен, нужно ли мне использовать этот плагин или я могу просто использовать плагин eclipse.

Я также должен добавить, что я установил «плагин» Gradle Integration для Eclipse через Eclipse Marketplace. При этом я использовал параметр Configure -> Convert to Gradle Project, который он добавляет, а также функциональность Gradle -> Refresh Dependencies, которую он предоставляет. Кроме того, я обнаружил, что он немного глючит, поэтому я в основном запускал Gradle через командную строку.

Ниже приведен результат запуска gradle -v на моей машине:

------------------------------------------------------------
Gradle 1.10
------------------------------------------------------------
Build time:   2013-12-17 09:28:15 UTC
Build number: none
Revision:     36ced393628875ff15575fa03d16c1349ffe8bb6
Groovy:       1.8.6
Ant:          Apache Ant(TM) version 1.9.2 compiled on July 8 2013
Ivy:          2.2.0
JVM:          1.8.0_05 (Oracle Corporation 25.5-b02)
OS:           Mac OS X 10.9.3 x86_64

Пожалуйста, дайте мне знать, если требуются дополнительные разъяснения. Я предполагаю, что я должен делать что-то неправильно или пропустить какую-то настройку, потому что, конечно, мой сценарий довольно распространен. Многие разработчики используют Tomcat внутри Eclipse для локального тестирования веб-приложений, и с учетом популярности Gradle я был бы удивлен, если бы кто-то не сталкивался с этим раньше. Казалось бы, основное отличие нашего перехода на Gradle в том, что касается Tomcat/Eclipse, заключается в том, что наши зависимости теперь загружаются из репозитория, а не связываются непосредственно с исходным кодом.

Любая помощь приветствуется.


person asymptoticFault    schedule 09.06.2014    source источник


Ответы (1)


Однако, когда я использую Tomcat внутри Eclipse для публикации проекта, я получаю кучу дополнительных JAR-файлов в каталоге WEB-INF/lib. Большинство JAR-файлов безвредны и просто не нужны, поэтому я исключил их из WAR, но есть пара, которые на самом деле проблематичны, потому что они уже есть у Tomcat.

Это известная проблема с инструментами Gradle Eclipse. Проблема в том, что он не понимает о зависимостях с «предоставленной» областью. Дополнительные сведения см. в этом выпуске: https://issuetracker.springsource.com/browse/STS-2380< /а>

Существует обходной путь для этой проблемы. Некоторые общие зависимости, которые «вызывают проблемы», могут быть глобально исключены с помощью списка регулярных выражений, который вы указываете в настройках. Откройте меню «Окно >> Настройки >> Gradle >> WTP». Здесь вы можете добавить регулярные выражения, которые будут использоваться для исключения банок из «сборки развертывания».

person Kris    schedule 10.06.2014
comment
Большое спасибо за ответ! По совпадению, я сам наткнулся на это за несколько часов до того, как увидел ваш ответ. Спасибо за ссылку на проблему, приятно знать, что я не единственный, у кого есть то, что кажется очень распространенной и важной проблемой. Я попробовал список исключений, и он действительно сработал; в первый раз, то, похоже, все еще возвращается к развертыванию проблемного JAR. Я не могу заставить его работать стабильно. Должен ли я использовать подключаемый модуль eclipse-wtp Gradle или просто обычный подключаемый модуль eclipse Gradle? Есть ли способ обновить развертывание? - person asymptoticFault; 11.06.2014
comment
Проект eclipse-wtp. Этот плагин предназначен для интеграции с Eclipse WTP («Платформа веб-инструментов»). На самом деле, если вы используете этот плагин, он может работать лучше, если вы отключите «Управление зависимостями». Это заставляет инструментарий gradle работать более «невмешательно» и просто полагаться на то, что генерирует задача gradle «eclipse». Проблема в том, что путь к классам, созданный с помощью инструментов, не может различать «предоставленные» зависимости. Возможно, плагин eclipse-wtp обрабатывает его правильно. - person Kris; 12.06.2014
comment
Есть ли способ обновить развертывание? Не уверен, что это сработает, но обычно меню gradle «обновить все» должно обновлять все настройки проекта, как если бы вы сделали «свежий» импорт. - person Kris; 12.06.2014
comment
Извините за задержку. Я все еще не могу последовательно исключить рассматриваемый JAR из развертывания. Насколько я понимаю, этот список исключений должен помочь. Возможно ли, что встроенный экземпляр Tomcat не учитывает этот список, когда я говорю ему опубликовать проект? - person asymptoticFault; 17.06.2014
comment
Под файлом 'component.xml' вы подразумеваете файл org.eclipse.wst.common.component? Я видел, что этот файл, по-видимому, контролирует развертывание, а подключаемый модуль eclipse-wtp изменяет его. Знаете ли вы какую-либо документацию по этому файлу? Было бы полезно знать, как именно это интерпретируется. С предстоящим выпуском Eclipse Luna я собираюсь еще раз попробовать это и Tomcat 8, чтобы посмотреть, будет ли решена проблема. Я ценю всю вашу помощь, Крис, и поддержу ответ, но пока не уверен, что смогу его принять. - person asymptoticFault; 23.06.2014
comment
Да, именно этот файл я и имел в виду. Нет никакой документации, о которой я знаю. Я думаю, что этот файл имеет формат, считающийся «внутренним» для инструментов Eclipse WTP. Думая о моем ответе выше ... может быть, на самом деле можно было бы уточнить. Это может зависеть от того, используете ли вы инструменты Gradle с включенным «Управлением зависимостями» или нет. Ты? «Обходной путь», который я рекомендовал, был реализован для случая «Управление зависимостями включено». Другой случай может не нуждаться в исправлении. Проблема возникает в зависимости «Контейнер пути к классам Gradle», которая используется только с «Управление зависимостями = включено». - person Kris; 23.06.2014