在项目xxx - 构建路径问题的构建路径中检测到循环

问题描述 投票:41回答:16

我正在使用maven和eclipse将我的项目转换为OSGI包。 Maven构建的东西很好,只是我现在在Eclipse中得到了上面的错误。我怎样才能找出导致这个问题的项目?有什么特别的观点吗?怎么会发生这种情况,我希望maven也能检测到循环依赖?

更新

好的,我发现了一些herehere

这可能是由felix maven-bundle-plugin引起的,它对每个导出也是一个导入吗?

java eclipse maven-2 osgi bundle
16个回答
88
投票

在Eclipse工具中将循环依赖项标记为“警告”,以避免“在构建路径中检测到循环”错误。

在Eclipse中转到:

Windows - >首选项 - > Java->编译器 - >构建 - >循环依赖项


0
投票

当我遇到这些问题时,它总是在Manifest.mf中表达的依赖关系中真正的循环

因此,打开相关项目的清单,在Dependencies选项卡上,查看“Required Plugins”条目。然后从那里到下一个项目,并重复最终循环将变得清晰。

您可以通过使用“依赖关系”选项卡右下角的“依赖关系分析”链接来简化此任务,这具有循环检测和更轻松的导航depdendencies。

我也不知道为什么Maven更宽容,


0
投票

尝试删除引用并将其添加回来,有时候eclipse表现得很奇怪,因为除非你修复了这个错误,否则它不会让你刷新。所以尝试删除所有依赖项目并将其添加回Clean和build


0
投票

刚重启Eclipse修复了我的项目中的问题


0
投票

尽管“Mark Circular Dependencies”允许您编译代码,但它可能会导致较慢的环境和未来的问题。

这种情况正在发生,因为在某些时候Eclipse已经失去了它在构建路径上的指示。

1 - 从工作区中删除项目及其引用。 2 - 再次导入。 3 - 检查参考文献。

这是最好的解决方案。


0
投票

我今天遇到了同样的问题。这个错误很贴切。错误地,我添加了循环依赖。 A依赖于B.在我的情况下,错误的是,除了将B添加为依赖于A之外,我还将A添加为依赖于B.这是一个愚蠢的错误。


0
投票

我也有这个问题。我只是禁用工作区分辨率,然后一切都是正确的.enter image description here


0
投票

当您有几个以JAR形式相互包含的项目时,可能会发生这种情况。我所做的是删除所有项目的buildpath上的所有库和项目依赖项。然后,我一次一个,在项目选项卡上添加了项目依赖项,但只添加了需要的项目依赖项。这是因为您可以添加一个项目,该项目本身也会引用该项目,或者另一个项目正在引用具有此自引用问题的其他项目。

这解决了我的问题。


12
投票

当我们在工作区中有多个项目时,我们必须在项目之间设置引用,而不是在项目之间。如果P1引用P2,则P2引用P3,P3引用返回P1。这将导致一个循环。

解决方案是绘制工作空间中项目之间的参考图。检查每个项目的Java Build Path以查看Projects窗口的Tab。取出引用回主项目的项目,例如P3参考P1,在上面的例子中。

详细操作是在RAD OR eclipse中选择P3项目,右键单击项目并选择属性选项,它会为P3的属性打开一个新窗口。单击“Java Build Path”部分,选择“Projects”选项Tab。您可以在字段中看到P3已引用P1。选择P1参考,单击窗口右侧的“删除”按钮。然后,单击“确定”。 IDE将开始自动重置路径。

完成。

继续查找每个项目中所有错误引用的引用,直到您对图中的每个项目都有正确的引用。祝好运!


7
投票

由于一个项目引用了另一个,我得到了这个。

  1. 删除从项目A到项目B的引用
  2. 尝试运行的东西,它会破碎
  3. 重新添加参考
  4. 清洁/清洁和建造
  5. 回到工作

4
投票

简单来说,一个循环就是当捆绑包A依赖于依赖于捆绑包A的捆绑包B.如果这是源代码,则无法在一次通过中单独构建捆绑包。

