在Unix系统中使用.sh文件运行.jar文件

6

我有一个在Windows 7上创建的DirectoryScanner.jar文件。 我想在Unix服务器上执行此jar文件。 我在putty中运行了以下命令,预期jar文件完全正常运行:

java -jar DirectoryScanner.jar

现在我想在Unix服务器上创建一个.sh文件,当执行该文件时可以运行这个jar包。我创建了一个Report.sh文件,在其中编写以下代码以执行此jar包:

java -cp /home/applvis/Java/UAT/lib/DirectoryScanner.jar com.acc.directory.scanner.SDScanner

但是当我在putty中执行此命令时,它显示以下错误:
[applvis@bg6lnxebs1 UAT]$ . ./ReportGen.sh
Exception in thread "Main Thread" java.lang.NoClassDefFoundError: com/acc/directory/scanner/SDScanner
Caused by: java.lang.ClassNotFoundException: com.acc.directory.scanner.SDScanner
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: com.acc.directory.scanner.SDScanner.  Program will exit.

有人能告诉我我到底做错了什么,或者建议一些替代命令吗?
我的jar和sh文件在不同的目录中。即使它们在同一个目录中,我也会得到这个错误。
附注:我有很多jar文件需要依次执行。因此,我想创建一个sh文件,其中包含运行所有jar文件的代码,这样就不用再次编写每个jar文件单独在Unix上运行的命令了。对于我来说,只需运行sh文件即可轻松完成。因此,我需要在sh文件中编写能够运行我的jar文件的代码。

5
为什么不在Unix上继续使用"java -jar DirectoryScanner.jar"? - CalibeR.50
3
为什么你在 shell 脚本中输入的命令与直接运行的命令不同?你确定 SDScanner 类在那个 jar 文件中,并且它有一个主方法吗? - RealSkeptic
1
我建议最可能的问题是JAR文件路径错误。Java -jar 版本会识别这个问题,而类路径可能不会。 - redge
第一个命令运行得非常好,因此 jar 文件不可能有任何问题。我正在尝试一些新的东西,所以我想将命令写在一个单独的 sh 文件中。 - Harshita Sethi
我在sh文件中输入了相同的命令,但仍然出现了相同的错误。 - Harshita Sethi
请确保您在类名(SDScanner)或包名(com.acc.directory.scanner)中没有打错字。此外,您可以尝试使用通配符 java -cp /home/applvis/Java/UAT/lib/* com.acc.directory.scanner.SDScanner。 - Andrey Sabitov
3个回答

13

在您的Shell脚本中切换到包含jar文件的目录。可能不是最佳实践,但我经常使用它来模拟从脚本启动的“工作目录”。这样,我的Shell脚本可以安装在“scripts”目录中,而我的Java可以安装在“lib”目录中。

假设您执行脚本时的环境与从命令行调用Java时的环境相同。

#!/bin/sh

cd /home/applvis/Java/UAT/lib
java -jar DirectoryScanner.jar

你好,是的,这个方法可行,但它的主要目的是什么呢?我的意思是为什么访问目录然后启动jar文件?使用"java -jar /home/..../file.jar"命令无法工作。 - Rached Khalledi

0

如果您希望关闭终端而不终止.jar进程/程序,您可以使用以下方法:

 #!/bin/bash

__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

nohup java -jar ${__dir}/yourappname.jar > /dev/null &

exit $?

这行代码将bash文件的当前路径分配给__dir变量。

__dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

所以你可以启动在同一文件夹中的jar文件。

这里

nohup java -jar ${__dir}/yourappname.jar > /dev/null &

在 nohup 和 >dev/null & 之间编写 jar 执行代码。

不要忘记 &。这将允许您关闭终端窗口而不会杀死进程。

如果您想自动关闭终端窗口,可以使用 exit $?

如果进程成功,则 $? 执行退出协议。


-1

根据您用于生成JAR的工具,它可能已经用其他东西替换了您的主类,例如设置类路径然后调用您的类。当使用所有依赖项生成fat JAR时,这种情况经常发生。请检查JAR的内容,因为它可能包含其他JAR。


当我在Unix上运行命令java -jar DirectoryScanner.jar时,它会给我正确的输出。所以我认为这个jar文件没问题,唯一需要做的就是编写一个sh文件的命令,以便可以在任何位置运行该jar文件。 - Harshita Sethi
从您的JAR文件中提取MANIFEST.MF(JAR在结构上是一个ZIP文件),并查看指定的主类是什么。它是您自己的吗?此外,请检查内容,您的类文件是否在其中? - Tassos Bassoukos
嗯,这个jar包完全没问题。 - Harshita Sethi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接