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

Java 什么是;无法找到或加载主类“;什么意思?,java,class,main,Java,Class,Main,新Java开发人员遇到的一个常见问题是,他们的程序无法运行,并显示错误消息:无法找到或加载主类… 这意味着什么,是什么导致了它,您应该如何修复它?java命令语法 首先,您需要了解使用java(或javaw)命令启动程序的正确方法 正常语法1是这样的: 但是,java命令的某些版本允许您使用斜杠而不是句点;e、 g packagename/packagename2/packagename3/ClassName 它(令人困惑地)看起来像一个文件路径名,但不是一个。请注意,术语完全限定名是

新Java开发人员遇到的一个常见问题是,他们的程序无法运行,并显示错误消息:
无法找到或加载主类…

这意味着什么,是什么导致了它,您应该如何修复它?

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

正常语法1是这样的:

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

    packagename/packagename2/packagename3/ClassName
它(令人困惑地)看起来像一个文件路径名,但不是一个。请注意,术语完全限定名是标准Java术语。。。不是我编造出来让你困惑的东西:-)

下面是
java
命令的示例:

    java -Xmx100m com.acme.example.ListUsers fred joe bert
上述操作将导致
java
命令执行以下操作:

javac HelloWorld.java
java -cp . HelloWorld
  • 搜索
    com.acme.example.ListUsers
    类的编译版本
  • 加载该类
  • 检查类是否有一个
    main
    方法,该方法具有签名、返回类型和由
    publicstaticvoidmain(String[])
    提供的修饰符。(注意,方法参数的名称不是签名的一部分。)
  • 调用该方法,将命令行参数(“fred”、“joe”、“bert”)作为
    字符串[]
    传递给它
  • Java找不到类的原因 当您收到消息“找不到或加载主类…”时,这意味着第一步失败。
    java
    命令无法找到该类。事实上,消息中的“…”将是
    java
    正在寻找的完全限定类名

    那么为什么它可能找不到类呢

    原因#1-您在classname参数中犯了一个错误 第一个可能的原因是您可能提供了错误的类名。(或…正确的类名,但格式错误。)考虑到上面的示例,这里有多种指定类名的错误方法:

    java ListUser
    
    java ListUser.class
    java com/acme/example/ListUser.class
    
    • 示例#1-一个简单的类名:

      java ListUser
      
      java ListUser.class
      java com/acme/example/ListUser.class
      
      当类在包(如
      com.acme.example
      )中声明时,必须在
      java
      命令中使用包含包名的完整类名;e、 g

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

      java ListUser
      
      java ListUser.class
      java com/acme/example/ListUser.class
      
    • 示例#3-大小写不正确的类名:

      java com.acme.example.listuser
      
    • 示例4——打字错误

      java com.acme.example.mistuser
      
    • 示例#5-源文件名(Java 11或更高版本除外;见下文)

    • 示例#6-您完全忘记了类名

      java lots of arguments
      
    原因#2-未正确指定应用程序的类路径 第二个可能的原因是类名正确,但是
    java
    命令找不到该类。要理解这一点,您需要理解“类路径”的概念。Oracle文档很好地解释了这一点:

    • Java教程-
    所以。。。如果正确指定了类名,那么接下来要检查的是是否正确指定了类路径:

    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
    
  • 阅读上面链接的三个文档。(是的……阅读它们!Java程序员至少要了解Java类路径机制的基本工作原理,这一点很重要。)
  • 查看运行
    java
    命令时生效的命令行和/或CLASSPATH环境变量。检查目录名和JAR文件名是否正确
  • 如果类路径中有相对路径名,请检查它们是否正确解析。。。从运行
    java
    命令时有效的当前目录
  • 检查类(错误消息中提到的)是否可以位于有效的类路径上
  • 请注意,Windows与Linux和Mac OS的类路径语法不同。(Windows上的类路径分隔符为
    ,其他平台上的类路径分隔符为
    。如果您的平台使用了错误的分隔符,您将不会收到明确的错误消息。相反,您将在路径上得到一个不存在的文件或目录,该文件或目录将被静默忽略。)
  • 原因#2a-类路径上的目录错误 当您将目录放在类路径上时,它在概念上对应于限定名称空间的根。通过将完全限定名映射到路径名,类位于该根目录下的目录结构中。因此,例如,如果“/usr/local/acme/classes”位于类路径上,那么当JVM查找名为
    com.acme.example.Foon
    的类时,它将查找具有以下路径名的“.class”文件:

      /usr/local/acme/classes/com/acme/example/Foon.class
    
    如果将“/usr/local/acme/classes/com/acme/example”放在类路径上,那么JVM将无法找到该类

    原因#2b-子目录路径与FQN不匹配 如果您的类FQN是
    com.acme.example.Foon
    ,那么JVM将在目录“com/acme/example”中查找“Foon.class”:

    • 如果您的目录结构与按照上述模式命名的包不匹配,JVM将找不到您的类

    • 如果您试图通过移动类来重命名它,那么也将失败。。。但异常stacktrace将有所不同。它可能会这样说:

      Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
      
      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]);
                  }
              }
          }
      
      java com.tutorialspoint.java.CommandLine this is a command line 200 -100
      
      javac HelloWorld.java
      
      注:

      • 在大多数Java版本中,
        -classpath
        选项可以缩短为
        -cp
        。检查
        java
        javac
        等相应的手动条目
      • 在类路径中选择绝对路径名和相对路径名时,请仔细考虑。请记住,如果当前目录发生更改,相对路径名可能会“中断”
      原因#2c-类路径中缺少依赖项 类路径需要包括应用程序开发的所有其他(非系统)类
      java HelloWorld
      
      public class Temp {
          public static void main(String args[]) {
              System.out.println(args[0]);
          }
      }
      
      javac Temp.java
      
      java -classpath C:\temp Temp Hello!
      
      package com.test;
      
      public class Main {
      
          public static void main(String[] args) {
              System.out.println("salam 2nya\n");
          }
      }
      
      cd C:\Users\workspace\testapp  
      
      java com.test.Main
      
      javac Main.java
      
      java Main.class
      
      java Main
      
      D:\project\com\cse\
      
      com.cse.Main
      
      D:\project
      
      java com.cse.Main
      
      javac HelloWorld.java
      java -cp . HelloWorld
      
      java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool  
      
      java -cp C:/java/MyClasses utilities/myapp/Cool   
      
      public class YourMain extends org.apache.camel.spring.Main
      
      Error: main class not found or loaded
      
      <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" />
      
      [name of the package].[Class Name] [arguments]
      
      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]);
                  }
              }
          }
      
      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
      
      java -cp lib.jar com.mypackage.Main
      
      java -cp lib.jar; com.mypackage.Main
      
      java -classpath ".:./lib/*" com.test.MyClass
      
      java -cp . [PACKAGE.]CLASSNAME
      
      java -cp . Hello
      
      java -cp . com.demo.Hello
      
      java  -classpath "C:\test" com.company.Main
      
      The term `ClassName` is not recognized as the name of a cmdlet, function, script ...
      
      java -cp 'someDependency.jar;.' ClassName
      
      javac HelloWorld.java
      
      java Helloworld.java
      
      <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>
      
      javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
      
      java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
      
      # 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
      
      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
      
      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