【问题标题】:Packages P1 and P2 have a dependency cycle, but no class of P1 uses P2 (analyzed by jdepend)包 P1 和 P2 有一个依赖循环,但是 P1 没有一个类使用 P2(通过 jdepend 分析)
【发布时间】:2011-12-06 03:58:10
【问题描述】:

一般包依赖问题

如果P1的类和接口都没有使用P2,包P1和P2在什么情况下会存在依赖循环? IE。 “隐藏依赖”从何而来?

使用 jdepend 的具体示例

jdepend 说我在stsimulator 和stsimulator.ststraversal 之间有一个包依赖关系,但是stsimulator 的任何类或接口都没有使用stsimulator.ststraversal 的任何部分,意思是

  • jdepend 的 Eclipse 中的 dependencies-explorer 是这样说的,并且
  • stsimulator 的所有类/接口既不导入 stsimuator.* 也不使用字符串“ststraversal”。

怎么可能?

我的包依赖循环的一部分,由 jdepend 打印

--------------------------------------------------
- Package Dependency Cycles:
--------------------------------------------------

stsimulator
    |
    |   stsimulator.ststraversal
    |-> stsimulator


stsimulator.sts
    |
    |   stsimulator.interpreter.javacc
    |-> stsimulator
    |   stsimulator.ststraversal
    |-> stsimulator

stsimulator.ststraversal
    |
    |   stsimulator
    |-> stsimulator.ststraversal

【问题讨论】:

    标签: java architecture dependencies package jdepend


    【解决方案1】:

    同样的事情也发生在我们身上。场景如下:
    我们在相同的包结构中拥有测试类,但在不同的源目录中。实际代码和测试代码都被编译到同一个输出目录中(我认为这是 Eclipse 中的默认值,除非您另外指定)。由于 JDepend 不分析源代码而是分析编译后的代码,所以我们的测试类不小心引入了包之间的幻像依赖。

    【讨论】:

    • +1 表示“jdepend 分析编译后的代码”。但我的测试类在目录workspace/stsimulatorLazyOTFBranch/build/test/,生产代码在workspace/stsimulatorLazyOTFBranch/build/classes。此外,我在 junit cycleTest 中使用了jdepend.addDirectory("/home/dball/workspace/stsimulatorLazyOTFBranch/build/classes");,在大约 90% 的情况下它不确定地失败。当我检查 stsimulator 时,Eclipse 中的 jdepend 的依赖关系资源管理器没有列出对 stsimulator.ststraversal 的依赖关系。 很奇怪。如果您有其他想法/提示,那就太好了。
    • 首先,你的stsimulator 的test 类是否真的依赖于stsimulator.ststraversal?我的意思是,您的测试类是否有可能以某种方式引入这些依赖项?其次,我会检查在您的 JUnit 测试中提供给 JDepend 的输入是否实际上总是相同的。如果不是这样可以解释看似随机的故障,或者至少表明问题不在于 JDepend。
    • 是的,stsimulator.ststraversal 存在一个依赖关系,这是由 stsimulator 中具有@SuiteClasses(value = {AClassInStsimulatorStstraversal.class}) 的测试类引起的。所以我认为你是对的,我的测试是原因。不过,我不明白是怎么回事:我对 JDepend 的输入是不变的,而且我无法在过去几天重现 cycleTest-fails ...
    • 也许凭借您的 JDepend 经验,您对stackoverflow.com/q/7284130/750378 也有很好的解决方案?这将是伟大的和荣幸与 upvote + accept :)
    • 这可能只是因为在某些时候你的所有源代码和测试都在 JDepend 类加载器加载的类路径中。
    猜你喜欢
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2011-02-15
    • 2015-03-01
    相关资源
    最近更新 更多