【问题标题】:Running JAR file from terminal (Runtime.getRuntime().exec) with both native and .jar dependencies从终端运行 JAR 文件 (Runtime.getRuntime().exec),同时具有本机和 .jar 依赖项
【发布时间】:2015-07-30 04:56:49
【问题描述】:

我在从终端运行具有本机和 .jar 依赖项的 JAR 文件时遇到问题。好的,我的目标不是从终端运行它,而是使用 Java 的 Runtime.getRuntime().exec 函数将它作为一个单独的进程运行,但如果我不能从终端运行它,那么我也可以通过运行它。我尝试运行的 JAR 文件取决于许多其他 jar 文件以及许多 .so 库。我正在尝试将所有 .jar 依赖项和 .so 依赖项放在它们自己的文件夹中,然后使用以下命令运行 jar 文件:

java -cp /home/johnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64/* -Djava.library.path=/home/johnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64/lib/native/linux-64/* -jar /home/johnmichaelreed/NetBeansProjects/SendReceive/dist/SendReceive.jar

其中“/home/johnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64/”包含所有 JAR 文件,“/home/johnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64/lib/native/linux-64/”包含所有 .so 文件并且要运行的主要 JAR 文件是“/home/johnmichaelreed/NetBeansProjects/SendReceive/dist/SendReceive.jar”,但我不断收到此错误:

Error: Could not find or load main class 
.home.johnmichaelreed.Desktop.Dropbox.Libjitsi_linux_64.some-compressed-jar-file.jar

其中 some-compressed-jar-file.jar 是我的应用程序应该使用的 .jar 文件之一。

这是我的 Java JAR 依赖项文件夹:

这是我的原生库依赖文件夹:

更新:

好的,这就是解决方案:

java -Djava.library.path=/home/johnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64/lib/native/linux-64 -cp '/home/johnmichaelreed/NetBeansProjects/SendReceive/dist/SendReceive.jar:/home/ j‌​ohnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64/*' Main

尝试命令行参数:

java -Djava.library.path=/home/johnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64/lib/native/linux-64 -cp '/home/johnmichaelreed/NetBeansProjects/SendReceive/dist/SendReceive.jar:/home/ j‌​ohnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64/*' Main "arg"

【问题讨论】:

  • 我会说您的命令的外壳扩展(解析 *)使整行不正确,并且 java 将您的 jar 文件之一作为类名。我不确定您是否可以在您的情况下使用 *,但请尝试将参数括在引号中。

标签: java linux jar path classpath


【解决方案1】:

您不能同时使用-jar-cp

您可以做的是将您的 jar 添加到类路径中,然后指定要运行的 Main 类。您还可以在 jar 的清单中指定 jar 依赖项。

请查看here了解更多详情。


假设您的 Main 类在 Main 和包 foo.bar 中,那么可能的调用可能如下所示:

java -cp "/home/johnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64/*;/home/johnmichaelreed/NetBeansProjects/SendReceive/dist/SendReceive.jar" -Djava.library.path="/home/johnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64/lib/native/linux-64/*" foo.bar.Main

【讨论】:

  • 哦。所以我应该做类似“ java -Djava.library.path=/home/johnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64/lib/native/linux-64/* -cp '/home/johnmichaelreed/NetBeansProjects/SendReceive/dist/SendReceive .jar:/home/johnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64/*' main.Main" 指定我希望本机 Linux 64 文件夹保存 .so 文件,我想运行我的应用程序的 jar 和 Libjitsi_linux_64 库中的所有内容文件夹,并且包含 main 方法的类的名称称为“Main”。
  • 另外,* 通配符不是递归的,对吧?就像我在库文件夹和库文件夹的子文件夹中有相同的 .jar 文件一样,它不会加载该 jar 文件两次。
  • 好的,你比我的编辑速度更快,不客气 :)
  • 哦等等。它正在运行,但没有加载本机库。你如何使用本机库和命令行参数来做到这一点?
  • 嗯,你有没有试图扭转争论?那么首先-Djava.library.path?
猜你喜欢
  • 2023-04-07
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
相关资源
最近更新 更多