有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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.pathVM arg,不同的jdk/jre。。。这一切都无济于事。这让我快发疯了。显然我做错了什么


共 (1) 个答案

  1. # 1 楼答案

    我知道出了什么问题。这是在我以Netbeans项目的形式获得外部JAR(从现在开始)的源代码之后才变得明显的,这样我就可以调试它了

    ext.jar可能会根据特定条件加载几个DLL中的一个。它通过使用SomeClass.class.getProtectionDomain().getCodeSource().getLocation().getFile()构造到相应DLL的文件路径,然后使用其值调用System.load(path)。两个版本的Netbeans之间的路径不同ext.jar实际上被另一个JAR(也是一个Netbeans项目)使用,而这个JAR又被应用程序(也是一个项目)的主可执行JAR使用

    Main JAR (Netbeans project)
     ˪ Common JAR (Netbeans project)
         ˪ External JAR with JNI (ext.jar)
    

    项目设置中的所有外部库都位于所有项目所在的同一级别的目录中。这使多个项目能够使用一组公共库。项目使用相对路径来引用LIB

    CommonLibraries
    MainJARProjdir
    CommonJARProjdir
    RandomProjdir1
    …
    RandomProjdirN
    

    当构建Main时,必须在它之前构建CommonCommonMain的项目依赖项)。在构建Common(默认情况下)的过程中,所有依赖项jar都会被复制到${common.proj.dir}/dist/lib。复制过程当然不知道它应该将DLL与ext.jar一起复制

    然而,问题的根源在于6.9.17+中的依赖项的不同处理。如果我指定ext.jar作为MainCommon的依赖项(这就是我所做的,即使Main不直接使用其中的任何代码),6.9.1在调试时将使用../CommonLibraries/ext.jar,它旁边总是有所有必需的DLL,而7+将始终使用${common.proj.dir}/dist/lib/ext.jar,它缺少DLL

    在认识到问题所在后,解决方案就变得微不足道了。我在Commonbuild.xml中添加了一个-post-clean目标,它只是在每次清理之后将所需的DLL从../CommonLibraries/复制到${common.proj.dir}/dist/lib/。成功了。这两种方式都应该做到——为了完整性

    在IDE的两个版本中对依赖项的处理不同的原因似乎是Project Properties/Build/Packaging中出现了一个名为复制依赖库的新复选框。为Common打勾也很有效。请注意,此复选框在默认情况下处于启用状态(即使对于库项目也是如此)