Проблемы, исключающие транзитивную зависимость ссылки на проект от пути к классу eclipse

У меня есть несколько проектов gradle в моем рабочем пространстве Eclipse. Для простоты меня интересуют только два из них, для этого давайте просто используем A и B.

Поэтому проблема, с которой я сталкиваюсь, заключается в том, что у Project A есть зависимая зависимость от JBoss, которая использует javax validation-api 1.0.0.GA, а у Project B есть зависимость от javax validation-api 1.1.0.Final. Поскольку Gradle сама разрешает конфликт, используя сначала более новую библиотеку, B счастлив, когда построен gradle. Но в самом Eclipse есть ошибки, которые сильно отвлекают при редактировании.

Правильная версия jar validation-api заканчивается в пути к классам B, но проблема в том, что плагин Gradle IDE изменяет зависимость проекта (':A') на ссылку проекта, и Eclipse, кажется, дает приоритет ссылки на проект над внешний кувшин Так что старый кувшин предпочтителен по расширению.

Я пытался добавить { exclude module: 'validation-api' } в build.gradle B для зависимости от A, которая работает в соответствии с выводом 'gradle dependencies', однако, поскольку Eclipse просто достигает ссылки на проект, он не исключает jar, и проблема остается.

Также по этому вопросу я попытался добавить { transitive = false } и происходит то же самое. Я не думаю, что даже хак, предложенный там, будет работать для меня, так как.classpath содержит единственную ссылку на контейнер Gradle, поэтому нечего удалять.

Мне удалось обойти это, явно включив ссылку на правильную версию jar из моего кэша gradle, а затем переместив его над контейнером пути Classdle Classpath, чтобы eclipse сначала увидела эту версию.

Мой вопрос: есть ли лучший / более общий способ сделать это? Желательно, чтобы я мог взять на себя управление исходными кодами, не нарушая сборки других людей или не требуя, чтобы они где-то вручную изменяли пути или свойства? Есть еще один проект с похожей проблемой, поэтому я могу что-то исправить в файле build.gradle.

В худшем случае я мог бы перейти на IntelliJ, если бы он вел себя лучше, чем интеграция Eclipse-Gradle?

1 ответ

Такого рода проблемы транзитивной зависимости являются давней проблемой интеграции Gradle Eclipse (как в инструментах STS, так и в метаданных.classpath, сгенерированных из командной строки из плагина Eclipse Gradle. Проблема в том, как Eclipse вычисляет транзитивные пути классов.

Только недавно мы нашли разумное решение этой проблемы. На самом деле сейчас есть два решения, одно лучше другого, но в зависимости от вашей ситуации вы можете использовать любое из них.

Первое решение - это исправление ошибки, которая изменяет порядок пути к классу для зависимостей проекта, так что они больше не являются "предпочтительными" по сравнению с jar-зависимостями PR-74. Чтобы получить это исправление, вам может потребоваться установка инструментов Gradle с сайта обновления снимков, поскольку исправление вышло после 3.6.3.

Это решение не решает реальную проблему (у вас все еще есть "неправильные" вещи в пути к классам), а просто снижает вероятность возникновения реальной проблемы в ваших проектах.

Второе решение состоит в том, чтобы разрешить использование "Модели пользовательского инструментария API" PR-55, представленной в STS 3.6.3. Это немного экспериментально и работает только для последней версии Gradle, по крайней мере 1.12, но, вероятно, лучше использовать 2.x. Это также работает только для проектов, в которых включено "Управление зависимостями" (если не включено, вы используете.classpath, сгенерированный плагином Gradle eclipse, который имеет те же "сломанные" проблемы пути к классам, что и инструменты STS).

"Модель настраиваемого инструментария" в принципе является лучшим решением, поскольку она фиксирует способ сопоставления пути класса gradle с проектами затмения, так что зависимости проекта больше не экспортируются, и каждый проект получает свой собственный путь к классу с учетом разрешения конфликта зависимостей.

Чтобы включить это, перейдите в "Окно >> Настройки >> Gradle" и установите флажок "Использовать пользовательскую модель инструментов".

Другие вопросы по тегам