运行 一个 .jar 文件在 unix 中使用 .sh 文件
Run a .jar file using .sh file in unix
我在 windows 7 中创建了一个 jar 文件 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.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 文件都在不同的目录中。即使它们在同一目录中,我也会收到此错误。
Ps。我有许多 jar 文件要一个接一个地执行。因此,与其一次又一次地在 unix 上分别将命令写入 运行 每个 jar,我想创建一个 sh 文件,其中将包含一个接一个 运行 所有 jar 的代码。而且我只 运行 sh 文件会更容易。因此,我需要将代码写入 sh 文件中,该文件可以 运行 我的罐子。
根据您用于生成 JAR 的工具,它可能已将您的主要 class 替换为其他 f.e。设置 class 路径,然后调用您的 class。在生成具有所有依赖项的胖 JAR 时,这种情况经常发生。请务必检查 JAR 的内容,因为它可能依次包含其他 JAR。
在您的 shell 脚本中切换到包含 jar 文件的目录。可能不是最佳实践,但我一直使用它来模拟脚本启动的 'working directory'。这样我的 shell 脚本可以安装在 scripts
目录中,我的 Java 可以安装在 lib
目录中。
假设您执行脚本时的环境与从命令行调用 java 时的环境相同。
#!/bin/sh
cd /home/applvis/Java/UAT/lib
java -jar DirectoryScanner.jar
我在 windows 7 中创建了一个 jar 文件 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.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 文件都在不同的目录中。即使它们在同一目录中,我也会收到此错误。
Ps。我有许多 jar 文件要一个接一个地执行。因此,与其一次又一次地在 unix 上分别将命令写入 运行 每个 jar,我想创建一个 sh 文件,其中将包含一个接一个 运行 所有 jar 的代码。而且我只 运行 sh 文件会更容易。因此,我需要将代码写入 sh 文件中,该文件可以 运行 我的罐子。
根据您用于生成 JAR 的工具,它可能已将您的主要 class 替换为其他 f.e。设置 class 路径,然后调用您的 class。在生成具有所有依赖项的胖 JAR 时,这种情况经常发生。请务必检查 JAR 的内容,因为它可能依次包含其他 JAR。
在您的 shell 脚本中切换到包含 jar 文件的目录。可能不是最佳实践,但我一直使用它来模拟脚本启动的 'working directory'。这样我的 shell 脚本可以安装在 scripts
目录中,我的 Java 可以安装在 lib
目录中。
假设您执行脚本时的环境与从命令行调用 java 时的环境相同。
#!/bin/sh
cd /home/applvis/Java/UAT/lib
java -jar DirectoryScanner.jar