为什么 Netbeans 加载 Java 库的顺序有时会导致错误?我该如何避免呢?

Why does the order in which Netbeans loads Java Libraries cause errors sometimes? and how do I avoid it?

基本后台数据:Windows7、Netbeans 8.0.2、LWJGL 2.9.3、Slick Util。 其余代码是我自己的。

所以,周期性地,我遇到了一个我认为是错误的问题,它导致我的程序在 IDE 内运行 运行,但是当我在项目。

今天又出事了,我决定追根究底。因此,复制了整个项目文件夹,它正在工作并且在其他方​​面完全相同,一次替换 1 个文件并进行测试,我能够将其缩小到 /nbproject/project.properties 文件。

所有其他文件都可以被替换,但问题仍然存在。仅替换此文件,问题就消失了。因此,我加载了这两个文件并并排比较它们(使用 Netbeans 的“Diff to...”功能)并将其缩小到以下几行:

javac.classpath=\
${libs.LWJGL-2.9.3.classpath}:\
${libs.0-Slick_Util.classpath}:\
${libs.0-Loaders_v03.classpath}:\
${libs.0-Text2D_v03.classpath}:\
${libs.0-Foundation_v04.classpath}:\
${libs.0-Abstracts_v04.classpath}

现在这段代码,看起来像是在告诉编译器加载库的顺序(我可能错了)。

考虑到这一点,我决定对其进行测试。我将这个块从工作文件复制到非工作文件,它工作得很好。顺便说一句,工作代码是这样的:

javac.classpath=\
${libs.LWJGL-2.9.3.classpath}:\
${libs.0-Slick_Util.classpath}:\
${libs.0-Foundation_v04.classpath}:\
${libs.0-Abstracts_v04.classpath}:\
${libs.0-Loaders_v03.classpath}:\
${libs.0-Text2D_v03.classpath}

您可能会注意到,唯一的区别是订单。继续我的测试,我进入了非工作项目的库属性页面,并简单地重新排序库以匹配工作列表。问题解决了!如果我只是将 Foundation 和 Abstracts 库在列表中向下移动,问题又回来了!

我一定尝试了十几种不同的订单组合,大约 2/3 失败了,1/3 成功了。那些工作全部涉及基础 and/or 摘要接近顶部。

为什么会这样?我如何才能知道我的库需要按什么顺序加载才能避免错误?

顺便说一句,错误是这样的:

F:\Dropbox-Documents-Java Programming\Library[=13=]-LoadingScreen_v04-Copy\src\A_Library\Test_LoadingScreen.java:94: error: cannot find symbol
    Lib_Foundation                  .setConfigLocation(configLocation);
  symbol:   method setConfigLocation(String)
  location: class Lib_Foundation

任何可以帮助我避免将来出现此问题的信息都将不胜感激。

似乎“Loaders_v03”或“Text2D_v03”包含自己的 Foundation 版本,包括不兼容的 Lib_Foundation class。 class 路径是按顺序搜索的,因此您当前的解决方案(重新排序 javac.classpath)将始终有效,前提是您下次对项目进行任何更改时 NetBeans 不会干扰它。

这是否会破坏 Loader 和 Text2D 取决于 Foundation 对面向对象设计的坚持程度:public classes 及其 public 成员永远不应该被更改或在后续版本中删除。 (这就是为什么为 Java 1.1 编写的 20 年前的代码仍然可以在 Java 8 中编译的原因。)