Ste*_*n C 1277 java program-entry-point class
新Java开发人员遇到的一个常见问题是,他们的程序无法运行错误消息:  Could not find or load main class ...
这是什么意思,是什么导致它,你应该如何解决它?
Ste*_*n C 1145
java <class-name>命令语法首先,您需要了解使用java(或javaw)命令启动程序的正确方法.
正常的语法1是这样的:
    java [ <option> ... ] <class-name> [<argument> ...]
Run Code Online (Sandbox Code Playgroud)
where <option>命令行选项(以" - "字符开头)<class-name>是一个完全限定的Java类名,<argument>是一个传递给应用程序的任意命令行参数.
1  - "可执行"JAR文件有第二种语法,我将在底部描述.
该类的完全限定名称(FQN)通常按照Java源代码编写; 例如
    packagename.packagename2.packagename3.ClassName
Run Code Online (Sandbox Code Playgroud)
但是,该java命令的某些版本允许您使用斜杠而不是句点; 例如
    packagename/packagename2/packagename3/ClassName
Run Code Online (Sandbox Code Playgroud)
其中(令人困惑)看起来像文件路径名,但不是一个.请注意,术语完全限定名称是标准Java术语...而不是我只是让你迷惑的东西:-)
以下是java命令应该是什么样子的示例:
    java -Xmx100m com.acme.example.ListUsers fred joe bert
Run Code Online (Sandbox Code Playgroud)
以上将导致java命令执行以下操作:
com.acme.example.ListUsers该类的编译版本.main具有签名,返回类型和修饰符给出的方法public static void main(String[]).(注意,方法参数的名称不是签名的一部分.)String[].当您收到消息"无法找到或加载主类..."时,这意味着第一步失败.该java命令无法找到该类.事实上,在"..."的消息将是完全合格的类名是java所期待的.
那么为什么它无法找到班级呢?
第一个可能的原因是您可能提供了错误的类名.(或者......正确的类名,但形式错误.)考虑到上面的例子,这里有各种错误的方法来指定类名:
示例#1 - 一个简单的类名:
java ListUser
Run Code Online (Sandbox Code Playgroud)
当在类包中声明类时com.acme.example,必须在命令中使用包含包名的完整类名java; 例如
java com.acme.example.ListUser
Run Code Online (Sandbox Code Playgroud)示例#2 - 文件名或路径名而不是类名:
java ListUser.class
java com/acme/example/ListUser.class
Run Code Online (Sandbox Code Playgroud)示例#3 - 包含错误的类名称:
java com.acme.example.listuser
Run Code Online (Sandbox Code Playgroud)例#4 - 拼写错误
java com.acme.example.mistuser
Run Code Online (Sandbox Code Playgroud)示例#5 - 源文件名
java ListUser.java
Run Code Online (Sandbox Code Playgroud)示例#6 - 您完全忘记了类名
java lots of arguments
Run Code Online (Sandbox Code Playgroud)第二个可能的原因是类名是正确的,但java命令找不到类.要理解这一点,您需要了解"类路径"的概念.Oracle文档很好地解释了这一点:
java命令的文档所以......如果你已经正确指定了类名,那么接下来要检查的是你已经正确地指定了类路径:
java命令时生效的命令行和/或CLASSPATH环境变量.检查目录名称和JAR文件名是否正确.java命令时生效的当前目录.;在Windows和:其他组件上.如果您的平台使用了错误的分隔符,则不会收到明确的错误消息.相反,您将在路径上获得一个不存在的文件或目录,将被忽略.)将目录放在类路径上时,它在概念上对应于限定名称空间的根目录.通过将完全限定名称映射到路径名,类位于该根下的目录结构中.因此,例如,如果"/ usr/local/acme/classes"在类路径上,那么当JVM查找被调用的类时com.acme.example.Foon,它将查找具有此路径名的".class"文件:
  /usr/local/acme/classes/com/acme/example/Foon.class
Run Code Online (Sandbox Code Playgroud)
如果你在类路径上放了"/ usr/local/acme/classes/com/acme/example",那么JVM将无法找到该类.
如果您的类是FQN com.acme.example.Foon,那么JVM将在"com/acme/example"目录中查找"Foon.class":
如果您的目录结构与上面的模式的包命名不匹配,则JVM将找不到您的类.
如果您尝试通过移动来重命名一个类,那么它也将失败...但异常堆栈跟踪将是不同的.
举一个具体的例子,假设:
com.acme.example.Foon上课,/usr/local/acme/classes/com/acme/example/Foon.class,/usr/local/acme/classes/com/acme/example/,然后:
Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
Run Code Online (Sandbox Code Playgroud)
笔记:
-classpath选项可以缩短为-cp.检查相应的手册条目java,javac依此类推.类路径需要包含应用程序所依赖的所有其他(非系统)类.(系统类是自动定位的,你很少需要关注它.)为了正确加载主类,JVM需要找到:
(注意:JLS和JVM规范允许JVM"延迟"加载类的某些范围,这可能会影响何时抛出类加载器异常.)
偶尔会有人将源代码文件放入其源代码树中的错误文件夹中,或者他们忽略了package声明.如果您在IDE中执行此操作,IDE的编译器将立即告诉您.同样,如果您使用一个不错的Java构建工具,该工具javac将以检测问题的方式运行.但是,如果您手动构建Java代码,则可以使编译器不会注意到问题,并且生成的".class"文件不在您期望的位置.
有很多东西要检查,很容易错过一些东西.尝试将该-Xdiag选项添加到java命令行(之后的第一件事java).它将输出关于类加载的各种内容,这可以为您提供关于真正问题的线索.
另外,请考虑从网站,文档等复制和粘贴不可见或非ASCII字符可能导致的问题.并考虑"同性恋",两个字母或符号看起来相同......但不是.
java -jar <jar file>语法用于"可执行"JAR文件的替代语法如下:
# 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
Run Code Online (Sandbox Code Playgroud)
例如
  java [ <option> ... ] -jar <jar-file-name> [<argument> ...]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,入口点类(即com.acme.example.ListUser)的名称和类路径在JAR文件的MANIFEST中指定.
