Java为什么找不到CLASSPATH中的类?

问题描述 投票:0回答:2

我正在尝试安装Mooshak,它以.jar安装程序的形式分发。当我运行文件时,它给我关于缺少的类的以下错误:

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 does似乎在路径中,为什么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 apache-commons
2个回答
1
投票

此答案基于您提供的新信息。它改变了事情。

首先,我对CLASSPATH-jar的说法仍然正确。

但是,事实证明Mooshak 2安装程序是使用“罐中的罐”加载程序的可执行JAR。

  • 主要类别是org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
  • 清单文件指定安装程序的类路径应包括这些嵌套的JAR,它们是安装程序JAR的一部分:

     junit.jar 
     org.hamcrest.core_1.3.0.v201303031735.jar 
     commons-compress-1.12.jar 
     BrowserLauncher2-all-1_3.jar
    
  • JarRsrcLoader入口点类应为上述JAR设置类加载器,然后启动安装程序。

而且应该都可以正常工作。

不过,我确实看到了一件奇怪的事情。清单包含commons-compress-1.12.jar,但您似乎正在尝试使用commons-compress-1.18.jar

您说:

因此,这似乎意味着commons-compress-1.12.jar文件应与安装程序放置在同一目录中。

我没有那样看,但是我会看看是否可以找到文档。

UPDATE:不。我找不到文档,但是从JarRsrcLoader源代码看来,它不是那样工作的。

但是我确实找到了一个线索。在当前版本的JarRsrcLoader中,有单独的Java 8和Java 9+代码。因此,如果Mooshak 2.0安装程序使用较旧的JarRsrcLoader版本,并且您尝试使用Java 9或更高版本进行安装,则可能无法使用。

因此,请确保您使用Java 8 ...就像需求所述。


但是,您显然要在此处尝试使用的是其他版本的compress库。更好的方法是为Mooshak设置自己的构建树:

...用svn checkout https://svn.dcc.fc.up.pt/projects/Mooshak/Mooshak/签出完整的源代码>

然后按照我认为在树中的说明修改依赖关系并构建/安装。


3
投票

为什么Java找不到CLASSPATH中的类?

© www.soinside.com 2019 - 2024. All rights reserved.