0

我刚刚尝试将我们的工作 Java 项目从Netbeans 6.9.1迁移到Netbeans 7.2,我遇到了一个问题,因为我们的项目依赖项之一是使用 JNI 的外部 JAR

我创建了我们项目目录的副本,并打开了最初使用旧版本 IDE 创建的 NB 项目的副本。一切都很顺利。我可以在 Netbeans 之外构建项目并运行已编译的可执行 JAR-s,而不会出现任何问题。

但是,当我尝试调试项目时,由于上述 JNI 依赖 JAR,应用程序无法正确初始化。就像 JAR 找不到与之关联的 DLL 一样(java.lang.UnsatisfiedLinkError结果给了我)。6.9.1 不会发生这种情况!

为什么会发生这种情况?我需要java.library.path在NB7+中明确设置吗?

没有对项目进行任何更改(不是我们做的),并且在两个版本的 IDE 中都使用了相同的 JDK。我怀疑较新的版本会默默地对项目设置进行更改,并在此过程中破坏某些东西。有人经历过类似的事情吗?

编辑1:

尝试摆弄project.properties,设置-Djava.library.pathVM arg,不同的JDK / JRE,......都无济于事。这让我发疯了。显然我做错了什么。

4

1 回答 1

0

我弄清楚出了什么问题。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.17+中对依赖项的不同处理。如果我指定为两者的依赖项并且(这是所做的,即使不直接使用其中的任何代码)6.9.1 将使用调试时,它旁边总是有所有必需的 DLL,而 7 + 将始终使用,它缺少 DLL。ext.jarMainCommonMain../CommonLibraries/ext.jar${common.proj.dir}/dist/lib/ext.jar

在认识到问题是什么之后,解决方案就变得微不足道了。我添加了一个-post-clean目标 to build.xmlof ,它只是在每次清理后将Common所需的 DLL 复制../CommonLibraries/到 to 。${common.proj.dir}/dist/lib/有效。这应该以任何一种方式完成——为了完整起见。

在两个版本的 IDE 中对依赖项进行不同处理的原因似乎是一个Project Properties/Build/Packaging名为Copy Dependent Libraries的新复选框。勾选它Common也可以。请注意,默认情况下启用此复选框(即使对于库项目)。

于 2012-10-18T11:13:35.200 回答