我正在使用maven和eclipse将我的项目转换为OSGI包。 Maven构建的东西很好,只是我现在在Eclipse中得到了上面的错误。我怎样才能找出导致这个问题的项目?有什么特别的观点吗?怎么会发生这种情况,我希望maven也能检测出循环依赖性?
更新
这可能是由felix maven-bundle-plugin引起的,它对每个导出也都是导入吗?
答案 0 :(得分:83)
在Eclipse工具中将循环依赖关系标记为“警告”,以避免“在构建路径中检测到循环”错误。
在Eclipse中转到:
Windows - >偏好 - > Java的>编译器 - >建筑 - >循环依赖
答案 1 :(得分:11)
当我们在工作区中有多个项目时,我们必须在项目之间设置引用,而不是在项目之间。如果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将开始自动重置路径。
完成。
在每个项目中找到所有错误引用的引用,直到您对图中的每个项目都有正确的引用。祝你好运!
答案 2 :(得分:7)
由于一个项目引用了另一个项目,我得到了这个。
答案 3 :(得分:4)
简单来说,一个循环就是当捆绑包A依赖于依赖于捆绑包A的捆绑包B.如果这是源代码,则无法在一次通过中单独构建捆绑包。
由于问题仅在Eclipse中显示,因此它可能是二进制循环依赖,而不是 到源代码循环依赖。
最近版本的Eclipse支持二进制周期:Eclipsesource Blog
如果循环在你的代码中,那么我建议通过将一些代码分解为第3个bundle以重新删除循环依赖来重构代码。
请注意您是否使用OSGi片段(单元测试的常用模式),因为引入循环非常容易。
Eclipse的清单编辑器确实在“依赖关系”选项卡上有用于查找周期的功能(您需要单击“依赖关系分析”),但我从未看到它显示循环,即使Eclipse有一个大的红色X告诉我有一个周期!
答案 4 :(得分:3)
我有一个旧项目,测试两个不同的Dictionary接口实现。一个是未排序的ArrayList,另一个是HashTable。这两种实现是定时的,因此可以进行比较。您可以从命令行args中选择哪种数据结构。现在..我有另一个数据结构,它是一个树结构。我想测试它的时间,以便将它与HashTable进行比较。所以..在新的dataStructure项目中,我需要实现Dictionary接口。在Dictionary项目中,我需要能够添加特定于我的新dataStructure项目的代码。存在循环依赖。这意味着当Eclipse去找出哪些项目依赖于项目A时,它会找到项目B.当需要找出依赖项目的子依赖项时,它会找到A,它再次依赖于B.没有树,而是带有循环的图表。
当您去配置构建路径时,请转到“库”选项卡,而不是输入相关项目(“项目”选项卡)。单击“添加类文件夹...”按钮(假设您引用的项目位于工作区中),然后选择类文件夹。我的目标是。选择此项作为库文件夹。在项目A中执行此操作,以引用项目B.在项目B中执行此操作以引用项目A.确保您不引用\ target \ projectNameFolder或者您将没有匹配的导入。现在,您不必删除依赖项,然后重置它,以强制重建。
使用类库而不是项目引用。
答案 5 :(得分:2)
有时标记为警告
Windows - >偏好 - > Java的>编译器 - >建筑 - >循环依赖
没有解决问题,因为eclipse不会编译那些在未编译的依赖项中有另一个项目的项目。
因此,要解决此问题,您可以尝试强制Eclipse编译它能够的每个类。
要做到这一点:
Windows - >偏好 - > Java的>编译器 - >建筑 - >发生构建路径错误时中止构建
项目 - >清洁...
Windows - >偏好 - > Java的>编译器 - >建筑 - >发生构建路径错误时中止构建
如果您选择了自动构建,则每次更改代码时都不需要这样做
答案 6 :(得分:1)
如果检测到循环,Maven 将使构建失败,因为依赖项必须是树。
您可能会发现manifest.mf中的其他声明超过了pom.xml中定义的声明。任何额外的声明都可能引入一个对Maven不明显的循环。
答案 7 :(得分:1)
前一段时间我遇到了类似的问题,并决定编写Eclipse插件,该插件显示Java项目的完整构建路径依赖关系树(虽然不是图形模式 - 结果写入文件)。插件的来源是http://github.com/PetrGlad/dependency-tree
答案 8 :(得分:1)
除了依赖管理的Require-Bundle形式(最类似于Maven的pom依赖项),它也可能具有Import-Package依赖性。使用Import-Package比使用Require-Bundle引入循环依赖更容易,但是YMMV。
此外,Eclipse项目有一个“项目引用”,它说明了它依赖的其他项目。 Eclipse在高层次上使用它来决定要构建哪些项目,以及以哪种顺序,所以很有可能你的Manifest.MF正确地列出了所有项目,但是项目引用是不合适的。右键单击项目,然后转到属性 - 您将看到您依赖的项目。如果你是一个文本类型的人,打开.project文件,看看你依赖哪些文件 - 很可能是在那个级别定义项目循环链接(通常是当你有AB依赖关系然后从BA翻转但没有更新.project引用。)
答案 9 :(得分:0)
尝试删除引用并将其添加回来,有时eclipse表现得很奇怪,因为除非你修复了这个错误,否则它不会让你刷新。所以尝试删除所有依赖项目并将其添加回来 清理并构建
答案 10 :(得分:0)
重新启动Eclipse修复了我的项目中的问题
答案 11 :(得分:0)
虽然" Mark Circular Dependencies"使您能够编译代码,这可能会导致较慢的环境和未来的问题。
这种情况正在发生,因为在某些时候Eclipse已经在构建路径上失去了它的指示。
1 - 从工作区中删除项目及其引用。 2 - 再次导入。 3 - 检查参考文献。
这是最好的解决方案。
答案 12 :(得分:0)
我今天遇到了同样的问题。这个错误很贴切。错误地,我添加了循环依赖。 A依赖于B.在我的情况下,错误的是,除了将B添加为依赖于A之外,我还将A添加为依赖于B.这是一个愚蠢的错误。
答案 13 :(得分:0)
我也有这个问题。我只是禁用工作区解析,然后一切正常。enter image description here
答案 14 :(得分:0)
当您有几个以JAR形式包含彼此的项目时,可能会发生这种情况。 我所做的是删除所有项目的buildpath上的所有库和项目依赖项。然后,我一次一个,在项目选项卡上添加了项目依赖项,但只添加了需要的项目依赖项。 这是因为您可以添加一个项目,而该项目本身也会引用该项目,或者另一个项目正在引用具有此自引用问题的其他项目。
这解决了我的问题。
答案 15 :(得分:0)
当我遇到这些问题时,它总是在Manifest.mf中表达的依赖关系中真正的循环
打开相关项目的清单,在Dependencies选项卡上,查看“Required Plugins”条目。然后从那里到下一个项目,并重复最终循环将变得清晰。
您可以通过使用“依赖关系”选项卡右下角的“依赖关系分析”链接来简化此任务,这具有循环检测和更轻松的导航限制。
我也不知道为什么Maven更宽容,
答案 16 :(得分:0)
Eclipse有一个错误,报告所需要的周期更多。此问题已在2019-12版本中修复。参见https://mcnmedia.tv/iframe/2684