从Eclipse错误中,从控制台运行是可以的

时间:2013-04-18 04:22:48

标签: java eclipse

我对Eclipse很熟悉。我写的是使用外部jar的简单测试类。它使用本机库.dll 当我从Eclipse运行时,命令运行。 这是我的堆栈跟踪:

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)

但是当我像这样从控制台运行这段代码时

java -cp "bin;C:\Program Files\YAZ\java\yaz4j.jar" ru.Test

一切都很完美! 这是相同的代码。 它在控制台中如何工作而在Eclipse中不起作用?

这里我如何将这个引用的jar插件插入Eclipse中的项目: enter image description here

4 个答案:

答案 0 :(得分:0)

本机方法无法链接时收到的消息非常糟糕。我可以想到可能会给出这个信息的几个根本原因:

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

答案 1 :(得分:0)

所以,出乎意料的是,我在这个问题中找到了对我的情况的某种答案java.io.Console support in Eclipse IDE

虽然不是真正的解决方案,但是进一步开展工作的方式

答案 2 :(得分:0)

我一直在努力解决完全相同的问题,现在试图在我的项目中使用YAZ工具包。问题是本机库可以在各种测试计算机上正确加载,但不能在我的个人PC上加载。

简而言之:问题的原因是JVM加载了错误的 libxml2.dll libxslt.dll 依赖库。< / p>

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

  1. (jdk_home_dir)\ JRE \ bin中。在加载依赖库(主yaz4j.dll除外)时,在所有其他测试计算机上以某种方式跳过。这样测试计算机就不会加载错误的dll。
  2. (jdk_home_dir)\ bin中
  3. 如果设置-Djava.library.path参数,它将在此步骤中查看该目录
  4. %SYSTEMROOT%\ SYSTEM32
  5. 的%SystemRoot%
  6. 为项目设置的工作目录(如果有)。这个步骤在我的个人电脑上跳过,原因不明,但适用于所有其他测试计算机。
  7. %path%
  8. 我已经通过使用Process Monitor来解决这个问题。请注意,步骤1和2可以互换。

    名为 yaz4j.dll 的YAZ工具包主DLL会对工具箱中的其他dll进行二次调用: libxml2.dll libxslt.dll (其中包括)。  我的JVM在(jdk_home)\ jre \ bin 目录中找到它们。它们似乎与Java捆绑在一起,它们明显不同于YAZ工具包中的那些。 这意味着在那些dll中找不到yaz4j.dll调用的过程。这样就抛出了UnsatisfiedLinkException。

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

    因此,需要完成的最后一步是弄清楚如何使JVM加载正确的 libxml2.dll libxslt.dll 库。

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

答案 3 :(得分:0)

我有同样的问题,你需要JDK而不是JRE构建路径库