这有效:
$ java -cp ".:/PATH/TO/RXTXcomm.jar:./jobexftp.jar" -Djava.library.path=/usr/lib/jni com.lhf.jobexftp.StandAloneApp
JObexFTP 2.0 beta (15/10/2010)
Java Obex File Transfer Protocol application and library
Developed under/using 100% free software.
For more information access: http://www.lhf.ind.br/jobexftp/
Usage: jobexftp <serialPort> [<commands>] [<options>]
...
这不是:
$ java -cp ".:/PATH/TO/RXTXcomm.jar" -Djava.library.path=/usr/lib/jni -jar jobexftp.jar
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: gnu/io/NoSuchPortException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
我在jar中找到了要在META-INF / MANIFEST.MF文件中执行的类名(第一个例子):
Main-Class: com.lhf.jobexftp.StandAloneApp
为什么使用-jar开关执行jar文件似乎会导致Java忽略类路径并且无法在RXTXcomm.jar中找到gnu/io/NoSuchPortException
类?
在运行Java 1.6的旧机器上,我可以执行jar文件而无需类路径。这是如何工作的?
$ env | grep CLASS
$ env | grep JAVA
$ java -jar jobexftp.jar
JObexFTP 2.0 beta (15/10/2010)
Java Obex File Transfer Protocol application and library
Developed under/using 100% free software.
For more information access: http://www.lhf.ind.br/jobexftp/
Usage: jobexftp <serialPort> [<commands>] [<options>]
...
它在旧机器上工作的原因是它在/usr/lib/jvm/java-6-sun-1.6.0.21/jre/lib/ext /中有一份RXTXcomm.jar。
$ ls -lA /usr/lib/jvm/java-6-sun-1.6.0.21/jre/lib/ext/RXTXcomm.jar
-rwxr-xr-x 1 root root 137764 2011-02-17 16:58 /usr/lib/jvm/java-6-sun-1.6.0.21/jre/lib/ext/RXTXcomm.jar
在/ usr / lib / jvm / java-8-oracle / jre中创建一个新的ext
目录并将RXTXcomm.jar
复制到其中不会摆脱Java 1.8上的错误。
答案 0 :(得分:7)
-jar
开关用于将jar作为自包含程序启动。如java
手册页中所述:
使用
-jar
选项时,指定的JAR文件是所有用户类的源,并忽略其他类路径设置。
要提供类路径,请使用清单文件中的Class-Path
条目。
进一步阅读:The Java™ Tutorials: Adding Classes to the JAR File's Classpath
答案 1 :(得分:1)
您可以修改META-INF/MANIFEST.MF
文件并添加Class-Path
条目。
在Maven构建系统中,您可以按以下方式进行配置
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3</version>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addClasspath>true</addClasspath>
<mainClass>your.main.Class</mainClass>
</manifest>
<manifestEntries>
<Class-Path>./config/</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
从man java
中我们可以确认此问题When you use this option, the JAR file is the source of all user classes, and other user class path settings are ignored.
答案 2 :(得分:-1)
您还需要将.so / .dll复制到jni文件夹。 Ubuntu RXTX以前没有用过。 查看this