“无法找到或加载主类”是什么意思?

时间:2013-08-07 03:02:46

标签: java class main

新Java开发人员遇到的一个常见问题是,他们的程序无法运行并显示错误消息:Could not find or load main class ...

这是什么意思,是什么导致它,以及你应该如何解决它?

56 个答案:

答案 0 :(得分:1057)

java <class-name>命令语法

首先,您需要了解使用java(或javaw)命令启动程序的正确方法。

正常语法 1 是:

    java [ <option> ... ] <class-name> [<argument> ...]

其中<option>是命令行选项(以&#34; - &#34;字符开头),<class-name>是完全限定的Java类名,<argument>是传递给应用程序的任意命令行参数 1 - &#34;可执行文件&#34;的第二种语法。我将在底部描述的JAR文件。

该类的完全限定名称(FQN)通常按照Java源代码编写; e.g。

    packagename.packagename2.packagename3.ClassName

但是java命令的某些版本允许您使用斜杠而不是句点; e.g。

    packagename/packagename2/packagename3/ClassName

(令人困惑)看起来像文件路径名,但不是一个。请注意,术语完全限定名称是标准的Java术语...而不是我只是为了让您感到困惑: - )

以下是java命令的示例:

    java -Xmx100m com.acme.example.ListUsers fred joe bert

