我正在尝试执行一个 java 应用程序,该应用程序打包为 jar 存档。
java -cp .\lib\json.jar -jar ".\myarchive.jar"
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息,指出无法找到 json.jar 存档中的类。
Exception in thread "main" java.lang.NoClassDefFoundError: json/serializers/JsonTypeResolversInstance
Caused by: java.lang.ClassNotFoundException: json.serializers.JsonTypeResolversInstance
at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 2 more
Run Code Online (Sandbox Code Playgroud)
jar 文件包含该类,所以我认为这个错误不应该发生。使用我的 IDE 执行代码时,它运行时没有错误。
我尝试过很多方法来解决这个问题,但没有成功。
同时使用-cp和选项不起作用。-jar当您使用该-jar选项时,该-cp选项将被忽略。
在 Java 中运行 JAR 文件中的代码有两种方法。
第一种方法:使用选项并在命令行上-cp指定包含该方法的类的名称。main例如:
java -cp .\lib\json.jar;.\myarchive.jar com.mypackage.MyMainClass
Run Code Online (Sandbox Code Playgroud)
当您这样做时,您可以在命令行上指定类路径(使用-cp)。类路径必须包含所有 JAR 文件和/或目录,其中包含应用程序所需的所有类。您还必须指定要在命令行上运行的类的名称。
此外,当您这样做时,JAR 文件中可能存在的清单文件将被忽略。
第二种方式:使用-jar选项。例如:
java -jar .\myarchive.jar
Run Code Online (Sandbox Code Playgroud)
当你这样做时,Java 将查看JAR 文件中的清单文件。类路径和要运行的类的名称将从清单文件中获取,并且-cp命令行上的选项将被忽略。
详细信息请参见该java命令的文档。