Итак, сначала немного предыстории.
Я работаю над преобразованием веб-проекта 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, заключается в том, что наши зависимости теперь загружаются из репозитория, а не связываются непосредственно с исходным кодом.
Любая помощь приветствуется.