Java 使用本机依赖项和.JAR依赖项从终端(Runtime.getRuntime().exec)运行JAR文件
我在从终端运行JAR文件时遇到问题,该终端同时具有本机依赖项和.JAR依赖项。好的,我的目标不是从终端运行它,而是使用Java的Runtime.getRuntime().exec函数作为一个单独的进程运行它,但是如果我不能从终端运行它,那么我也不能通过。我试图运行的JAR文件依赖于许多其他JAR文件以及许多.so库。我试图将所有.jar依赖项和.so依赖项放在它们自己的文件夹中,然后使用以下内容运行jar文件:Java 使用本机依赖项和.JAR依赖项从终端(Runtime.getRuntime().exec)运行JAR文件,java,linux,jar,path,classpath,Java,Linux,Jar,Path,Classpath,我在从终端运行JAR文件时遇到问题,该终端同时具有本机依赖项和.JAR依赖项。好的,我的目标不是从终端运行它,而是使用Java的Runtime.getRuntime().exec函数作为一个单独的进程运行它,但是如果我不能从终端运行它,那么我也不能通过。我试图运行的JAR文件依赖于许多其他JAR文件以及许多.so库。我试图将所有.jar依赖项和.so依赖项放在它们自己的文件夹中,然后使用以下内容运行jar文件: java -cp /home/johnmichaelreed/Desktop/Dro
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/johnmichaelreed/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/johnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64/*'主“arg”您不能同时使用
-jar
和-cp
您可以做的是将jar添加到类路径,然后指定要运行的主类。您还可以在jar清单中指定jar依赖项
请查看更多详细信息
假设您的主类被调用在
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
我要说的是,命令的shell扩展(解析*)使整行不正确,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/johnmichaelreed/Desktop/Dropbox/Libjitsi_linux_64/*'main.main”指定我希望本机Linux 64文件夹保存.so文件,我希望运行应用程序的jar和Libjitsi_Linux_64 libraries文件夹中的所有内容,并且包含main方法的类的名称称为“main”。此外,*通配符不是递归的,对吗?比如,如果我在libraries文件夹和libraries文件夹的子文件夹中有相同的.jar文件,它将不会加载该jar文件两次。好的,你比我的编辑速度快,不客气:)哦,等等。它正在运行,但没有加载本机库。如何处理本机库和命令行参数?嗯,您是否尝试过改变参数?那么首先是
-Djava.library.path
?