java无法调试使用NB6创建的项目。NB7+中的9.1(具有使用JNI的JAR依赖项)
我刚刚尝试将我们的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中不会出现这种情况
为什么会这样?我需要在NB7+中显式设置java.library.path
没有对项目进行任何更改(不是我们做的),相同的JDK正在两个版本的IDE中使用。我怀疑新版本会悄悄地将更改应用于项目设置,并在过程中破坏某些东西。有人经历过类似的事情吗
编辑1:
试图摆弄project.properties
,设置-Djava.library.path
VM arg,不同的jdk/jre。。。这一切都无济于事。这让我快发疯了。显然我做错了什么
# 1 楼答案
我知道出了什么问题。这是在我以Netbeans项目的形式获得外部JAR(从现在开始)的源代码之后才变得明显的,这样我就可以调试它了
ext.jar
可能会根据特定条件加载几个DLL中的一个。它通过使用SomeClass.class.getProtectionDomain().getCodeSource().getLocation().getFile()
构造到相应DLL的文件路径,然后使用其值调用System.load(path)
。两个版本的Netbeans之间的路径不同ext.jar
实际上被另一个JAR(也是一个Netbeans项目)使用,而这个JAR又被应用程序(也是一个项目)的主可执行JAR使用项目设置中的所有外部库都位于所有项目所在的同一级别的目录中。这使多个项目能够使用一组公共库。项目使用相对路径来引用LIB
当构建
Main
时,必须在它之前构建Common
(Common
是Main
的项目依赖项)。在构建Common
(默认情况下)的过程中,所有依赖项jar都会被复制到${common.proj.dir}/dist/lib
。复制过程当然不知道它应该将DLL与ext.jar
一起复制然而,问题的根源在于对6.9.1和7+中的依赖项的不同处理。如果我指定
ext.jar
作为Main
和Common
的依赖项(这就是我所做的,即使Main
不直接使用其中的任何代码),6.9.1在调试时将使用../CommonLibraries/ext.jar
,它旁边总是有所有必需的DLL,而7+将始终使用${common.proj.dir}/dist/lib/ext.jar
,它缺少DLL在认识到问题所在后,解决方案就变得微不足道了。我在
Common
的build.xml
中添加了一个-post-clean
目标,它只是在每次清理之后将所需的DLL从../CommonLibraries/
复制到${common.proj.dir}/dist/lib/
。成功了。这两种方式都应该做到——为了完整性在IDE的两个版本中对依赖项的处理不同的原因似乎是
Project Properties/Build/Packaging
中出现了一个名为复制依赖库的新复选框。为Common
打勾也很有效。请注意,此复选框在默认情况下处于启用状态(即使对于库项目也是如此)