java - 为什么 Java 找不到 CLASSPATH 中的类?
问题描述
我正在尝试安装作为 .jar 安装程序分发的 Mooshak。当我运行该文件时,它给了我以下关于缺少类的错误:
ifinlay@mooshak:~$ sudo java -jar MooshakInstaller.jar -cui
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/compress/archivers/ArchiveException
at pt.up.fc.dcc.mooshak.installer.Installer.<init>(Installer.java:26)
at pt.up.fc.dcc.mooshak.installer.Installer.main(Installer.java:52)
... 5 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.compress.archivers.ArchiveException
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:436)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 7 more
所以它找不到 org/apache/commons/compress/archivers/ArchiveException 类。但是我已经安装了这个库,并且在我的 CLASSPATH 中有以下内容:
ifinlay@mooshak:~$ echo $CLASSPATH
.:/usr/share/maven-repo/org/apache/commons/commons-compress/1.18/commons-compress-1.18.jar
CLASSPATH 中的这个 .jar 文件似乎确实包含有问题的类:
ifinlay@mooshak:~$ jar tvf /usr/share/maven-repo/org/apache/commons/commons-compress/1.18/commons-compress-1.18.jar
# ... other classes edited out
722 Fri Mar 01 16:57:28 UTC 2019 org/apache/commons/compress/archivers/ArchiveException.class
# ... other classes edit out
那么,为什么当它似乎在路径中时,Java 却找不到这个类呢?任何帮助都会太棒了,我真的为此挠头。
谢谢阅读!
编辑: .jar 的清单文件如下所示:
Manifest-Version: 1.0
Rsrc-Class-Path: ./ junit.jar org.hamcrest.core_1.3.0.v201303031735.ja
r commons-compress-1.12.jar BrowserLauncher2-all-1_3.jar
Class-Path: .
Rsrc-Main-Class: pt.up.fc.dcc.mooshak.installer.Installer
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
所以这似乎意味着 commons-compress-1.12.jar 文件应该放在与安装程序相同的目录中。虽然这似乎不起作用......
解决方案
为什么 Java 找不到 CLASSPATH 中的类?
简短的回答:因为它们不在实际的类路径上。
长答案:
安装程序有问题,或者您没有正确运行它/因为它被设计为运行。
当您java
使用选项运行这样的命令时-jar
:
java -jar MooshakInstaller.jar -cui
它将忽略CLASSPATH
变量以及您添加的任何-cp
参数。这就解释了为什么 Java 没有commons-compress-1.18.jar
在您的(假定的)类路径上的 JAR 文件中找到类。
这意味着以下之一:
MooshakInstaller.jar
安装程序缺少依赖项;即它坏了。(我怀疑是这种情况。他们会发现这一点。)MooshakInstaller.jar
安装程序并非设计为作为可执行 JAR 运行。安装程序期望在
MooshakInstaller.jar
相对于 JAR 文件位置的某个位置找到依赖项。(查看 JAR 清单文件中是否有“类路径”属性。)
我还要注意,当您运行此命令时:
sudo java -jar MooshakInstaller.jar -cui
环境变量的值CLASSPATH
可能不会传递给根进程。检查手动输入sudo
。这不是这里的实际问题......因为该CLASSPATH
变量无论如何都会被忽略,因为该-jar
选项。
更新
看起来您根本没有按照安装说明进行操作:
要安装 Mooshak,您必须执行以下命令。确保您的系统满足所有要求。请注意,您必须具有root权限
% tar xzf mooshak-version.tgz % cd mooshak-version % su # ./install
那不是你所做的,我强烈怀疑你实际所做的并不等同于上述情况。
(我不打算进一步调查,因为下载过程需要我向他们提供各种个人详细信息。何塞不可能!)
推荐阅读
- c# - 如何从 C# 中的特定目录启动 exe?
- visual-studio-code - 是否有可能阻止 VS-Code 关闭文件?
- javascript - 在 Web 应用程序中最小化和打包多个 JavaScript 文件的最佳方法?
- firebase - Flutter如何对集合中的文档进行排序,其中包含每个文档的编号字段
- html - 具有自适应 img 高度的等高项的 Flex 列
- web-services - 与 Azure 支持一起使用时,Xamarin 主从模板是否损坏?
- flutter - 在 Flutter 中通过主题设置按钮的颜色
- python - 弧形/弯曲文本图像的最佳方法是什么?
- javascript - 如何隐藏复选框的“框”并只保留单词标签
- python - 如何在 Django 中使用 sympy 构建包含 python 表达式的文本区域的 LaTeX 实时预览?