典型的Java IDE支持在IDE JVM本身或子JVM中运行Java应用程序.这些通常不受此特殊异常的影响,因为IDE使用自己的机制来构造运行时类路径,标识主类并创建java命令行.
但是,如果您在IDE后面执行操作,则仍可能发生此异常.例如,如果您之前在Eclipse中为Java应用程序设置了应用程序启动器,然后在不告知Eclipse的情况下将包含"main"类的JAR文件移动到文件系统中的其他位置,Eclipse将无意中启动JVM使用不正确的类路径.
简而言之,如果您在IDE中遇到此问题,请检查旧的IDE状态,损坏的项目引用或损坏的启动程序配置等内容.
IDE也可能简单地混淆.IDE是非常复杂的软件,包含许多交互部分.其中许多部分采用各种缓存策略,以使IDE作为一个整体响应.这些有时可能会出错,一种可能的症状是启动应用程序时出现问题.如果您怀疑可能发生这种情况,则值得重新启动IDE.
pan*_*oet 229
如果您的源代码名称是HelloWorld.java,那么您的编译代码将是HelloWorld.class.
如果您使用以下方法调用它,您将收到该错误:
java HelloWorld.class
Run Code Online (Sandbox Code Playgroud)
相反,使用这个:
java HelloWorld
Run Code Online (Sandbox Code Playgroud)
        tha*_*ane 130
如果您的类在包中,那么您必须到cd主目录并使用类的全名运行(packageName.MainClassName).
例:
我的课程在这里:
D:\project\com\cse\
Run Code Online (Sandbox Code Playgroud)
我的主要课程的全名是:
com.cse.Main
Run Code Online (Sandbox Code Playgroud)
所以我cd回到主目录:
D:\project
Run Code Online (Sandbox Code Playgroud)
然后发出java命令:
java com.cse.Main
Run Code Online (Sandbox Code Playgroud)
        M-R*_*avi 59
如果您的main方法位于包下的类中,则应该在层次结构目录上运行它.
假设有一个源代码文件(Main.java):
package com.test;
public class Main {
    public static void main(String[] args) {
        System.out.println("salam 2nya\n");
    }
}
Run Code Online (Sandbox Code Playgroud)
要运行此代码,您应该放在package类似目录的包中packageName.MainClassName.并在根目录中使用Main.Class.
Ena*_*san 44
当相同的代码在一台PC上工作,但它在另一台PC上显示错误时,我发现的最佳解决方案是编译如下:
javac HelloWorld.java
java -cp . HelloWorld
Run Code Online (Sandbox Code Playgroud)
        Cel*_*bes 34
帮助我的是在命令行上指定类路径,例如:
新建一个文件夹, C:\temp
创建文件Temp.java C:\temp,其中包含以下类:
public class Temp {
    public static void main(String args[]) {
        System.out.println(args[0]);
    }
}
Run Code Online (Sandbox Code Playgroud)在文件夹中打开命令行C:\temp,并编写以下命令以编译Temp类:
javac Temp.java
Run Code Online (Sandbox Code Playgroud)运行已编译的Java类,添加-classpath选项让JRE知道在哪里找到类:
java -classpath C:\temp Temp Hello!
Run Code Online (Sandbox Code Playgroud)Xia*_*com 25
根据错误消息("找不到或加载主类"),有两类问题:
主类不能被发现时有错字或错误的语法完全限定类名,或者没有在所提供的类路径中存在.
当无法启动类时,无法加载主类,通常主类扩展另一个类,并且该类在提供的类路径中不存在.
例如:
public class YourMain extends org.apache.camel.spring.Main
Run Code Online (Sandbox Code Playgroud)
如果未包含camel-spring,则会报告此错误.
Yam*_*1sp 16
在这种情况下我遇到了这样的错误:
java -cp lib.jar com.mypackage.Main
Run Code Online (Sandbox Code Playgroud)
它适用;于Windows和:Unix:
java -cp lib.jar; com.mypackage.Main
Run Code Online (Sandbox Code Playgroud)
        Edu*_*nis 15
