我弄清楚出了什么问题。ext.jar
这只有在我以 Netbeans 项目的形式获得外部 JAR 的源代码(从现在开始)之后才变得明显,因此我可以对其进行调试。
ext.jar
可能会根据某些条件加载几个 DLL 之一。它通过使用构造一个到适当 DLL 的文件路径SomeClass.class.getProtectionDomain().getCodeSource().getLocation().getFile()
,然后System.load(path)
用它的值调用。此路径在两个版本的 Netbeans 之间是不同的。ext.jar
实际上正被另一个 JAR(也是一个 Netbeans 项目)使用,而该 JAR 又被应用程序的主要可执行 JAR(也是一个项目)使用。
Main JAR (Netbeans project)
˪ Common JAR (Netbeans project)
˪ External JAR with JNI (ext.jar)
我们项目设置中的所有外部库都放置在与所有项目所在级别相同的目录中。这使多个项目能够使用一组通用的库。项目使用相对路径来引用库。
CommonLibraries
MainJARProjdir
CommonJARProjdir
RandomProjdir1
…
RandomProjdirN
何时Main
构建,Common
必须在它之前构建(Common
是一个项目依赖Main
)。在构建过程中Common
(默认情况下)所有依赖 JAR 都被复制到${common.proj.dir}/dist/lib
. 复制过程当然不知道它应该将 DLL 与ext.jar
.
然而,问题的根源在于6.9.1和7+中对依赖项的不同处理。如果我指定为两者的依赖项并且(这是所做的,即使不直接使用其中的任何代码)6.9.1 将使用调试时,它旁边总是有所有必需的 DLL,而 7 + 将始终使用,它缺少 DLL。ext.jar
Main
Common
Main
../CommonLibraries/ext.jar
${common.proj.dir}/dist/lib/ext.jar
在认识到问题是什么之后,解决方案就变得微不足道了。我添加了一个-post-clean
目标 to build.xml
of ,它只是在每次清理后将Common
所需的 DLL 复制../CommonLibraries/
到 to 。${common.proj.dir}/dist/lib/
有效。这应该以任何一种方式完成——为了完整起见。
在两个版本的 IDE 中对依赖项进行不同处理的原因似乎是一个Project Properties/Build/Packaging
名为Copy Dependent Libraries的新复选框。勾选它Common
也可以。请注意,默认情况下启用此复选框(即使对于库项目)。