【问题标题】:Cant run Shell Script to launch Jar无法运行 Shell 脚本来启动 Jar
【发布时间】:2014-03-14 06:07:08
【问题描述】:

我有一个 Windows 批处理脚本,它启动一个 jar,该 jar 启动一个完全用 Java 编写的游戏(它是一个 runescape 客户端)。它应该可以工作。

原始批次(WIN):

@echo off
@echo Client Is loading......
@echo -----------------------
java -Xmx1000m -cp .;Theme.jar Gui 0 0 highmem members 32
pause

我为操作系统制作的 Shell 文件:

#!/bin/sh
echo Your client is loading...
echo --------------------
java -Xmx1000m -cp Theme.jar Gui 0 0 highmem members 32

终端错误:

Your Client is loading...
--------------------
Exception in thread "main" java.lang.NoClassDefFoundError: Gui
Caused by: java.lang.ClassNotFoundException: Gui
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

我该如何修复它或制作一个与批处理完全相同并实际运行的 shell 脚本?

【问题讨论】:

  • 为什么将当前文件夹包含在批处理中的类路径中,而不包含在 shell 脚本中?我在批处理中说-cp .;Theme.jar,但在shell文件中说-cp Theme.jar
  • 好吧,如果我这样做,我会收到此错误pastie.org/8918011(发布时间太长)

标签: java shell batch-file


【解决方案1】:

您没有正确转换 shell 脚本。在Windows版本中-cp参数是.;Theme.jar,所以在Linux中应该是.:Theme.jar,路径分隔符;替换为:,像这样:

java -Xmx1000m -cp .:Theme.jar Gui 0 0 highmem members 32

ClassNotFoundException 通常表示类路径有问题。 (-cp 参数是-classpath 的快捷方式)。

从 Windows 脚本来看,Gui 是一个类名,其余的是传递给Gui 类的命令行参数。错误消息告诉您它找不到Gui 类。它必须在当前目录或theme.jar 中。如果它不在其中任何一个中,那么这是行不通的。

【讨论】:

  • @Nicco 在您运行它的目录中有Gui.class 文件吗?或者,如果你这样做jar tf Theme.jar | grep Gui.class,你会得到什么?
  • 不是 Gui 0 0 highmem 成员 32 只是变量吗?我没有编写原始批处理,我只知道它适用于 Windows .. 我应该如何包含您的解决方案?
  • @Nicco 从 Windows 脚本来看, Gui 是一个类名,其余的是传递给Gui 类的命令行参数。错误消息告诉您它找不到Gui 类。它必须在当前目录或theme.jar 中。如果它不在其中任何一个中,那么这是行不通的。你没有在我之前的评论中回答我的问题。
  • 由于复制限制,我得到了这个 btw paste.org/8918043 它只有一半
  • @Nicco 这不是我问的结果。我再说一遍:在您运行它的目录中是否有Gui.class 文件?或者如果你这样做jar tf Theme.jar | grep Gui.class 你会得到什么?
【解决方案2】:

java.lang.ClassNotFoundException

我认为可能有两个原因:

  1. 您在运行 java 程序时包含的 jar 文件不包含在您为 shell 脚本创建的 jar 文件中。

  2. 您在创建 jar 文件时尚未在 manifest.mf 文件中定义 Main-Class。

【讨论】:

    【解决方案3】:

    试试这个,

    java -Xmx1000m -cp .: Theme.jar Gui 0 0 highmem members 32
    

    as ':' 是 Unix 环境的类路径分隔符,而 ';'适用于 Windows。

    【讨论】:

    • 尝试在 .: 和 Theme.jar 之间不留空格,我的意思是尝试使用 .:Theme.jar
    • @Nicco 可能是因为: 之后的意外空格字符。确保.:Theme.jar 中没有空格。
    • 是的,我确实删除了 :( 仍然没有工作和原始错误。这很奇怪
    • 在 Windows 上执行此操作java -verbose -Xmx1000m -cp Theme.jar Gui 0 0 highmem members 32 这将打印所有正在加载的类和 src 类(如果文件不在 jar 中)或 jar 文件名。也许您还没有将某些东西从 Windows 复制到 linux/iOs。还可以在 linux 的目录上运行 chmod 777 *,以便所有用户都可以加载所有文件。
    • 试试这个,java -Xmx1000m -cp Theme.jar:./ Gui 0 0 highmem members 32
    猜你喜欢
    • 2016-05-23
    • 2014-03-12
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2013-08-06
    • 2019-08-16
    相关资源
    最近更新 更多