【问题标题】:Could not find or load main class when running through command line通过命令行运行时找不到或加载主类
【发布时间】:2015-09-30 19:31:08
【问题描述】:

阅读this关于通过命令行添加依赖项的问题后,由于以下错误,我无法启动我的应用程序:

Error: Could not find or load main class kiaragen.class

我已经尝试过this 问题中描述的变体:

$ java -cp ".:/usr/lib/jvm/java-8-jdk/jre/lib/*:kiaragen/lib/*" kiaragen/bin/org/fiware/kiara/generator/kiaragen.class
Error: Could not find or load main class kiaragen.bin.org.fiware.kiara.generator.kiaragen.class
$ java -cp ".:/usr/lib/jvm/java-8-jdk/jre/lib/*:kiaragen/lib/*" kiaragen/bin/org/fiware/kiara/generator/kiaragen
Error: Could not find or load main class kiaragen.bin.org.fiware.kiara.generator.kiaragen
$ java -cp .:/usr/lib/jvm/java-8-jdk/jre/lib/*:kiaragen/lib/* kiaragen/bin/org/fiware/kiara/generator/kiaragen.class
Error: Could not find or load main class kiaragen.bin.org.fiware.kiara.generator.kiaragen.class
$ java -cp .:/usr/lib/jvm/java-8-jdk/jre/lib/*:kiaragen/lib/* kiaragen/bin/org/fiware/kiara/generator/kiaragen
Error: Could not find or load main class kiaragen.bin.org.fiware.kiara.generator.kiaragen
$ java -classpath ".:/usr/lib/jvm/java-8-jdk/jre/lib/*:kiaragen/lib/*" kiaragen/bin/org/fiware/kiara/generator/kiaragen
Error: Could not find or load main class kiaragen.bin.org.fiware.kiara.generator.kiaragen
$ java -classpath .:/usr/lib/jvm/java-8-jdk/jre/lib/*:kiaragen/lib/* kiaragen/bin/org/fiware/kiara/generator/kiaragen
Error: Could not find or load main class kiaragen.bin.org.fiware.kiara.generator.kiaragen

其中 kiaragen 是项目的根目录(我需要从该目录之外运行 kiaragen.class)。我正在使用 java 1.8:

$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

在 ubuntu 14.04 上。字节码文件 kiaragen.class 存在并且确实有一个入口点。该项目已使用 IntelliJ IDEA 14.1.4 编译。

IntelliJ 中显示的依赖项是:

我错过了什么?

编辑#1:

我已经运行了以下命令:

$ java -cp ".:/usr/lib/jvm/java-8-jdk/jre/lib/*:/home/kiara/AppLab/KIARA/kiaragen/lib/*" kiaragen/bin/org.fiware.kiara.generator.kiaragen
Error: Could not find or load main class kiaragen.bin.org.fiware.kiara.generator.kiaragen
$ java -cp ".:kiaragen/lib/*" kiaragen/bin/org.fiware.kiara.generator.kiaragen
Error: Could not find or load main class kiaragen.bin.org.fiware.kiara.generator.kiaragen
$ java -cp ".:kiaragen/lib/*" kiaragen/bin/org.fiware.kiara.generator.kiaragen
Error: Could not find or load main class kiaragen.bin.org.fiware.kiara.generator.kiaragen

kiaragen.class在指定位置:

$ find kiaragen/ -name "kiaragen*"
kiaragen/
kiaragen/kiaragen.iml
kiaragen/src/main/java/org/fiware/kiara/generator/kiaragen.java
kiaragen/bin/org/fiware/kiara/generator/kiaragen$TemplateErrorListener.class
kiaragen/bin/org/fiware/kiara/generator/kiaragen.class
kiaragen/scripts/kiaragen.sh
kiaragen/scripts/kiaragen.bat

为什么java找不到?

编辑#2:

包的结构如下:

编辑#3:

kiaragen.java 确实有一个 ma​​in() 方法:

/*
     * ----------------------------------------------------------------------------------------
     * 
     * Main entry point
     */

    public static void main(String[] args) {
        ColorMessage.load();

        m_platforms = new ArrayList<String>();
        m_platforms.add("gradle");

        try {

            kiaragen main = new kiaragen(args);
            if (main.execute()) {
                System.exit(0);
            }

        } catch (BadArgumentException e) {

            System.out.println(ColorMessage.error("BadArgumentException") + e.getMessage());
            printHelp();

        }

        System.exit(-1);
    }

【问题讨论】:

  • package 对应的kiaragen 是什么?哪个jar 包含这个class
  • @CKing "kiaragen.src.main.java.org.fiware.kiara.generator.kiaragen.java"
  • kiaragen.class 是我要运行的实际应用程序。它不是 .jar 文件的一部分,但取决于问题中提到的那些。
  • 查看我的答案,让我知道它是否适合您。我没有足够的信息来指出运行您的课程的确切命令,但我的回答将为您指明正确的方向。你已经有一段时间了,所以你知道这个网站是有效的。反馈很重要。

