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

标签 java netbeans shared-libraries

基础后台数据:Windows 7、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}

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

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

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 有效。那些有效的方法都涉及到接近顶部的基础和/或摘要。

为什么会发生这种情况?我如何知道我的库需要加载什么顺序才能避免错误?

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

F:\Dropbox\2-Documents\4-Java Programming\Library\0-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 类。类路径是按顺序搜索的,因此您当前的解决方案(重新排序 javac.classpath)将始终有效(假设您下次对项目进行任何更改时 NetBeans 不会扰乱它)。

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

关于java - 为什么 Netbeans 加载 Java 库的顺序有时会导致错误?我该如何避免它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44349085/

相关文章:

java - 安卓按钮 : Shorten OnClick method

netbeans - 如何使用 netbeans 7.2.1 复制和粘贴彩色代码,保留行号

java - 有点混淆 SQL 和 Tomcat

c - 编写 C 动态库 [DSOs] 的良好实践(二进制兼容性 + 内存管理)

c - 如何保护我加载的插件?

swift - 将 ProductModuleName-Swift.h 导出到其他目标?

java - 在另一个链接/使用 .so 文件

Java SSH 使用 JSch 与 key 连接 - 身份验证失败

Java 线程 - 生成大量线程的替代方案

java - 从不同包中的不同类访问变量?