【问题标题】:Eclipse Debugger shows a different value for a final field than the source code doesEclipse 调试器显示的最终字段值与源代码不同
【发布时间】:2013-10-18 10:48:07
【问题描述】:

在启动 TestNG 套件时尝试解决 OutOfMemoryError 时,我更改了我的 pom.xml 以使用当前可用的最新版本:TestNG 6.8.7(之前:6.8.1)

但如果我现在尝试启动一个套件,org.testng.internal.Version.displayBanner() 仍然会打印相同的文本:

...
... TestNG 6.8.6beta_20130517_2142 by Cédric Beust (cedric@beust.com)
...

我对这个文本有两个问题:根据我的 pom,它应该是 6.8.7,而不是 6.8.6beta_... 而根据 Eclipse 下载的源代码,应该是“6.8.2beta_20130330_0839”。 在我看来,在调试 org.testng.internal.Version.displayBanner 时,Eclipse 的行为很奇怪——我做了一个截图:Eclipse showing different text in source than in output

在我以外的其他工作站上,打印的文本不同,但不是预期的版本 6.8.7:“Cédric Beust 的 TestNG 6.8.6”也是。

我在类路径中找不到 TestNG 6.8.6beta_...。

我的问题是: 为什么版本的字符串在源、打印/运行时不同,为什么两个版本都不等于 6.8.7?!

编辑:抱歉,调试时没有截取屏幕截图。新的截图链接在上面,旧的可以在这里找到:not at runtime: Eclipse showing different text in source than in output

【问题讨论】:

    标签: java eclipse debugging maven testng


    【解决方案1】:

    似乎还没有很好理解将版本信息放入public static final字段不是一个好主意。如果这样的字段具有原始类型或String,并且像本例中一样直接分配,则它是编译时常量,并且引用该字段的每个类都将在编译时复制其值。因此,如果编译时的版本与运行时的版本不同,则很可能出现不一致。

    此外,eclipse 不一定显示一个类的正确源代码版本。根据库的类型,源文件与二进制类文件的关联方式不同,但 Eclipse 不会验证源文件和类文件是否兼容。

    如果不确定当前执行的类是否是正确的版本,可以在调试器中验证类的来源。转到“表达式”视图并添加一个新条目org.testng.internal.Version.class.getProtectionDomain().getCodeSource().getLocation()。这很长,但幸运的是有复制和粘贴。这适用于不是来自 JRE 的所有类。另一种方法是org.testng.internal.Version.class.getResource("Version.class"),它甚至适用于 JRE 类,但需要对结果进行一些解释。如果调试器中当前显示的类导入该类,您可以使用短类名。

    嗯,你已经解决了这个问题,但我认为这些事情下次知道就好了……

    【讨论】:

      【解决方案2】:

      我自己发现了部分问题。我更新了 Eclipse 的 TestNG 插件,现在打印了 TestNG 6.8.6。似乎 pom.xml 中使用的版本与 Eclipse 执行无关 - 可能已经知道了。

      【讨论】:

        猜你喜欢
        • 2017-08-29
        • 1970-01-01
        • 2012-08-16
        • 1970-01-01
        • 2012-08-03
        • 2013-01-21
        • 2015-09-14
        • 2014-01-15
        • 2018-05-09
        相关资源
        最近更新 更多