标签: java linux intellij-idea command-line classpath


【解决方案1】:

您在java 命令中提供类路径的方式不正确。但在我们开始之前,请确保 kiaragen 有一个 public static void main(String []args) 方法。

如果是,请尝试以下建议:

Java class 的完全限定名称以 package 开头,以 class 的名称结尾。

假设kiaragen.java中的package语句是package org.fiware.kiara.generator;,那么这个类的全限定名是org.fiware.kiara.generator.kiaragen

您可以从项目的根目录之外运行该类,如下所示:

java -cp ".:/usr/lib/jvm/java-8-jdk/jre/lib/*:kiaragen/lib/*" kiaragen/bin/org.fiware.kiara.generator.kiaragen

话虽如此,没有必要将jre/lib 目录显式添加到类路径中,除非您已将一些用户定义的jar 文件放在那里。

【讨论】:

  • 我已经使用完全限定名称运行了所有命令,甚至添加了类路径的完整路径,但它仍然找不到 kiarage.class。我已经编辑了问题。
  • @Sebi 如果您了解基础知识,这真的没那么复杂。我建议您阅读 CLASSPATH 上的 Oracle 文档。
  • 我确实了解基础知识。我不明白为什么我的 java 显示错误错误:无论输入如何,都无法找到或加载主类(请参阅编辑)。
  • @Sebi 好吧,kiaragen.javapublic static void main(String []args) 方法吗?
  • 是的,确实如此,而且它在项目中是独一无二的(编辑#3)。
【解决方案2】:

首先,您需要在类路径中包含类文件的路径(在bin 目录中)。其次,由于从 IntelliJ 屏幕截图中判断 src/main/java 是您的源目录(它标记为蓝色),因此对您的主类的完全限定引用是 org.fiware.kiara.generator.kiaragen

假设您在程序的父目录中,请尝试运行

java -cp kiaragen/lib/*:kiaragen/bin org.fiware.kiara.generator.kiaragen

【讨论】:

    【解决方案3】:

    我已经设法让它运行(通过从 IntelliJ 复制运行命令):

    $ /usr/lib/jvm/java-8-jdk/bin/java -Didea.launcher.port=7534 -Didea.launcher.bin.path=/usr/share/intellijidea-ce/bin -Dfile.encoding=UTF-8 -classpath /home/kiara/AppLab/KIARA/kiaragen/bin:/usr/lib/jvm/java-8-jdk/jre/lib/jsse.jar:/usr/lib/jvm/java-8-jdk/jre/lib/plugin.jar:/usr/lib/jvm/java-8-jdk/jre/lib/jfr.jar:/usr/lib/jvm/java-8-jdk/jre/lib/management-agent.jar:/usr/lib/jvm/java-8-jdk/jre/lib/charsets.jar:/usr/lib/jvm/java-8-jdk/jre/lib/rt.jar:/usr/lib/jvm/java-8-jdk/jre/lib/deploy.jar:/usr/lib/jvm/java-8-jdk/jre/lib/javaws.jar:/usr/lib/jvm/java-8-jdk/jre/lib/resources.jar:/usr/lib/jvm/java-8-jdk/jre/lib/jce.jar:/usr/lib/jvm/java-8-jdk/jre/lib/jfxswt.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/nashorn.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/dnsns.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/jfxrt.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/localedata.jar:/home/kiara/AppLab/KIARA/kiaragen/lib/antxr.jar:/home/kiara/AppLab/KIARA/kiaragen/lib/stringtemplate-3.2.1.jar:/home/kiara/AppLab/KIARA/kiaragen/lib/kiaraparser-0.1.0.jar:/home/kiara/AppLab/KIARA/kiaragen/lib/antlr-4.4-complete.jar:/home/kiara/AppLab/KIARA/kiaragen/lib/antlr-2.7.7.jar:/usr/share/intellijidea-ce/lib/idea_rt.jar com.intellij.rt.execution.application.AppMain org.fiware.kiara.generator.kiaragen
    

    在没有 IntelliJ 的情况下运行:

    $ /usr/lib/jvm/java-8-jdk/bin/java -classpath /home/kiara/AppLab/KIARA/kiaragen/bin:/usr/lib/jvm/java-8-jdk/jre/lib/jsse.jar:/usr/lib/jvm/java-8-jdk/jre/lib/plugin.jar:/usr/lib/jvm/java-8-jdk/jre/lib/jfr.jar:/usr/lib/jvm/java-8-jdk/jre/lib/management-agent.jar:/usr/lib/jvm/java-8-jdk/jre/lib/charsets.jar:/usr/lib/jvm/java-8-jdk/jre/lib/rt.jar:/usr/lib/jvm/java-8-jdk/jre/lib/deploy.jar:/usr/lib/jvm/java-8-jdk/jre/lib/javaws.jar:/usr/lib/jvm/java-8-jdk/jre/lib/resources.jar:/usr/lib/jvm/java-8-jdk/jre/lib/jce.jar:/usr/lib/jvm/java-8-jdk/jre/lib/jfxswt.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/nashorn.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/dnsns.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/jfxrt.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/localedata.jar:/home/kiara/AppLab/KIARA/kiaragen/lib/antxr.jar:/home/kiara/AppLab/KIARA/kiaragen/lib/stringtemplate-3.2.1.jar:/home/kiara/AppLab/KIARA/kiaragen/lib/kiaraparser-0.1.0.jar:/home/kiara/AppLab/KIARA/kiaragen/lib/antlr-4.4-complete.jar:/home/kiara/AppLab/KIARA/kiaragen/lib/antlr-2.7.7.jar:/usr/share/intellijidea-ce/lib/idea_rt.jar  org.fiware.kiara.generator.kiaragen
    

    因为没有理智的人愿意在我每次创建别名时输入:

    $ vim ~/.bashrc
    alias kiaragen="/usr/lib/jvm/java-8-jdk/bin/java -classpath /home/kiara/AppLab/KIARA/kiaragen/bin:/usr/lib/jvm/java-8-jdk/jre/lib/jsse.jar:/usr/lib/jvm/java-8-jdk/jre/lib/plugin.jar:/usr/lib/jvm/java-8-jdk/jre/lib/jfr.jar:/usr/lib/jvm/java-8-jdk/jre/lib/management-agent.jar:/usr/lib/jvm/java-8-jdk/jre/lib/charsets.jar:/usr/lib/jvm/java-8-jdk/jre/lib/rt.jar:/usr/lib/jvm/java-8-jdk/jre/lib/deploy.jar:/usr/lib/jvm/java-8-jdk/jre/lib/javaws.jar:/usr/lib/jvm/java-8-jdk/jre/lib/resources.jar:/usr/lib/jvm/java-8-jdk/jre/lib/jce.jar:/usr/lib/jvm/java-8-jdk/jre/lib/jfxswt.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/nashorn.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/dnsns.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/jfxrt.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/java-8-jdk/jre/lib/ext/localedata.jar:/home/kiara/AppLab/KIARA/kiaragen/lib/antxr.jar:/home/kiara/AppLab/KIARA/kiaragen/lib/stringtemplate-3.2.1.jar:/home/kiara/AppLab/KIARA/kiaragen/lib/kiaraparser-0.1.0.jar:/home/kiara/AppLab/KIARA/kiaragen/lib/antlr-4.4-complete.jar:/home/kiara/AppLab/KIARA/kiaragen/lib/antlr-2.7.7.jar org.fiware.kiara.generator.kiaragen"
    

    保存并关闭并加载 .bashrc

    $ source ~/.bashrc
    

    【讨论】:

    • 1) 您仍在类路径中包含一个 IntelliJ IDEA 库:/usr/share/intellijidea-ce/lib/idea_rt.jar。 2) 我不确定 IntelliJ IDEA 为何选择显式包含 JDK JAR。除此之外,我似乎使用了我在回答中建议的版本的详细版本。这对你不起作用吗?
    • @hzpz 感谢您的通知。删除了条目,它仍然有效。我已经尝试了您的答案,并且效果也很好。
    • 别提了!如果您的问题得到解决,请接受答复。
    【解决方案4】:

    要执行位于d/e 子目录的org.a.b.c.theClass 类的public static void main(String args[]); 方法,您必须执行以下语句:

    java -cp 'd/e:$CLASSPATH' org.a.b.c.theClass
    

    你必须在类路径中包含属于包名的目录路径,和属于包名的路径到包名中,所以必须有一个类文件位于:d/e/org/a/b/c/theClass(文件必须命名为d/e/org/a/b/c/theClass.class)。

    对于您的情况,这取决于您尝试从哪里执行 java 文件,但假设您尝试从执行 find 命令的同一位置执行它:

    java -cp "kiaragen/bin:$CLASSPATH" org.fiware.kiara.generator.kiaragen
    

    将是正确的命令(您从未在 qestion 中使用过绝对路径,也不知道您的项目目录在哪里,所以我使用了与您发出 find 命令的位置相关的所有路径)

    因此,如果您住在 /home/yourname 并假设您的 kiaragen 项目位于 workspace/kiaragen,则可能的绝对路径(允许您独立于当前目录执行它)将是:

    java -cp "/home/yourname/workspace/kiaragen/bin:$CLASSPATH" org.fiware.iara.generator.kiaragen
    

    $CLASSPATH 允许您包含原始类路径并找到正常的 java 库类)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-30
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 2020-12-23
      • 2015-06-14
      • 2019-06-14
      相关资源
      最近更新 更多