Java 什么是;无法找到或加载主类“;什么意思?
新Java开发人员遇到的一个常见问题是,他们的程序无法运行,并显示错误消息:Java 什么是;无法找到或加载主类“;什么意思?,java,class,main,Java,Class,Main,新Java开发人员遇到的一个常见问题是,他们的程序无法运行,并显示错误消息:无法找到或加载主类… 这意味着什么,是什么导致了它,您应该如何修复它?java命令语法 首先,您需要了解使用java(或javaw)命令启动程序的正确方法 正常语法1是这样的: 但是,java命令的某些版本允许您使用斜杠而不是句点;e、 g packagename/packagename2/packagename3/ClassName 它(令人困惑地)看起来像一个文件路径名,但不是一个。请注意,术语完全限定名是
无法找到或加载主类…
这意味着什么,是什么导致了它,您应该如何修复它?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[])
提供的修饰符。(注意,方法参数的名称不是签名的一部分。)字符串[]
传递给它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
命令中使用包含包名的完整类名;e、 gjava
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
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
命令时生效的命令行和/或CLASSPATH环境变量。检查目录名和JAR文件名是否正确java
命令时有效的当前目录;
,其他平台上的类路径分隔符为:
。如果您的平台使用了错误的分隔符,您将不会收到明确的错误消息。相反,您将在路径上得到一个不存在的文件或目录,该文件或目录将被静默忽略。)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
- 在类路径中选择绝对路径名和相对路径名时,请仔细考虑。请记住,如果当前目录发生更改,相对路径名可能会“中断”
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
- 在大多数Java版本中,