使用-jar开关执行jar文件时,为什么java不尊重类路径?

时间:2015-06-11 11:04:12

标签: java jar classpath rxtx

这有效:

$ 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上的错误。

3 个答案:

答案 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