52

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

更新

好的,我在 这里这里找到了一些东西

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

4

17 回答 17

98

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

在 Eclipse 中转到:

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

于 2013-07-15T09:02:04.887 回答
15

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

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

具体操作是在RAD OR eclipse中选择P3项目,在项目上右击选择属性选项,弹出一个新的P3属性窗口。单击“Java Build Path”部分,选择“Projects”选项选项卡。您可以看到 P3 在字段中引用了 P1。选择 P1 引用,单击窗口右侧的“删除”按钮。然后,点击确定。IDE 将开始自动重置路径。

完毕。

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

于 2010-12-23T18:15:29.960 回答
8

我有这个是因为一个项目引用了另一个。

  1. 删除项目 A 对项目 B 的引用
  2. 尝试运行东西,它会打破
  3. 重新添加参考
  4. 清洁/清洁和建造
  5. 回到工作
于 2012-01-13T19:53:31.437 回答
4

简单来说,一个循环就是bundle A依赖bundle B,而bundle B又依赖于bundle A。如果这是源代码,那么就没有办法一次性单独构建bundle。

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

在最新版本的 Eclipse 中支持二进制循环:Eclipsesource 博客

如果循环在您的代码中,那么我建议通过将一些代码分解为第三个包来重构代码,以消除循环依赖。

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

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

于 2009-07-07T12:06:25.647 回答
4

有时标记为警告

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

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

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

为了做到这一点:

  1. 取消选择

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

  1. 清理并重建所有项目

项目 -> 清理...

  1. 重新选择:

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

如果您选择了自动构建,那么每次更改代码时都不需要这样做

于 2018-06-01T10:03:46.373 回答
3

问题

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

解决方案

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

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

于 2012-11-30T21:44:52.967 回答
3

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

于 2010-09-14T15:50:59.947 回答
2

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

您可能会发现 manifest.mf 中的声明比 pom.xml 中定义的声明多。任何额外的声明都可能引入一个对 Maven 来说不明显的循环。

于 2009-07-06T20:17:21.110 回答
1

除了 Require-Bundle 形式的依赖管理(最类似于 Maven 的 pom 依赖),还可以有 Import-Package 依赖。使用 Import-Package 引入循环依赖比使用 Require-Bundle 容易得多,但是 YMMV。

此外,Eclipse 项目有一个“项目引用”,它说明它依赖于哪些其他项目。Eclipse 在较高级别使用它来决定要构建哪些项目以及以何种顺序构建,因此您的 Manifest.MF 很可能正确列出了所有内容,但项目引用不正常。右键单击一个项目,然后转到属性 - 您将看到您依赖的项目。如果您是文本类型的人,请打开 .project 文件并查看您在那里依赖哪些文件 - 很可能是在该级别定义了项目循环链接(通常是在您有 AB 依赖项时引起的,然后从 BA 翻转但没有更新 .project 引用)。

于 2009-07-27T21:29:48.293 回答
0

只需重新启动 Eclipse 即可解决我项目中的问题

于 2014-01-25T17:53:44.290 回答
0

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

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

您可以使用 Dependencies 选项卡右下角的 Dependency Analysis 链接稍微简化此任务,这具有循环检测和更轻松的导航依赖关系。

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

于 2009-07-05T21:55:43.670 回答
0

尝试删除引用并将其添加回来,有时 Eclipse 的行为很奇怪,因为除非您修复该错误,否则它不会允许您刷新。所以尝试删除所有依赖项项目并将其添加回来清理并构建

于 2013-07-26T17:33:29.037 回答
0

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

发生这种情况是因为 Eclipse 在某些时候已经失去了它在构建路径上的方向。

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

这是最好的解决方案。

于 2014-11-10T15:57:36.373 回答
0

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

于 2017-04-04T11:57:57.130 回答
0

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

这解决了我的问题。

于 2017-11-24T15:53:10.840 回答
0

我也有这个问题。我只是禁用了工作区分辨率,然后一切正常。在此处输入图像描述

于 2017-06-06T10:51:03.077 回答
0

Eclipse 有一个错误,它报告了比需要更多的周期。2019-12 版本已修复此问题。见https://bugs.eclipse.org/bugs/show_bug.cgi?id=551105

于 2020-03-26T10:56:15.887 回答