【问题标题】:Cannot find class even when jar file is in working directory即使 jar 文件在工作目录中也找不到类
【发布时间】:2011-11-20 03:32:14
【问题描述】:

我正在努力让我的 Java 程序在 AIX 上运行。我在 Windows 上使用 Eclipse 创建了一个可运行的 Jar 文件,下面是jRams.jar。我不断收到未找到类的错误,直到最后我将所有外部库放在同一目录中。

$ ls
JAXB2_20081030.jar
JAXB2_20110601.jar
activation.jar
asjava.jar
commons-beanutils-1.8.3.jar
commons-beanutils-bean-collections-1.8.3.jar
commons-beanutils-core-1.8.3.jar
commons-codec-1.5.jar
commons-collections-3.2.1.jar
commons-configuration-1.6.jar
commons-digester-2.1.jar
commons-jxpath-1.3.jar
commons-lang-2.6.jar
commons-logging-1.1.1.jar
commons-logging-adapters-1.1.1.jar
commons-logging-api-1.1.1.jar
jRams.jar
jaxb-api.jar
jaxb-impl.jar
jaxb-xjc.jar
jaxb1-impl.jar
jremote.jar
jsr173_1.0_api.jar
log4j-1.2.16.jar
netty-3.2.4.Final.jar
$

仍然,我得到了找不到类的错误。

$ java -jar jRams.jar
The java class is not found:  com.jbase.jremote.JRemoteException

jremote.jar 肯定包含 JRemoteException。为什么这不起作用?

更新

感谢您直截了当的回答。我现在对 Java 应用程序和清单文件的性质有了更深入的了解。

原来我的 ftp 客户端正在以 ASCII 模式而不是二进制模式传输,因此 jar 文件已损坏。尽管如此,我还是学到了很多东西。

【问题讨论】:

    标签: java classpath aix


    【解决方案1】:

    使用-jar 选项时,您需要在manifest file 的类路径中指定哪些jar 文件。仅将所需的 jar 文件放在同一目录中是不行的。

    在清单中添加一行:

    Class-Path: JAXB2_20081030.jar:JAXB2_20110601.jar:....:netty-3.2.4.Final.jar
    

    或跳过-jar 选项并使用启动

    java -cp JAXB2_20081030.jar:....:netty-3.2.4.Final.jar:jRams.jar pkg.JRamsMain
    

    它应该可以正常工作。

    (请注意,在 *nix 系统上,与 Windows 机器不同,类路径中的 jar 文件应使用 : 而非 ; 分隔。)

    进一步阅读:

    【讨论】:

      【解决方案2】:

      您需要通过添加-classpath 参数将所有这些JAR 添加到运行时CLASSPATH。 AIX 要求您使用 : 分隔 JAR

      【讨论】:

      • 当使用-jar 选项时,-classpath 选项将被忽略。从man java-jar当你使用这个选项时,JAR 文件是所有用户类的来源,其他用户类路径设置被忽略。
      【解决方案3】:

      您必须指定完整路径(如果库与 jRams 不在同一目录中)或仅在清单文件中指定 jar 文件的名称(如果所有依赖项 jar 位于同一文件夹中)。或者使用 -cp 参数指定所有依赖 jars 的路径。

      示例假设每个依赖项都在您正在执行 java 命令的同一目录中):

      java -cp commons-collections-3.2.1.jar; jaxb-impl.jar; etc.. ;jRams.jar package_to_class.MyMainClass.java

      package_to_class 为示例:com.myproj.example

      已编辑

      【讨论】:

      • 使用-jar 选项时,-classpath 选项将被忽略。来自man java on -jar使用该选项时,JAR 文件是所有用户类的来源,其他用户类路径设置将被忽略。
      【解决方案4】:

      按照以下步骤将“Class-Path”添加到现有 jar 文件 -

      1. 使用以下条目创建“newmanifest”文件 类路径:附加/jars

      2. 更新现有的 jar 文件,例如“类.jar” jar --update --manifest=newmanifest --file classes.jar

      3. 膨胀 jar 文件 jar -xvf classes.jar 创建:META-INF/ 膨胀:META-INF/MANIFEST.MF

      4. 验证“Class-Path”是否已添加到 MANIFEST.MF

      猫 META-INF/MANIFEST.MF 清单版本:1.0 主类:类名 创建者:15.0.2(甲骨文公司) 类路径:附加/jars

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-13
        • 1970-01-01
        • 2015-10-26
        • 1970-01-01
        相关资源
        最近更新 更多