4

我有一个 jar 文件,但清单中没有指定它的主类。所以我按照这里给出的答案:

如何从 Jar 运行一个不在其 Manifest 文件中的 Main-Class 的类

它似乎试图从这个类中运行 main 。但是,由于某种原因,从这个 jar 文件中导入其他一些类似乎被破坏了。

这是我的问题的最小化版本:

jar tf test.jar

给出:

META-INF/
META-INF/MANIFEST.MF
ClassIWantToRun.class
something/
something/something/
something/something/something/ClassA.class

用 jd-gui 查看的 ClassIWantToRun.class 的来源似乎是:

import something.something.something.ClassA;

public class ClassIWantToRun
{
    public static void main(String[] args)
    {
        int x = ClassA.comeMethod();
    }
}

运行这个:

java -cp test.jar ClassIWantToRun

给我一个例外:

Exception in thread "main" java.lang.NoClassDefFoundError: com/ibm/OS4690/FlexosException
    at ClassIWantToRun.main(ClassIWantToRun.java:7)
Caused by: java.lang.ClassNotFoundException: com.ibm.OS4690.FlexosException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    ... 1 more

我只知道 Java 的基础知识,但似乎即使使用以下行也找不到 ClassA: import something.something.something.ClassA 我怎样才能让它运行?

4

3 回答 3

6

该异常表明您需要将一些其他 JAR 添加到类路径中。test.jar 中的类依赖于其他类。例如在 com.ibm.OS4690.FlexosException 上。

您可以尝试搜索另一个 JAR 文件(在您获取 test.jar 的同一位置),以便它包含 FlexosException.class 文件。找到它后,将 test.jar 运行为

java -cp test.jar;<path_to_another_jar_here> ClassIWantToRun
于 2013-01-18T13:50:02.963 回答
2

您将无法在 OS4690 环境之外运行您的程序,因为您依赖于内部 OS4690 库。如果您可以访问 OS4690 安装,您可能会找到所需的 jar,但最后这些 jar 使用平台相关库。如果您不是为该特定平台开发,请尽量避免使用这些依赖项。

于 2013-11-01T14:00:53.713 回答
0
java -cp test.jar ClassIWantToRun

正在导入包含您要运行的类的 JAR。您还应该在类路径中导入包含 ClassA 的 JAR。

在你的情况下,我猜它是包含com/ibm/OS4690/FlexosException需要在你的类路径上的 JAR

于 2013-01-18T13:50:16.490 回答