Вопрос по eclipse, java – Цикл был обнаружен в пути сборки проекта xxx - Проблема пути сборки

40

Я преобразую свои проекты в пакеты OSGI, используя maven и eclipse. Maven прекрасно работает, только теперь я получаю вышеуказанную ошибку в Eclipse. Как я могу узнать, какой проект вызывает это? Есть особый взгляд или что-то? Как это может произойти, я ожидаю, что maven также может обнаруживать циклические зависимости?

Обновит

Хорошо, я что-то нашелВо а такжеВо

Может ли это быть вызвано подключаемым модулем felix maven-bundle-plugin, который для каждого экспорта также выполняет импорт?

Важный совет по безопасности. Командная строка Maven обнаруживает циклы внутри одного реактора. Если цикл будет доступен только при активации профиля, то ваша сборка из командной строки не сообщит об ошибке, в то время как ваша сборка затмения может это сделать. Если вы попытаетесь отладить это, обязательно активируйте все профили, чтобы включить все ваши модули (например, mvn -Pcore, buildtools зависимость: дерево), иначе вы можете пропустить проблему. Peter Kahn

Ваш Ответ

15   ответов
77

lipse, чтобы избежать ошибки «ЦИКЛ ОБНАРУЖЕН В СТРОИТЕЛЬНОМ ПУТИ».

В Eclipse перейдите по ссылке:

Windows -> Настройки -> Java-> Компилятор -> Сборка -> Круговые зависимости

Экономит время Sagar
этот ответ правильный, так как проекты с открытым исходным кодом, использующие gradle, имеют круговую зависимость, и они нормально строятся на gradle. затмение не должно плакать об этом как об ошибке Siddharth
Когда я это сделал, ошибки возросли с 6 до 2000+. Arvindh Mani
Как навсегда удалить это предупреждение. Это вызывает некоторые из моих проблем, например, если есть неиспользуемый импорт. user7485924
В моем случае ошибки изменились с 15 до 2000+, когда я сделал это изменение. Любое другое решение? Sanchit Khera
10

мы должны установить ссылки между проектами, а не между проектами. Если P1 ссылается на P2, P2 ссылается на P3, а P3 ссылается на P1. Это вызовет цикл.

Решение состоит в том, чтобы нарисовать схему ссылки между проектами в рабочей области. Проверьте Java Build Path каждого из проектов, чтобы увидеть вкладку окна Projects. Выньте проект, который ссылается на основной проект, например, P3 ссылается на P1, в этом примере выше.

перация @Detailed состоит в том, чтобы выбрать проект P3 в RAD ИЛИ затмении, щелкнуть правой кнопкой мыши на проекте и выбрать опцию свойств, это откроет новое окно для свойств P3. Нажмите на раздел «Java Build Path», выберите вкладку «Projects». Вы можете видеть, что P3 ссылается на P1 в поле. Выберите ссылку P1, нажмите кнопку «Удалить» в правой части окна. Затем нажмите кнопку ОК. Среда IDE начнет сбрасывать путь автоматически.

Выполнено

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

Но если есть случай, когда P1 ссылается, P2 ссылается на P1. Например, P1 содержит код уровня DAO, а P2 содержит утилиты. Утилиты иногда используют уровень DAO для получения свойств конфигурации из таблицы БД, а уровень DAO использует утилиты. Так как решить эту проблему? Sanjeev Kumar Dangi
меня тоже такая же проблема @ Санджив. У вас есть какое-нибудь решение, пожалуйста, поделитесь ... AndEngine
@ SanjeevKumarDangi может включить утилиты, специфичные для DAO, в проект DAO. Tom Brito
7

Удалить ссылку из проекта А в проект Б Попробуй запустить, он сломается Повторно добавьте ссылку Очистить / очистить и построитьСнова в дел
4

цикл - это когда пакет A зависит от пакета B, который зависит от пакета A. Если это исходный код, то нет способа построить пакеты отдельно за один проход.

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

В последних версиях Eclipse есть поддержка бинарных циклов:Eclipsesource Blog

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

И будьте осторожны, если вы используете фрагменты OSGi (общий шаблон для модульного тестирования), поскольку вводить циклы очень просто.

Редактор манифеста в Eclipse имеет функциональность на вкладке «Зависимости» для поиска циклов (вам нужно нажать «Анализ зависимостей»), но я никогда не видел, чтобы он показывал цикл, даже когда в Eclipse есть большой красный X, говорящий мне, что есть цикл!

Спасибо за подсказку о редакторе манифеста Eclipse «Анализ зависимостей> Поиск циклов». Он действительно показывает цикл (но только в одном из пакетов в цикле). wisbucky
3
Проблема

который тестирует две разные реализации интерфейса словаря. Один - несортированный ArrayList, а другой - HashTable. Две реализации рассчитаны по времени, чтобы можно было провести сравнение. Вы можете выбрать структуру данных из аргументов командной строки. Теперь .. У меня есть другая структура данных, которая представляет собой древовидную структуру. Я хочу проверить его время, чтобы сравнить его с HashTable. Итак ... В новом проекте dataStructure мне нужно реализовать интерфейс Dictionary. В проекте Dictionary мне нужно добавить код, специфичный для моего нового проекта dataStructure. Есть круговая зависимость. Это означает, что когда Eclipse отправляется выяснять, какие проекты зависят от проекта A, он находит проект B. Когда ему нужно выяснить подзависимости зависимых проектов, он находит A, который опять же зависит от B. Там нет дерева, скорее граф с циклом.

