以下错误信息是什么意思?

4

我正在运行我的Java程序,但在执行时出现以下错误。 之前它一直很好地运行,但现在它会抛出以下错误。 我检查了我的类路径,环境变量中的路径都是正确的。

Exception in thread "main" java.lang.UnsatisfiedLinkError: java.util.zip.ZipFile
.open(Ljava/lang/String;IJ)J
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(ZipFile.java:114)
        at java.util.jar.JarFile.<init>(JarFile.java:135)
        at java.util.jar.JarFile.<init>(JarFile.java:72)
        at sun.misc.URLClassPath$JarLoader.getJarFile(URLClassPath.java:646)
        at sun.misc.URLClassPath$JarLoader.access$600(URLClassPath.java:540)
        at sun.misc.URLClassPath$JarLoader$1.run(URLClassPath.java:607)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.misc.URLClassPath$JarLoader.ensureOpen(URLClassPath.java:599)
        at sun.misc.URLClassPath$JarLoader.<init>(URLClassPath.java:583)
        at sun.misc.URLClassPath$3.run(URLClassPath.java:333)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.misc.URLClassPath.getLoader(URLClassPath.java:322)
        at sun.misc.URLClassPath.getLoader(URLClassPath.java:299)
        at sun.misc.URLClassPath.getResource(URLClassPath.java:168)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: com.sun.tools.javac.Main.  Program will exit.

1
你是如何尝试运行你的Java程序的?它似乎在寻找tools.jar。 - randominstanceOfLivingThing
快速搜索得到了这个链接:https://www.ibm.com/developerworks/mydeveloperworks/blogs/738b7897-cd38-4f24-9f05-48dd69116837/entry/debugging_java_lang_unsatisfiedlinkerror9?lang=en - Henrik Andersson
1
这是一个需要在JDK下运行的程序,而你只使用了JRE来运行它吗? - beny23
顺便问一下,你在运行程序时为什么要引用javac?你是想在运行时编译一个类吗? - randominstanceOfLivingThing
@beny23,我认为你应该把你的评论发布为答案,因为我相信这是问题的原因。我在我的JDK(tools.jar)中找到了com.sun.tools.javac,而不是在我的JRE中找到。 - HeatfanJohn
@suresh:在我的jdk lib中存在tools.jar。 - yatinbc
4个回答

2
为了补充@Peter Lawrey的回答...
堆栈跟踪的起始位置如下:
Exception in thread "main" java.lang.UnsatisfiedLinkError: java.util.zip.ZipFile
.open(Ljava/lang/String;IJ)J
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(ZipFile.java:114)
        ...

当你尝试调用一个未被解析到相应本地库中的方法时,会抛出 UnsatisfiedLinkError。后面的消息告诉我们该错误发生在具有以下特征的方法:
long java.util.zip.ZipFile.open(String, int, long)

这与堆栈跟踪的顶部框架相匹配...以及Java的ZipFile代码已知使用本机库来完成重活。

它能够到达这一步意味着JVM已经找到并加载了本机库。但是显然,加载没有解决这个native打开方法的重载。这只可能意味着一件事:引导类路径上的ZipFile类版本与本机库不匹配。

我们不能得出任何关于这是JDK还是JRE的明确结论,但很可能是JDK...除非OP正在奇怪的方式下调用Java编译器。(“找不到主类:com.sun.tools.javac.Main”消息可能意味着JVM无法加载类...因为UnsatisfiedLinkError破坏。)

无论如何,JDK与JRE并不是直接的问题。真正的问题是JVM引导类路径上的“rt.jar”与本机库之间的不匹配。


问题是:

那么该如何解决?

这取决于您出现此错误时所做的确切操作。

  • 您运行了什么命令?
  • 有哪些命令行选项和参数?
  • 您是否“乱弄”了JRE / JDK安装?
  • 您是否尝试在另一个安装中使用“rt.jar”文件?

非常详细,谢谢!有一个问题,您是如何将 java.util.zip.ZipFile.open(Ljava/lang/String;IJ)J 翻译成 long java.util.zip.ZipFile.open(String, int, long) 的?这里的 I 是不是代表 intJ 是不是代表 long?顺便说一下,我在网上找到了一些 ZipFile 的源代码,看到了 open 方法的声明,与您提到的签名相匹配:private static native long open(String name, int mode, long lastModified); - HeatfanJohn
@HeatfanJohn - http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getName() - Stephen C

1

这意味着您的rt.jar与您的JVM使用的Java版本不同。

我建议您确保在引导类路径中没有rt.jar,并且您的JRE已正确安装。

找不到主类:com.sun.tools.javac.Main。程序将退出。

当某个类由于某些低级错误而无法加载时,它会报告找不到该类。


我认为问题的原因是在本地代码中使用了ZipFile。你是说你认为javac是错误的原因吗?如果是这样,你能说一下为什么吗? - Peter Lawrey
+1 嗯...说得好!你的意思是,一个有效的 java.util.zip.ZipFile.open(我已经验证在(rt.jar)中)不应该尝试调用不在 rt.jar 中的 com.sun.tools.javac.main。我关注了错误的直接原因,而不是真正的问题,即运行时的 java.util.zip.ZipFile.open 不应该调用 JDK 组件。现在我很高兴我没有对这个答案进行 -1! - HeatfanJohn
我正在说本地代码中的java.util.zip.ZipFile.open(Native Method)尝试调用java.util.zip.ZipFile.open(Ljava/lang/String;IJ)J,如果JVM和rt.jar相同,该方法将存在。 - Peter Lawrey
“Native Method” 在 Java 中是指机器相关的平台代码,例如在 Windows 上的 DLL 或 Linux 上 ELF(可执行和链接格式)的“.so”共享对象规范吗? - HeatfanJohn
是的,如果它要回调到Java中,则使用类似反射的东西,如果方法不存在,则可能会失败。 - Peter Lawrey

0

你的 JRE 路径指向了 JDK 的路径

解决方案:

第一步:右键单击服务器

第二步:点击运行时配置

第三步:在 JDK 下提供 JRE 路径。

解决方案已修复


0
错误信息中提到找不到com.sun.tools.javac.Main的参考文献,使我相信这是一个需要使用JDK而不仅仅是JRE运行的程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接