以上将导致java命令执行以下操作:

  1. 搜索com.acme.example.ListUsers类的编译版本。
  2. 加载课程。
  3. 检查该类是否有main方法,其中签名返回类型修饰符public static void main(String[])给出。 (注意,方法参数的名称是 NOT 签名的一部分。)
  4. 调用该方法将命令行参数(&#34; fred&#34;,&#34; joe&#34;,&#34; bert&#34;)作为String[]传递给它。
  5. Java无法找到类

    的原因

    当您收到消息&#34;无法找到或加载主类...&#34;时,表示第一步失败。 java命令无法找到该类。事实上,&#34; ...&#34;在消息中将是java正在寻找的完全限定类名

    那么为什么它找不到这个班级呢?

    原因#1 - 您使用classname参数

    时出错了

    第一个可能的原因是您可能提供了错误的类名。 (或者......正确的类名,但形式错误。)考虑到上面的例子,这里有各种错误的方法来指定类名:

    • 示例#1 - 一个简单的类名:

      java ListUser
      

      当在com.acme.example这样的包中声明类时,您必须在java命令中使用完整的类名,包括包名称;例如

      java com.acme.example.ListUser
      
    • 示例#2 - 文件名或路径名而不是类名:

      java ListUser.class
      java com/acme/example/ListUser.class
      
    • 示例#3 - 套管不正确的类名称:

      java com.acme.example.listuser
      
    • 示例#4 - 错字

      java com.acme.example.mistuser
      
    • 示例#5 - 源文件名

      java ListUser.java
      
    • 示例#6 - 您完全忘记了班级名称

      java lots of arguments
      

    原因#2 - 未正确指定应用程序的类路径

    第二个可能的原因是类名是正确的,但java命令找不到类。要理解这一点,您需要了解&#34; classpath&#34;的概念。 Oracle文档对 well 进行了解释:

    所以......如果你正确指定了类名,接下来要检查的是你已经正确指定了类路径:

    1. 阅读上面链接的三个文件。 (是......阅读它们。重要的是,Java程序员至少了解至少Java类路径机制如何工作的基础知识。)
    2. 查看运行java命令时生效的命令行和/或CLASSPATH环境变量。检查目录名称和JAR文件名是否正确。
    3. 如果类路径中有 relative 路径名,请检查它们是否正确解析...从运行java命令时生效的当前目录。
    4. 检查该类(在错误消息中提及)是否可以位于有效类路径中。
    5. 请注意,Windows与Linux和Mac OS的类路径语法不同。 (Windows上的类路径分隔符为;,其他分类为:。如果您的平台使用了错误的分隔符,则无法获得明确的错误消息。相反,您将获得路径上不存在的文件或目录将被忽略。)
    6. 原因#2a - 类路径上的错误目录

      当您在类路径上放置目录时,它在概念上对应于限定名称空间的根目录。通过将完全限定名称映射到路径名,类位于该根目录下的目录结构中。例如,如果&#34; / usr / local / acme / classes&#34;在类路径上,然后当JVM查找名为com.acme.example.Foon的类时,它将查找&#34; .class&#34;文件名为:

        /usr/local/acme/classes/com/acme/example/Foon.class
      

      如果你放了&#34; / usr / local / acme / classes / com / acme / example&#34;在类路径上,然后JVM将无法找到该类。

      原因#2b - 子目录路径与FQN

      不匹配

      如果你的类FQN是com.acme.example.Foon,那么JVM将会寻找&#34; Foon.class&#34;在目录&#34; com / acme / example&#34;:

      • 如果您的目录结构与上述模式的包命名不匹配,则JVM无法找到您的课程。

      • 如果您通过移动重命名一个类,那么它也会失败...但异常堆栈跟踪会有所不同。

      举一个具体的例子,假设:

      • 您想要运行com.acme.example.Foon课程,
      • 完整文件路径为/usr/local/acme/classes/com/acme/example/Foon.class
      • 您当前的工作目录为/usr/local/acme/classes/com/acme/example/

      然后:

      # wrong, FQN is needed
      java Foon
      
      # wrong, there is no `com/acme/example` folder in the current working directory
      java com.acme.example.Foon
      
      # wrong, similar to above
      java -classpath . com.acme.example.Foon
      
      # fine; relative classpath set
      java -classpath ../../.. com.acme.example.Foon
      
      # fine; absolute classpath set
      java -classpath /usr/local/acme/classes com.acme.example.Foon
      

      注意:

      • 在大多数Java版本中,-classpath选项可以缩短为-cp。查看javajavac等相应的手册条目。
      • 在类路径中选择绝对路径名和相对路径名时要仔细考虑。请记住,相对路径名可以“打破”#34;如果当前目录更改。

      原因#2c - 类路径中缺少依赖项

      类路径需要包含应用程序所依赖的所有其他(非系统)类。 (系统类是自动定位的,你很少需要关注它。)为了正确加载主类,JVM需要找到:

      (注意:JLS和JVM规范允许JVM加载类的某些范围&#34;懒惰&#34;,这会影响抛出类加载器异常的时间。)

      原因#3 - 该类已在错误的包中声明

      偶尔会有人将源代码文件放入 源代码树中的错误文件夹,或者它们遗漏了package声明。如果在IDE中执行此操作,IDE的编译器将立即告诉您。同样,如果您使用一个不错的Java构建工具,该工具将以检测问题的方式运行javac。但是,如果您手动构建Java代码,则可以通过编译器未发现问题的方式执行此操作,以及生成的&#34; .class&#34;文件不在您期望的位置。

      仍然无法找到问题?

      有很多东西要检查,很容易错过一些东西。尝试将-Xdiag选项添加到java命令行(作为java之后的第一个选项)。它将输出关于类加载的各种内容,这可能为您提供关于真正问题的线索。

      另外,请考虑从网站,文档等复制和粘贴不可见或非ASCII字符可能导致的问题。并考虑&#34;同形体&#34;,两个字母或符号看起来相同......但不是。


      java -jar <jar file>语法

      用于&#34;可执行文件&#34;的替代语法JAR文件如下:

        java [ <option> ... ] -jar <jar-file-name> [<argument> ...]
      

      e.g。

        java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
      

      在这种情况下,入口点类的名称(即com.acme.example.ListUser)和类路径在JAR文件的MANIFEST中指定。


      的IDE

      典型的Java IDE支持在IDE JVM本身或子JVM中运行Java应用程序。这些通常免受此特定异常的影响,因为IDE使用自己的机制来构造运行时类路径,标识主类并创建java命令行。

      但是,如果您在IDE后面执行操作,则仍可能发生此异常。例如,如果您之前在Eclipse中为Java应用程序设置了应用程序启动器,那么您移动了包含&#34; main&#34;的JAR文件。在没有告诉Eclipse 的情况下,将类放到文件系统中的不同位置,Eclipse将无意中使用不正确的类路径启动JVM。

      简而言之,如果您在IDE中遇到此问题,请检查旧的IDE状态,损坏的项目引用或损坏的启动器配置等内容。

      IDE也可能简单地混淆。 IDE是包含许多交互部分的非常复杂的软件。其中许多部分采用各种缓存策略,以使IDE作为一个整体响应。这些有时可能会出错,一种可能的症状是启动应用程序时出现问题。如果您怀疑可能发生这种情况,则值得重新启动IDE。


      其他参考资料

答案 1 :(得分:209)

如果您的源代码名称是HelloWorld.java,则编译的代码将为HelloWorld.class

如果使用以下方法调用它,您将收到该错误:

java HelloWorld.class

相反,请使用:

java HelloWorld

答案 2 :(得分:116)

如果您的类在包中,那么您必须cd到主目录并使用类的全名运行(packageName.MainClassName)。

示例:

我的课程在这里:

D:\project\com\cse\

我的主要课程的全名是:

com.cse.Main

所以我cd回到主目录:

D:\project

然后发出java命令:

java com.cse.Main

答案 3 :(得分:49)

如果在package中定义主类和主方法,则应使用类的全名(packageName.MainClassName)在层级目录上运行它。

假设有一个源代码文件(Main.java):

package com.test;

public class Main {

    public static void main(String[] args) {
        System.out.println("salam 2nya\n");
    }
}

要运行此代码,您应将Main.Class放在目录./com/test/Main.Java中的包中。在根目录中使用java com.test.Main

答案 4 :(得分:38)

当相同的代码在一台PC上工作,但它在另一台PC上显示错误时,我发现的最佳解决方案是编译如下:

javac HelloWorld.java
java -cp . HelloWorld

答案 5 :(得分:32)

帮助我的是在命令行上指定类路径,例如:

  1. 创建一个新文件夹C:\temp

  2. C:\temp中创建文件Temp.java,其中包含以下类:

    public class Temp {
        public static void main(String args[]) {
            System.out.println(args[0]);
        }
    }
    
  3. 在文件夹C:\temp中打开命令行,并编写以下命令以编译Temp类:

    javac Temp.java
    
  4. 运行已编译的Java类,添加-classpath选项让JRE知道在哪里找到该类:

    java -classpath C:\temp Temp Hello!
    

答案 6 :(得分:24)

根据错误消息(&#34;无法找到或加载主类&#34;),有两类问题:

  1. 主要课程无法找到
  2. 主要课程无法加载(此案例未在接受的答案中详细讨论)
  3. 如果在完全限定的类名中出现拼写错误或语法错误,或者在提供的类路径中不存在>,则主要类无法找到

    无法启动类时,主类无法加载,通常主类扩展另一个类,并且该类在提供的类路径中不存在。

    例如:

    public class YourMain extends org.apache.camel.spring.Main
    

    如果不包含camel-spring,将报告此错误。

答案 7 :(得分:15)

有时可能导致问题的原因与主要课程无关,我必须以艰难的方式找到它。这是我移动的一个引用的库,它给了我:

  

无法找到或加载主类xxx Linux

我刚刚删除了该引用,再次添加它,它再次正常工作。

答案 8 :(得分:13)

在这种情况下我遇到了这样的错误:

java -cp lib.jar com.mypackage.Main

适用于Windows的;和Unix的:

java -cp lib.jar; com.mypackage.Main

答案 9 :(得分:12)

使用此命令:

java -cp . [PACKAGE.]CLASSNAME

示例:如果您的类名是从Hello.java创建的Hello.class,则使用以下命令:

java -cp . Hello

如果你的文件Hello.java在com.demo包中,那么使用下面的命令

java -cp . com.demo.Hello

对于JDK 8,多次发生类文件存在于同一文件夹中,但java命令需要classpath,因此我们将 -cp . 添加到将当前文件夹作为classpath的参考。

答案 10 :(得分:12)

尝试 -Xdiag

Steve C's answer很好地涵盖了可能的情况,但有时确定该类是否无法发现已加载可能并不那么容易。使用java -Xdiag(自JDK 7起)。这会打印出一个很好的堆栈跟踪,它提供了消息Could not find or load main class消息的含义。

例如,它可以指向主类使用的其他类,这些类无法找到并阻止加载主类。

答案 11 :(得分:9)

在这种情况下,你有:

  

无法找到或加载主要类?classpath

这是因为您使用的是“-classpath”,但破折号与java在命令提示符下使用的破折号不同。我有这个问题从Notepad复制并粘贴到cmd。

答案 12 :(得分:7)

在我的情况下,出现错误是因为我提供了源文件名而不是类名。

我们需要向解释器提供包含main方法的类名。

答案 13 :(得分:6)

我花了相当多的时间试图解决这个问题。我以为我在某种程度上错误地设置了我的类路径,但问题是我输入了:

java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool  

而不是:

java -cp C:/java/MyClasses utilities/myapp/Cool   

我认为完全限定的含义意味着包含完整的路径名而不是完整的包名。

答案 14 :(得分:6)

我遇到了同样的问题,最后发现了我的错误:) 我使用此命令进行编译,并且可以正常工作。

javac -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode.java

但是此命令对我不起作用(无法找到或加载主类qrcode)

java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode

最后我只是在类路径的末尾添加了':'字符,问题就解决了。

java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar:" qrcode

答案 15 :(得分:6)

enter image description here

类文件位置: C:\ test \ com \ company

文件名: Main.class

完全限定的班级名称: com.company.Main

命令行命令:

java  -classpath "C:\test" com.company.Main

请注意,类路径不包含\ com \ company

答案 16 :(得分:5)

如果使用Maven构建JAR文件,请确保在pom.xml文件中指定主类:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>class name us.com.test.abc.MyMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

答案 17 :(得分:5)

如果您的情况与我的情况特别相似,这可能对您有所帮助:作为初学者,当我尝试运行Java程序时,我也遇到了这个问题。

我这样编译:

javac HelloWorld.java

我也尝试使用相同的扩展程序运行:

java Helloworld.java

当我删除.java并重新编写java HelloWorld之类的命令时,程序运行完美。 :)

答案 18 :(得分:5)

此处的所有答案都针对Windows用户。对于Mac,类路径分隔符为:,而不是;。作为错误设置,不会抛出使用;的类路径,如果从Windows到Mac,这可能很难发现。

以下是相应的Mac命令:

java -classpath ".:./lib/*" com.test.MyClass

在此示例中,包是com.test,并且lib文件夹也包含在类路径中。

答案 19 :(得分:5)

在我的案例中解决问题的原因是:

右键单击要运行的项目/类,然后Run As - &gt; Run Configurations。然后,您应该修复现有配置或按以下方式添加新配置:

打开Classpath标签,点击Advanced...按钮,然后添加项目的 bin文件夹

答案 20 :(得分:5)

首先使用此命令设置路径;

set path="paste the set path address"

然后你需要加载程序。在存储的驱动器中键入“cd(文件夹名称)”并进行编译。例如,如果我的程序存储在D盘上,输入“D:”按回车键入“cd(文件夹名称)”。

答案 21 :(得分:4)

这是一个特例,但由于我来到这个页面寻找解决方案并且没有找到它,我将在此处添加。

Windows(使用7测试)在类和包名称中不接受特殊字符(如á)。不过Linux确实如此。

当我在NetBeans中构建.jar并尝试在命令行中运行它时,我发现了这一点。它在NetBeans中运行,但不在命令行中运行。

答案 22 :(得分:4)

在Windows上将.;放在CLASSPATH值的开头。

。 (点)表示“查看当前目录”。这是一个永久的解决方案。

您也可以使用设置CLASSPATH=%CLASSPATH%;.“一次”设置它。只要你的cmd窗口打开,这就会持续。

答案 23 :(得分:3)

好的,已经有很多答案,但是没有人提到文件权限可能是罪魁祸首的情况。运行时,用户无权访问jar文件或路径的目录之一。例如,请考虑:

/dir1/dir2/dir3/myjar.jar中的档案文件

拥有罐子的User1可以这样做:

# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar

但是它仍然不起作用:

# Running as User2
java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram

这是因为正在运行的用户(User2)无权访问dir1,dir2或javalibs或dir3。当User1可以看到文件并可以访问文件时,这可能会使某人发疯,但是User2仍然会发生错误

答案 24 :(得分:3)

您确实需要从src文件夹执行此操作。在那里键入以下命令行:

[name of the package].[Class Name] [arguments]

我们假设您的课程名为CommandLine.class,代码如下:

package com.tutorialspoint.java;

    /**
     * Created by mda21185 on 15-6-2016.
     */

    public class CommandLine {
        public static void main(String args[]){
            for(int i=0; i<args.length; i++){
                System.out.println("args[" + i + "]: " + args[i]);
            }
        }
    }

然后你应cd到src文件夹,你需要运行的命令如下所示:

java com.tutorialspoint.java.CommandLine this is a command line 200 -100

命令行上的输出为:

args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100

答案 25 :(得分:3)

在测试Java MongoDB JDBC连接时,我也遇到了类似的错误。我认为最后总结一下我的最终解决方案是好的,以便将来任何人都可以直接查看这两个命令,并且可以继续进行。

假设您位于Java文件和外部依赖项(JAR文件)所在的目录中。

<强>编译:

javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
  • -cp - classpath参数;一个接一个地传递所有依赖的JAR文件
  • *。java - 这是具有main方法的Java类文件。 sdsd

生成

java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
  • 请在所有依赖关系JAR文件结束
  • 后观察冒号(Unix)/逗号(Windows)
  • 最后,观察没有任何扩展名的主类名(没有.class或.java)

答案 26 :(得分:3)

使用Windows PowerShell中公布的java选项运行-cp时,您可能会收到如下错误:

The term `ClassName` is not recognized as the name of a cmdlet, function, script ...

为了让PowerShell接受命令,-cp选项的参数必须包含在引号中,如下所示:

java -cp 'someDependency.jar;.' ClassName

以这种方式形成命令应该允许Java正确处理类路径参数。

答案 27 :(得分:3)

有时,在您尝试过的某些在线编译器中,如果您不编写public class [Classname]而只编写class [Classname],则会出现此错误。

答案 28 :(得分:2)

我无法用这里所述的解决方案解决这个问题(虽然所说的答案无疑已经清除了我的概念)。我遇到过这个问题两次,每次尝试不同的解决方案(在Eclipse IDE中)。

  • 首先,我在项目的不同类中遇到了多个main方法。所以,我从后续的类中删除了main方法。
  • 其次,我尝试了以下解决方案:
    1. 右键单击我的主项目目录。
    2. 前往源头然后清理并坚持使用默认设置并完成。完成一些后台任务后,您将被定向到主项目目录。
    3. 之后我关闭了我的项目,重新打开它,然后热潮,我终于解决了我的问题。

答案 29 :(得分:2)

我有一个奇怪的人。

错误:找不到或加载主类mypackage.App

事实证明,我在项目的pom.xml中有一个pom(父)设置(我项目的pom.xml指向父pom.xml),而relativePath是关闭/错误的。

下面是我项目的pom.xml的一部分

<parent>
    <groupId>myGroupId</groupId>
    <artifactId>pom-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../badPathHere/pom.xml</relativePath>
</parent> 

一旦我解决了pom relativePath,错误就消失了。

去吧。

答案 30 :(得分:2)

在我的情况下,我收到了错误,因为我在Windows 7系统上混合了大写和小写包名称。将包名称更改为全部小写可解决此问题。 还要注意,在这种情况下,我没有将.java文件编译成.class文件的错误;它不会从同一个(子子)子目录运行。

答案 31 :(得分:2)

在Java中,当您有时使用java可执行文件从命令行运行JVM并且尝试从具有public static void main(PSVM)的类文件启动程序时,您可能会遇到以下错误,即使JVM的classpath参数是准确的,类文件存在于类路径中:

Error: main class not found or loaded

如果无法加载带有PSVM的类文件,则会发生这种情况。一个可能的原因是该类可能正在实现接口或扩展不在类路径上的另一个类。通常,如果类不在类路径上,则抛出的错误表示如此。但是,如果正在使用的类被扩展或实现,则java无法加载类本身。

参考:https://www.computingnotes.net/java/error-main-class-not-found-or-loaded/

答案 32 :(得分:2)

我在执行mvn eclipse:eclipse后收到此错误 这让我的.classpath文件搞砸了。

必须更改.classpath中的行

<classpathentry kind="src" path="src/main/java" including="**/*.java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>

<classpathentry kind="src" path="src/main/java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**"  output="target/classes" />

答案 33 :(得分:1)

在IDE开发(Eclipse,NetBeans或其他)的上下文中,您必须将项目属性配置为具有主类,以便IDE在您按下&#34;时知道主类所在的位置。玩&#34;

  1. 右键单击您的项目,然后单击属性
  2. 转到“运行”类别并选择“主类”
  3. 点击运行按钮。
  4. Enter image description here

答案 34 :(得分:1)

这是另一个花了我一些时间的问题:命令行类路径参数的行为不符合您的预期。我在MacOS上直接调用CLI,并且在通话中包含两个jar。

例如,这两个都使该工具对主类的名称感到困惑:

这是因为星号导致它错误地解析了args:

java -cp path/to/jars/* com.mypackage.Main

这是因为-我不确定为什么:

java -cp "*.jar" com.mypackage.Main

这有效:

java -cp "path/to/jars/*" com.mypackage.Main

明确列出两个罐子也可以:

java -cp path/to/jars/jar1.jar:path/to/jars/jar2.jar com.mypackage.Main

答案 35 :(得分:1)

我在IntelliJ中创建的演示程序遇到了这个问题。

有两个要点可以解决:

  1. 程序的程序包名称
  2. 终端/ cmd提示符的当前工作目录

我的演示程序:

package io.rlx.tij.c2;

public class Ex10 {
    public static void main(String[] args) {
        // do something
    }
}

源代码的路径:

../projectRoot/src/main/java/io/rlx/tij/c2/Ex10.java
  1. 转到java目录:cd ../projectRoot/src/main/java
  2. 编译为类:javac ./io/rlx/tij/c2/Ex10.java
  3. 运行程序:java io.rlx.tij.c2.Ex10

如果我在../projectRoot/src/main/java/io/rlx/tij/c2中运行程序,或者在没有程序包名称的情况下运行程序,则会收到此错误:Error: Could not find or load main class

答案 36 :(得分:1)

如果此问题与Eclipse有关:

尝试将项目添加到您的类路径中。

请参见下图:

enter image description here

这种方法对我有用。

答案 37 :(得分:1)

方案::使用命令提示符(Windows中为 CMD )进行编译运行一个简单的“ java”程序中只有' Main.java '文件,并指定了' package main '。

源文件路径:

some-project-name-folder \ src \ main \ Main.java

目标文件夹:

一些项目名称文件夹\目的地

目标文件路径(文件夹“ \ main”和文件“ \ Main.class”将由“ javac”生成):

一些项目名称文件夹\ dest \ main \ Main.class

Main.java 如下:

package main;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world");
    }
}

编译:

// 'javac' compiler will produce 'Main.class' in the 'dest\main' folder.
// 'main' folder is created because in the source file(in our case: 'Main.java') is
// specified 'package main'.

javac -d ./dest ./src/main/Main.java

运行编译的文件(在我们的示例中为“ Main.class”):

// '-cp'(is the same as '-classpath')
// './dest'(means destination folder, where resides compiled 'Main.class').
// 'main.Main'(means 'package' 'main', which contains class 'Main'('Main.class'))
// WARNING: when run 'java' class, MUST NOT type extension '.class'
//          after 'class name
//          (in our case: 'main.Main'(<package>.<class-name>) WITHOUT extension 
//           '.class').

java -cp ./dest main.Main

// Hello world

答案 38 :(得分:0)

这也发生在我身上。就我而言,它仅在源代码中存在HttpServlet类时发生(Idea Intellij没有给出编译时错误,servlet包被很好地导入了,但是在运行时有这个{{ 1}}错误)。

我设法解决了。我去了File-Project Structure:

enter image description here

然后转到模块:

enter image description here

servlet模块附近有一个Provided范围。我将其更改为“编译”:

enter image description here

成功了!

答案 39 :(得分:0)

搜索2天后,我发现了该解决方案,并且可以正常工作。很奇怪,但是对我有用。

package javaapplication3;
public class JavaApplication3 {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here
    System.out.println("Hello");
}

}

这是我要运行的程序,位于C:\ Java Projects \ JavaApplication3 \ src \ javaapplication3

现在在此位置打开cmd并使用此命令编译程序

javac JavaApplication3.java

编译后,向下浏览一个目录,即C:\ Java Projects \ JavaApplication3 \ src

现在运行以下命令以执行程序

java javaapplication3.JavaApplication3

答案 40 :(得分:0)

如果您使用IntelliJ并从IDE运行main方法时出现错误,只需确保您的类位于java包中,而不位于kotlin enter image description here

答案 41 :(得分:0)

[Java版本:11]

如果您使用的是Java 11,则无需编译并运行Java文件。

就像跑步一样

Java ClassName.java

示例:

class abc{ 
    public static void main(String[] args){
        System.out.println("hello Jarvis ");    
    }
}

现在运行命令

java abc.java

enter image description here

答案 42 :(得分:0)

原因#2 - 应用程序的类路径指定不正确阅读上面链接的三个文档。 (是的……阅读它们!Java 程序员至少了解 Java 类路径机制如何工作的基础知识很重要。)我想将此文档添加到 JDK 工具和实用程序通用一般信息(文件结构、类路径、如何找到类、更改)增强(JDK 7 中的增强)标准 JDK 工具和实用程序 https://docs.oracle.com/javase/7/docs/technotes/tools/index.html https://docs.oracle.com/javase/7/docs/technotes/tools/findingclasses.html https://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html Java Launcher 如何查找类 了解类路径和包名称 https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javac.html

Java 中的类加载器 Java 类加载器是 Java 运行时环境的一部分,可将 Java 类动态加载到 Java 虚拟机中。由于类加载器,Java 运行时系统不需要了解文件和文件系统。 Java 类不会一次全部加载到内存中,而是在应用程序需要时加载。此时,JRE 调用 Java ClassLoader,这些 ClassLoader 将类动态加载到内存中。 https://en.wikipedia.org/wiki/Java_Classloader https://www.geeksforgeeks.org/classloader-in-java/ https://en.wikipedia.org/wiki/Java_virtual_machine enter image description here
enter image description here enter image description here

答案 43 :(得分:0)

  • 在 Intellij 中检查您的全局库和本地库
  • 在 pom.xml 中检查库版本,可能是旧库
  • 上面提到的很多可能性都需要尝试 也

答案 44 :(得分:0)

默认情况下,Java使用当前工作目录.作为默认CLASSPATH。这意味着当您在提示符下键入命令时,例如java MyClass,该命令被解释为您具有类型java -cp . MyClass。您是否在-cpMyClass之间看到了这个点? ( cp 是较长类路径选项的缩写)

这对于大多数情况来说已经足够了,而且在您尝试向CLASSPATH添加目录的某个时候,似乎工作正常。在大多数情况下,当程序员需要执行此操作时,他们只需运行set CLASSPATH=path\to\some\dir之类的命令。此命令创建一个名为CLASSPATH的新环境变量,其值为path\to\some\dir,或者如果之前已设置path\to\some\dir,则将其值替换为CLASSPATH

完成此操作后,您现在拥有CLASSPATH环境变量,Java不再使用其默认类路径(.),而是您已设置的路径。所以第二天你打开你的编辑器,写一些java程序,cd到你保存它的目录,编译它,并尝试使用命令java MyClass运行它,然后你会看到一个不错的输出: 无法找到或加载主类...... (如果你的命令之前运行良好而且你现在得到这个输出,那么这可能是你)。

当您运行命令java MyClass时,Java会在您MyClass中设置的目录或目录中搜索名为CLASSPATH的类文件,而不是您当前的工作目录,所以它没有在那里找到你的类文件,因此抱怨。

您需要做的是再次将.添加到类路径中,这可以使用命令set CLASSPATH=%CLASSPATH%;.完成(注意分号后面的点)。用简单的英语这个命令说“选择最初是CLASSPATH%CLASSPATH%)的值,向它添加.;.)并将结果分配回{{ 1}}”。

瞧瞧,您再次可以像往常一样使用命令CLASSPATH

答案 45 :(得分:-1)

这就是我解决问题的方法。

我注意到如果您在编译时包含 jar 文件,将当前目录 (./) 添加到类路径会有所帮助。

javac -cp "abc.jar;efg.jar" MyClass.java
java -cp "abc.jar;efg.jar" MyClass

VS

javac -cp "./;abc.jar;efg.jar" MyClass.java
java -cp "./;abc.jar;efg.jar" MyClass

答案 46 :(得分:-1)

我在 onlinegdb 编译器上尝试执行用 intellij idea 编写的代码时遇到了这个错误。

对我来说,注释掉这一行帮助我避免了这个错误。

import discord
from discord.ext import commands
from discord.utils import get
from discord import Embed, Color
import DiscordUtils
import os
from discord.ext.commands import has_permissions, MissingPermissions
import json




intents = discord.Intents.default()

intents.members = True
client = commands.Bot(command_prefix = "-", intents = intents)
client.remove_command("help")




@client.command(pass_context=True)
async def ticket(ctx):
    guild = ctx.guild
    embed = discord.Embed(
        title = 'Ticket system',
        description = 'React ? to make a ticket.',
        color = 0
    )

    embed.set_footer(text="ticket system")

    msg = await ctx.send(embed=embed)
    await msg.add_reaction("?")
    reaction = await msg.fetch_message(msg.id)


    await client.wait_for("reaction_add")



    await client.wait_for("reaction_add")

    if reaction == '?':
        await guild.create_text_channel(name=f'ticket - {reaction.author.name}')

答案 47 :(得分:-1)

另一种让我抓狂的场景是,

package com.me
Public class Awesome extends AwesomeLibObject {
    ....
    public static void main(String[] argv) {
         System.out.println("YESS0");
    }
}

其中AwesomeLibObject是在外部库中定义的类。 我收到了同样令人困惑的错误消息:

Error: Could not find or load main class com.Awesome

解决方法很简单:外部库也必须位于类路径中!

答案 48 :(得分:-1)

右键单击该项目。

  1. 选择“打开模块设置”
  2. 将src文件夹标记为“源”
  3. 转到编辑配置,然后选择您的主类
  4. 单击“确定”或应用按钮

这对我有用。谢谢

答案 49 :(得分:-1)

有关外部库的答案-

编译:

javac -cp ./<external lib jar>: <program-name>.java

执行:

java -cp ./<external lib jar>: <program-name>

上述方案在osx和linux系统中效果很好。注意类路径中的:

答案 50 :(得分:-1)

解决&#34;无法加载主类错误&#34;

在阅读完所有答案后,我注意到大多数人都没有为我工作。所以我做了一些研究,这就是我得到的。只有在第1步无效的情况下才能尝试。

  1. 尝试安装JRE 32或64.如果它不起作用,
  2. 打开转到 C:\ Program Files(x86)\ Java C:\ Program Files \ Java

    • i。打开jdk文件夹,然后打开bin文件夹。
    • ii。复制路径并将其添加到环境变量中。确保使用分号;分隔变量。例如,&#34; C:\ Yargato \ bin; C:\ java \ bin; &#34;。如果您不这样做,则会导致更多错误。

    • iii。转到jre文件夹并打开其bin文件夹。

    • iv。此处搜索 rt.jar文件。我的是:

        

      C:\ Program Files(x86)\ Java \ jre1.8.0_73 \ lib \ rt.jar   复制并在环境变量下搜索classpath变量   并将其粘贴在那里。

    • v。现在重新启动cmd并再次尝试运行。错误将消失。
    • vi。我会发布指向我的YouTube视频教程的链接。

答案 51 :(得分:-1)

好像我遇到这个问题时,它很独特。

一旦我删除了文件顶部的包声明,它就完美无缺。

除此之外,似乎没有任何方法可以在我的机器上运行简单的HelloWorld.java,无论编译发生在哪个文件夹,CLASSPATH或PATH,参数或文件夹调用。

答案 52 :(得分:-2)

如果它是Maven项目

  1. 转到POM文件。
  2. 删除所有依赖项。
  3. 保存POM文件。
  4. 再次仅导入必要的依赖项。
  5. 保存POM文件。

问题应该解决了。

答案 53 :(得分:-2)

在我的情况下,我只是在eclipse中更改JRE。 请找到随附的屏幕截图。enter image description here

答案 54 :(得分:-2)

对于数据库连接,我得到了这个。我刚刚在类路径中添加了以下内容:

export CLASSPATH=<path>/db2jcc4.jar:**./**

我在最后添加了 ./ ,以便在加载时识别我的课程。

现在运行:

java ConnectionExample <args>

它工作得很好。

答案 55 :(得分:-3)

排除以下文件解决了问题。

META-INF/*.SF

META-INF/*.DSA

META-INF/*.RSA

build.gradle中添加了以下代码

jar {
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
    {
        exclude "META-INF/*.SF"
        exclude "META-INF/*.DSA"
        exclude "META-INF/*.RSA"
    }
    manifest {
        attributes(
                'Main-Class': 'mainclass'
        )
    }
}