【问题标题】:Run a .jar file using .sh file in unix在 unix 中使用 .sh 文件运行 .jar 文件
【发布时间】:2015-07-03 01:42:04
【问题描述】:

我在 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$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 文件要一个接一个地执行。因此,与其一次又一次地编写命令在 unix 上单独运行每个 jar,我想创建一个 sh 文件,该文件将包含一个接一个地运行所有 jar 的代码。我只运行 sh 文件会更容易。因此,我需要将代码写入可以运行我的 jar 的 sh 文件中。

【问题讨论】:

  • 为什么不在 unix 上坚持使用 java -jar DirectoryScanner.jar?
  • 为什么你在shell脚本中输入的命令和你直接运行的命令不一样?你确定 SDScanner 类在那个 jar 中并且它有一个 main 方法吗?
  • 我建议最可能的问题是 jar 文件的路径错误。 Java -jar 版本会识别这一点,而类路径可能不会。
  • 第一个命令运行得非常好,所以 jar 不会有任何问题。我正在尝试一些新的东西,所以我想在单独的 sh 文件中编写命令。
  • 我在 sh 文件中给出了相同的命令,但它仍然给了我 smae 错误

标签: java bash shell unix jar


【解决方案1】:

在您的 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 不起作用
【解决方案2】:

根据您用于生成 JAR 的工具,它可能已将您的主类替换为 f.e.设置类路径,然后调用您的类。在生成包含所有依赖项的胖 JAR 时,这种情况经常发生。请检查 JAR 的内容,因为它可能依次包含其他 JAR。

【讨论】:

  • 当我在 unix 上运行命令 java -jar DirectoryScanner.jar 时,它给了我正确的输出。所以我认为 jar 很好,唯一的问题是我需要在 sh 文件中编写一个命令,以便它可以在任何存在的地方运行该 jar。
  • 从您的 JAR 中提取 MANIFEST.MF(JAR 在结构上是一个 ZIP 文件)并查看其中指定了哪些主类。是你自己的吗?另外,检查内容,你的类文件在里面吗?
  • 你这个罐子很好。
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 2020-01-24
  • 2016-08-08
  • 1970-01-01
  • 2021-07-17
  • 2012-03-07
  • 2017-11-06
  • 1970-01-01
相关资源
最近更新 更多