【发布时间】:2017-06-03 22:27:17
【问题描述】:
基本背景数据: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}
现在这段代码,看起来像是在告诉编译器应该加载库的顺序(我可能错了)。
考虑到这一点,我决定对其进行测试。我将此块从工作文件复制到非工作文件,它工作得很好。顺便说一句,工作代码是这样的:
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 成功。那些工作的都涉及到 Foundation 和/或 Abstracts 以接近顶部。
为什么会这样?我如何知道我的库需要按什么顺序加载才能避免错误?
顺便说一句,错误是这样的:
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类。
-
我检查过了,因为我没有想到。 Loaders_v03 和 Text2D_v03 都有 Foundation 的版本 2,而不是 4。如何防止旧版本加载? Foundation_v04 在列表中首先加载会使其优先吗?如果 Loaders 和 Text2D 需要 Foundations_v02 的某些功能而不会被加载怎么办?
-
是的,类路径是按顺序搜索的,因此您当前的解决方案(重新排序
javac.classpath)将始终有效,前提是下次您对项目进行任何更改时 NetBeans 不会将其弄乱。这是否会破坏 Loaders 和 Text2D 取决于 Foundation 对面向对象设计的坚持程度:公共类及其公共成员永远不应该在后续版本中更改或删除。 (这就是为什么 20 年前为 Java 1.1 编写的代码仍然可以在 Java 8 中编译的原因。) -
有道理。只需在非最新版本的方法上使用 deprecated 即可。将此添加为答案,我会将其标记为正确的解决方案。
标签: java netbeans shared-libraries