Java Eclipse调试器为最终字段显示与源代码不同的值

Java Eclipse调试器为最终字段显示与源代码不同的值,java,eclipse,debugging,maven,testng,Java,Eclipse,Debugging,Maven,Testng,在尝试解决启动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) ... 我对本文有两个问题:根据我的po

在尝试解决启动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.6。。。 根据Eclipse下载的源代码,它应该是“6.8.2beta_20130330_0839”。 在调试org.testng.internal.Version.displayBanner时,我认为Eclipse的行为很奇怪-我做了一个屏幕截图:

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

我找不到TestNG 6.8.6测试。。。在我的课堂上

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


编辑:抱歉,调试时未捕获屏幕截图。新的截图链接在上面,旧的截图可以在这里找到:

似乎还没有很好地理解,将版本信息放入
公共静态final
字段不是一个好主意。如果这样一个字段有一个基元类型或
String
,并且像本例中那样直接赋值,那么它是一个编译时常量,引用该字段的每个类都会在编译时复制它的值。因此,如果编译时的版本与运行时的版本不同,则很可能出现不一致

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

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


嗯,你已经解决了这个问题,但我想下次再知道这些事情是件好事……

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