由于问题仅在Eclipse中显示,因此它可能是二进制循环依赖,而不是源代码循环依赖。

最近版本的Eclipse支持二进制循环:Eclipsesource Blog

如果循环在你的代码中,那么我建议通过将一些代码分解为第3个bundle以重新删除循环依赖来重构代码。

并注意您是否正在使用OSGi片段(单元测试的常见模式),因为它很容易引入循环。

Eclipse的清单编辑器确实在“依赖关系”选项卡上有用于查找周期的功能(您需要单击“依赖关系分析”),但我从未看到它显示循环,即使Eclipse有一个大红色X告诉我有一个周期!


3
投票

Problem

我有一个旧项目,测试两个不同的Dictionary接口实现。一个是未排序的ArrayList,另一个是HashTable。这两种实现是定时的,因此可以进行比较。您可以从命令行args中选择哪种数据结构。现在..我有另一个数据结构,它是一个树结构。我想测试它的时间,以便将它与HashTable进行比较。所以..在新的dataStructure项目中,我需要实现Dictionary接口。在Dictionary项目中,我需要能够添加特定于我的新dataStructure项目的代码。存在循环依赖。这意味着当Eclipse去找出哪些项目依赖于项目A时,它会找到项目B.当需要找出依赖项目的子依赖项时,它会找到A,它再次依赖于B.没有树,而是带有循环的图形。

Solution

当您去配置构建路径时,请转到“库”选项卡,而不是输入相关项目(“项目”选项卡)。单击“添加类文件夹...”按钮(假设您引用的项目位于工作区中),然后选择类文件夹。我的目标是。选择此项作为库文件夹。在项目A中执行此操作,以引用项目B.在项目B中执行此操作以引用项目A.确保您不引用\ target \ projectNameFolder或者您将没有匹配的导入。现在,您不必删除依赖项,然后重置它,以强制重建。

使用类库而不是项目引用。


2
投票

有时标记为警告

Windows - >首选项 - > Java->编译器 - >构建 - >循环依赖项

没有解决问题,因为eclipse不编译在未编译的依赖项中有另一个项目的项目。

因此,要解决此问题,您可以尝试强制Eclipse编译它能够的每个类。

为了做到这一点:

  1. 取消

Windows - >首选项 - > Java->编译器 - >构建 - >发生构建路径错误时中止构建

  1. 清理并重建所有项目

项目 - >清洁......

  1. 重新选择:

Windows - >首选项 - > Java->编译器 - >构建 - >发生构建路径错误时中止构建

如果选择了“自动构建”,则每次更改代码时都不需要执行此操作


1
投票

如果检测到循环,Maven将失败构建,因为依赖项必须是树。

您可能会发现manifest.mf中的其他声明超过了pom.xml中定义的声明。任何额外的声明都可能引入一个对Maven不明显的循环。


1
投票

除了依赖管理的Require-Bundle形式(最类似于Maven的pom依赖项),它也可能具有Import-Package依赖性。使用Import-Package比使用Require-Bundle引入循环依赖更容易,但是YMMV。

此外,Eclipse项目有一个“项目引用”,它说明了它依赖的其他项目。 Eclipse在高层次上使用它来决定要构建哪些项目,以及按什么顺序,所以很有可能你的Manifest.MF正确地列出了所有项目,但是项目引用是不合适的。右键单击项目,然后转到属性 - 您将看到您依赖的项目。如果你是一个文本类型的人,打开.project文件,看看你依赖哪些文件 - 很可能是在那个级别定义项目循环链接(通常是因为你有AB依赖关系然后从BA翻转但没有更新.project引用)。


1
投票

我不久前遇到了类似的问题,并决定编写Eclipse插件,显示Java项目的完整构建路径依赖树(虽然不是图形模式 - 结果写入文件)。插件的来源是http://github.com/PetrGlad/dependency-tree

© www.soinside.com 2019 - 2024. All rights reserved.