Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从控制台运行是正常的,从Eclipse错误_Java_Eclipse - Fatal编程技术网

Java 从控制台运行是正常的,从Eclipse错误

Java 从控制台运行是正常的,从Eclipse错误,java,eclipse,Java,Eclipse,我快被日食弄疯了。我正在编写使用外部jar的简单测试类。它使用本机library.dll 当我从Eclipse运行时,命令Run。 这里是我的堆栈跟踪: Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Program Files\YAZ\bin\yaz4j.dll: The specified procedure could not be found at java.lang.ClassLoader$Native

我快被日食弄疯了。我正在编写使用外部jar的简单测试类。它使用本机library.dll 当我从Eclipse运行时,命令Run。 这里是我的堆栈跟踪:

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Program Files\YAZ\bin\yaz4j.dll: The specified procedure could not be found
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1939)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1864)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
    at java.lang.Runtime.loadLibrary0(Runtime.java:845)
    at java.lang.System.loadLibrary(System.java:1084)
    at org.yaz4j.Connection.<clinit>(Connection.java:56)
    at ru.Test.testConnection(Test.java:20)
    at ru.Test.main(Test.java:15)
一切都很完美! 这是相同的代码它如何在控制台中工作而在Eclipse中不工作?

下面是我如何在Eclipse中将这个引用的jar插件到我的项目中:

当本机方法无法链接时,您会收到可怕的消息。我可以想出几个可能传达这一信息的根本原因:

  • 从Eclipse加载时,DLL没有加载其他依赖DLL。这由Windows PATH环境变量控制,当您在Eclipse中运行时,该变量可能会有所不同
  • 它是一个32位的DLL,您在Eclipse下使用64位JVM运行,但从命令行使用32位(反之亦然)

  • 几天来,我一直在努力解决同一个问题,现在我试图在我的项目中使用YAZ工具包。问题是本机库可以正确地加载到各种测试计算机上,但不能加载到我的个人电脑上

    简而言之:问题的原因是JVM加载了不正确的libxml2.dlllibxslt.dll依赖库

    当我从IDE启动JVM时,它开始在以下位置查找本机库:

  • (jdk\u home\u dir)\jre\bin。加载依赖库(除主yaz4j.dll外)时,在所有其他测试计算机上跳过了此步骤。这样,测试计算机就不会加载错误的dll
  • (jdk\u home\u dir)\bin
  • 如果设置-Djava.library.path参数,它将在该步骤中查看该目录
  • %SystemRoot%\system32
  • %系统根%
  • 为项目设置的工作目录(如果有)。由于未知原因,在我的个人电脑上跳过了此步骤,但在所有其他测试计算机上都有效
  • %路径%
  • 我已经用计算机解决了这个问题。注意,步骤1和2可以互换

    名为yaz4j.DLL的YAZ工具箱主DLL对工具箱中的其他DLL进行二次调用:libxml2.DLLlibxslt.DLL(以及其他)。 我的JVM在(jdk\u home)\jre\bin目录中找到它们。它们似乎与Java捆绑在一起,显然与YAZ工具包中的不同。 这意味着yaz4j.dll调用的过程在这些dll中找不到。这样会引发未满足的LinkException

    我的JVM似乎总是首先在(jdk\u home)\jre\bin中搜索本机库,而不考虑环境%path%变量或-Djava.library.path开关。 替换该目录中的dll可能会破坏一些JVM本机功能,因此我不建议这样做

    因此,需要完成的最后一步是找出如何使JVM加载正确的libxml2.dlllibxslt.dll


    重新编译yaz4.dll以使其指向重命名的libxml2.dlllibxslt.dll可能是一个潜在的解决方案。

    我也遇到了同样的问题,您需要JDK而不是JRE构建路径库

    漂亮的手工圆圈!!!检查运行配置?运行配置中应该包含什么?我在run config中写过这样的内容:-Djava.library.path=“C:\Program Files\YAZ\bin”没有帮助…我也遇到了这个问题,你能找到解决方法吗?@sendreams不幸的是,在尝试寻找解决方案一年后,问题仍然悬而未决。我找到了解决这个麻烦的方法。请参阅我答案中的链接。“远程调试”应该会有帮助。关于第二点,它都是32位的。不是那个问题。更重要的是第一点,关于路径。因为它是从控制台工作的,我将需要的路径写入路径。那么,如何对Eclipse执行同样的操作呢?或者如何检查使用eclipse的路径?如果从CMD.EXE启动eclipse,那么程序最终看到的路径应该与使用“设置路径”在CMD.EXE中看到的路径相同。不,从CMD.EXE启动没有帮助。。。在调试中,它像普通程序一样启动。我发现使用这个命令
    -Djava.library.path=“${env_var:path}
    eclipse可以看到所有需要的路径。所以我猜它的本机库无法在eclipse运行环境中进一步调用函数。
    java -cp "bin;C:\Program Files\YAZ\java\yaz4j.jar" ru.Test