有时可能导致问题的原因与主要课程无关,我必须以艰难的方式找到它.它是我移动的引用库,它给了我:
无法找到或加载主类xxx Linux
我刚刚删除了该引用,再次添加它,它再次正常工作.
sha*_*ILU 15
使用此命令:
java -cp . [PACKAGE.]CLASSNAME
Run Code Online (Sandbox Code Playgroud)
示例:如果您的类名是从Hello.java创建的Hello.class,则使用以下命令:
java -cp . Hello
Run Code Online (Sandbox Code Playgroud)
如果你的文件Hello.java在包com.demo中,那么使用下面的命令
java -cp . com.demo.Hello
Run Code Online (Sandbox Code Playgroud)
对于JDK 8,很多时候,类文件出现在同一个文件夹中,但java命令需要classpath,因此我们添加-cp .以当前文件夹作为classpath的引用.
我遇到了同样的问题,最后发现了我的错误:)我使用了此命令进行编译,并且可以正常工作:
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
Run Code Online (Sandbox Code Playgroud)
但是此命令对我不起作用(我找不到或加载主类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
Run Code Online (Sandbox Code Playgroud)
最后,我只是在类路径的末尾添加了':'字符,问题得以解决:
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
Run Code Online (Sandbox Code Playgroud)
        我花了相当多的时间试图解决这个问题.我以为我是以某种方式错误地设置我的类路径,但问题是我键入:
java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool  
Run Code Online (Sandbox Code Playgroud)
代替:
java -cp C:/java/MyClasses utilities/myapp/Cool   
Run Code Online (Sandbox Code Playgroud)
我认为完全限定的含义意味着包括完整的路径名而不是完整的包名.
这里的所有答案似乎都是针对Windows用户的。对于Mac,classpath分隔符是:,不是;。由于设置类路径使用时;未抛出错误,因此如果从Windows到Mac,则很难发现。
这是相应的Mac命令:
java -classpath ".:./lib/*" com.test.MyClass
Run Code Online (Sandbox Code Playgroud)
在此示例中,程序包所在的位置com.test以及lib类路径中还将包含一个文件夹。
类文件位置: C:\ test\com\company
文件名: Main.class
完全限定的类名: com.company.Main
命令行命令:
java  -classpath "C:\test" com.company.Main
Run Code Online (Sandbox Code Playgroud)
请注意,类路径不包含\ com\company
java当使用 Windows PowerShell 中公布的选项运行时,-cp您可能会收到类似以下内容的错误:
The term `ClassName` is not recognized as the name of a cmdlet, function, script ...
Run Code Online (Sandbox Code Playgroud)
为了让 PowerShell 接受该命令,-cp选项的参数必须包含在引号中,如下所示:
java -cp 'someDependency.jar;.' ClassName
Run Code Online (Sandbox Code Playgroud)
以这种方式形成命令应该允许 Java 正确处理类路径参数。
如果您的情况与我的情况特别相似,这可能对您有所帮助:作为初学者,当我尝试运行Java程序时,我也遇到了这个问题.
我编译它像这样:
javac HelloWorld.java
Run Code Online (Sandbox Code Playgroud)
我也尝试使用相同的扩展名运行:
java Helloworld.java
Run Code Online (Sandbox Code Playgroud)
当我删除.java并重写命令时java HelloWorld,程序运行完美.:)
小智 5
首先使用此命令设置路径;
set path="paste the set path address"
Run Code Online (Sandbox Code Playgroud)
然后,您需要加载程序。在存储的驱动器中键入“ cd(文件夹名称)”并进行编译。例如,如果我的程序存储在D驱动器上,则键入“ D:”,然后按Enter键并键入“ cd(文件夹名称)”。
在 Windows 上.;,将 CLASSPATH 值放在开头。
这 。(点)的意思是“在当前目录中查找”。这是一个永久的解决方案。
您也可以使用 set 将其设置为“一次” CLASSPATH=%CLASSPATH%;.。只要您的 cmd 窗口打开,这就会持续。
这是一个特定的案例,但由于我来到此页面寻找解决方案并没有找到,我将其添加到此处。
Windows(用 7 测试)不接受á类和包名称中的特殊字符(如)。不过,Linux 确实如此。
当我.jar在 NetBeans 中构建一个并尝试在命令行中运行它时,我发现了这一点。它在 NetBeans 中运行,但不在命令行中运行。
解决我的问题的原因是:
右键单击要运行的项目/类,然后单击Run As-> Run Configurations。然后,您应该修复现有配置或通过以下方式添加新配置:
打开Classpath选项卡,单击Advanced...按钮,然后添加项目的bin文件夹。
如果您使用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>
Run Code Online (Sandbox Code Playgroud)
        我在测试 Java MongoDB JDBC 连接时也遇到了类似的错误。我认为简短地总结我的最终解决方案是很好的,以便将来任何人都可以直接查看这两个命令,并有利于进一步进行。
假设您位于 Java 文件和外部依赖项(JAR 文件)所在的目录中。
编译:
javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
Run Code Online (Sandbox Code Playgroud)
跑步:
java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
Run Code Online (Sandbox Code Playgroud)
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2520525 次  |  
        
|   最近记录:  |