Решени

При переходе к настройке пути сборки вместо ввода зависимых проектов (вкладка «проекты») перейдите на вкладку «Библиотеки». Нажмите кнопку «Добавить папку классов ...» (при условии, что указанные вами проекты находятся в вашем рабочем пространстве) и выберите папку классов. Моя \ цель. Выберите это как папку библиотеки. Сделайте это в проекте A, чтобы сослаться на проект B. Сделайте это в проекте B, чтобы сослаться на проект A. Убедитесь, что вы не ссылаетесь на \ target \ projectNameFolder, иначе у вас не будет соответствующего импорта. Теперь вам не нужно удалять зависимость, а затем сбрасывать ее для принудительного перестроения.

Используйте библиотеки классов вместо ссылок на проекты.

Я бы очень предпочел Project References, так как он позволяет мне переключаться между исходными кодами разных проектов (использование библиотек классов привело к тому, что я попал в двоичные файлы, а затем мне пришлось вручную искать соответствующие исходные файлы - что было головной болью). Тем не менее, в этой ситуации циклической зависимости, я мог бы решить ее, только имея A, ссылаясь на B как ссылку на проект, а B ссылаясь на A как на библиотеки классов. Маленькая жертва, которую я должен был сделать, чтобы решить проблему зависимости от цикла. ADTC
2

Windows -> Настройки -> Java-> Компилятор -> Сборка -> Круговые зависимости

не решайте проблему, потому что eclipse не компилирует проекты, в которых есть еще один проект, а не скомпилированные.

Чтобы решить эту проблему, вы можете попытаться заставить elcipse скомпилировать каждый класс, который сможет.

Чтобы сделать это просто:

Deselect

Windows -> Настройки -> Java-> Компилятор -> Сборка -> Прервать сборку при возникновении ошибки пути сборки

Очистить и перестроить весь проект

Project -> Очистить ...

Reselect:

Windows -> Настройки -> Java-> Компилятор -> Сборка -> Прервать сборку при возникновении ошибки пути сборки

Если вы выбрали автоматическую сборку, вам не нужно будет делать это каждый раз, когда вы меняете код

1

вол сбой сборки, если он обнаруживает цикл, поскольку зависимости должны быть деревом.

Вы можете обнаружить, что у вас есть дополнительные объявления в manifest.mf по сравнению с определенными в pom.xml. любое дополнительное объявление может ввести цикл, который не будет очевиден для .

1

на pom-зависимости Maven), также можно иметь зависимости Import-Package. Намного проще ввести круговые зависимости с помощью Import-Package, чем Require-Bundle, но YMMV.

Кроме того, в проектах Eclipse есть «ссылки на проекты», в которых говорится, от каких других проектов это зависит. Eclipse использует это на высоком уровне, чтобы решить, какие проекты создавать и в каком порядке, поэтому вполне возможно, что ваш Manifest.MF перечисляет все правильно, но ссылки на проекты не в порядке. Щелкните правой кнопкой мыши по проекту и перейдите в свойства - вы увидите, от каких проектов вы зависите. Если вы текстовый человек, откройте файлы .project и посмотрите, от кого вы зависите - возможно, вместо этого на этом уровне определяется циклическая ссылка проекта (часто это происходит, когда у вас есть зависимость от AB, а затем перевернут из БА, но без обновления ссылок на .project).

+ 1 за упоминание проблем Eclipse с файлами .project. Иногда единственное решение - это выбросить все, что связано с Eclipse, и позволить ему снова разобраться с помпой .. Tim
1

ть плагин Eclipse, который показывает полное дерево зависимостей пути сборки проекта Java (хотя и не в графическом режиме - результат записывается в файл). Источники плагина здесьhttp: //github.com/PetrGlad/dependency-tre

спасибо, спасло много боли. kakopappa
0

это всегда был истинный цикл в зависимости, выраженной в Manifest.mf

Чтобы открыть манифест рассматриваемого проекта, на вкладке «Зависимости» найдите запись «Необходимые плагины». Затем следуйте оттуда до следующего (ых) проекта (ов) и повторите, в конце концов, цикл прояснитс

Эту задачу можно несколько упростить, воспользовавшись ссылками «Анализ зависимостей» в правом нижнем углу вкладки «Зависимости». Это позволяет обнаруживать циклы и упрощать навигационные зависимости.

Я также не знаю, почему Мейвен более терпим,

0

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

0

это может привести к более медленной среде и будущим проблемам.

Это происходит из-за того, что в какой-то момент Eclipse потерял направление на вашем пути сборки.

1 - Удалить проект и его ссылки из рабочей области. 2 - Импортируйте обратно. 3 - Проверьте ссылки.

Это лучшее решение.

0

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

0

ласти, и тогда все было в порядке. введите описание изображения здесь

Это не решение проблемы. Мэйвен жалуется на круговую зависимость артефактов. Это создаст проблемы. Krishna Kuntala
0

если у вас есть несколько проектов, которые включают друг друга в форме JAR. Я удалил все библиотеки и зависимости проекта от пути сборки для всех проектов. Затем, по одному, я добавил зависимости проекта на вкладку «Проект», но только те, которые были необходимы. Это связано с тем, что вы можете добавить проект, на который, в свою очередь, ссылается сам, или другой проект, который ссылается на какой-либо другой проект с этой проблемой, ссылающейся на себя.

Это решило мою проблему.

Похожие вопросы