新Java开发人员遇到的一个常见问题是,他们的程序无法运行并显示错误消息:Could not find or load main class ...
这是什么意思,是什么导致它,以及你应该如何解决它?
答案 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
命令执行以下操作:
com.acme.example.ListUsers
类的编译版本。main
方法,其中签名,返回类型和修饰符由public static void main(String[])
给出。 (注意,方法参数的名称是 NOT 签名的一部分。)String[]
传递给它。当您收到消息&#34;无法找到或加载主类...&#34;时,表示第一步失败。 java
命令无法找到该类。事实上,&#34; ...&#34;在消息中将是java
正在寻找的完全限定类名。
那么为什么它找不到这个班级呢?
第一个可能的原因是您可能提供了错误的类名。 (或者......正确的类名,但形式错误。)考虑到上面的例子,这里有各种错误的方法来指定类名:
示例#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
第二个可能的原因是类名是正确的,但java
命令找不到类。要理解这一点,您需要了解&#34; classpath&#34;的概念。 Oracle文档对 well 进行了解释:
所以......如果你正确指定了类名,接下来要检查的是你已经正确指定了类路径:
java
命令时生效的命令行和/或CLASSPATH环境变量。检查目录名称和JAR文件名是否正确。java
命令时生效的当前目录。;
,其他分类为:
。如果您的平台使用了错误的分隔符,则无法获得明确的错误消息。相反,您将获得路径上不存在的文件或目录将被忽略。)当您在类路径上放置目录时,它在概念上对应于限定名称空间的根目录。通过将完全限定名称映射到路径名,类位于该根目录下的目录结构中。例如,如果&#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将无法找到该类。
如果你的类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
注意:
-classpath
选项可以缩短为-cp
。查看java
,javac
等相应的手册条目。类路径需要包含应用程序所依赖的所有其他(非系统)类。 (系统类是自动定位的,你很少需要关注它。)为了正确加载主类,JVM需要找到:
(注意:JLS和JVM规范允许JVM加载类的某些范围&#34;懒惰&#34;,这会影响抛出类加载器异常的时间。)
偶尔会有人将源代码文件放入
源代码树中的错误文件夹,或者它们遗漏了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中指定。
典型的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)
帮助我的是在命令行上指定类路径,例如:
创建一个新文件夹C:\temp
在C:\temp
中创建文件Temp.java,其中包含以下类:
public class Temp {
public static void main(String args[]) {
System.out.println(args[0]);
}
}
在文件夹C:\temp
中打开命令行,并编写以下命令以编译Temp类:
javac Temp.java
运行已编译的Java类,添加-classpath
选项让JRE知道在哪里找到该类:
java -classpath C:\temp Temp Hello!
答案 6 :(得分:24)
根据错误消息(&#34;无法找到或加载主类&#34;),有两类问题:
如果在完全限定的类名中出现拼写错误或语法错误,或者在提供的类路径中不存在>>,则主要类无法找到 强>
当无法启动类时,主类无法加载,通常主类扩展另一个类,并且该类在提供的类路径中不存在。
例如:
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)
类文件位置: 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
生成强>
java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
答案 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
方法。答案 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;
答案 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中创建的演示程序遇到了这个问题。
有两个要点可以解决:
我的演示程序:
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
java
目录:cd ../projectRoot/src/main/java
javac ./io/rlx/tij/c2/Ex10.java
java io.rlx.tij.c2.Ex10
如果我在../projectRoot/src/main/java/io/rlx/tij/c2
中运行程序,或者在没有程序包名称的情况下运行程序,则会收到此错误:Error: Could not find or load main class
。
答案 36 :(得分:1)
答案 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:
然后转到模块:
servlet模块附近有一个Provided范围。我将其更改为“编译”:
成功了!
答案 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)
答案 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
答案 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
答案 43 :(得分:0)
答案 44 :(得分:0)
默认情况下,Java使用当前工作目录.
作为默认CLASSPATH
。这意味着当您在提示符下键入命令时,例如java MyClass
,该命令被解释为您具有类型java -cp . MyClass
。您是否在-cp
和MyClass
之间看到了这个点? ( 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)
右键单击该项目。
这对我有用。谢谢
答案 49 :(得分:-1)
有关外部库的答案-
编译:
javac -cp ./<external lib jar>: <program-name>.java
执行:
java -cp ./<external lib jar>: <program-name>
上述方案在osx和linux系统中效果很好。注意类路径中的:
答案 50 :(得分:-1)
在阅读完所有答案后,我注意到大多数人都没有为我工作。所以我做了一些研究,这就是我得到的。只有在第1步无效的情况下才能尝试。
打开转到 C:\ Program Files(x86)\ Java 或 C:\ Program Files \ Java
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变量 并将其粘贴在那里。
答案 51 :(得分:-1)
好像我遇到这个问题时,它很独特。
一旦我删除了文件顶部的包声明,它就完美无缺。
除此之外,似乎没有任何方法可以在我的机器上运行简单的HelloWorld.java,无论编译发生在哪个文件夹,CLASSPATH或PATH,参数或文件夹调用。
答案 52 :(得分:-2)
如果它是Maven项目
问题应该解决了。
答案 53 :(得分:-2)
答案 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'
)
}
}