我只是尝试将我们正在运行的Java项目从 Netbeans 6.9.1 迁移到 Netbeans 7.2 ,我遇到了一个问题,因为我们的一个项目依赖项是使用JNI的外部JAR 。
我创建了项目目录的副本,只是打开了最初使用旧版IDE创建的NB项目的副本。一切顺利。我可以构建项目并在Netbeans之外运行已编译的可执行JAR-s而没有任何问题。
但是,当我尝试调试项目时,由于所述JAR与JNI的依赖关系,应用程序无法正确初始化。这就像JAR未能找到与之关联的DLL(因此给我java.lang.UnsatisfiedLinkError
)。这不会发生在6.9.1!
为什么会这样?我是否需要在NB7 +中明确设置java.library.path
?
没有对项目进行任何更改(不是我们),并且在两个版本的IDE中都使用了相同的JDK。我怀疑较新的版本会默默地对项目设置应用更改并在此过程中中断某些内容。有人经历过类似的事吗?
编辑1:
试图摆弄project.properties
,设置-Djava.library.path
VM arg,不同的JDK / JRE,......都无济于事。这让我疯了。显然我做错了。
答案 0 :(得分:0)
我弄清楚出了什么问题。这只是在我从Netbeans项目的形式获得外部JAR(ext.jar
的源代码)后才变得明显,所以我可以调试它。
ext.jar
可能会根据特定条件加载多个DLL中的一个。它使用SomeClass.class.getProtectionDomain().getCodeSource().getLocation().getFile()
构造相应DLL的文件路径,然后使用它的值调用System.load(path)
。 Netbeans的两个版本之间的路径不同。 ext.jar
实际上被另一个JAR(也是一个Netbeans项目)使用,而后者又被应用程序的主可执行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
)。在构建${common.proj.dir}/dist/lib
(默认情况下)的过程中,所有依赖项JAR都会复制到ext.jar
。复制过程当然不知道它应该将DLL与ext.jar
一起复制。
然而,问题的根源是 6.9.1 和 7 + 中不同处理的依赖关系。如果我指定Main
是对Common
和Main
的依赖(这就是所做的,即使../CommonLibraries/ext.jar
没有直接使用它的任何代码).6.9 .1将在调试时使用${common.proj.dir}/dist/lib/ext.jar
,它总是包含所有必需的DLL,而7+将始终使用-post-clean
,这是缺少DLL。
在认识到问题所在之后,解决方案变得微不足道。我向build.xml
的{{1}}添加了Common
目标,只需在每次清理后将所需的DLL从../CommonLibraries/
复制到${common.proj.dir}/dist/lib/
。有效。这应该以任何一种方式完成 - 为了完整起见。
在两个版本的IDE中不同处理依赖关系的原因似乎是Project Properties/Build/Packaging
中出现的一个新复选框,名为 复制相关库 。为Common
选择关闭也有效。请注意,默认情况下启用此复选框(即使对于库项目)。