新Java开发人员遇到的一个常见问题是,他们的程序无法运行,并显示错误消息:无法找到或加载主类。。。
这意味着什么,是什么导致的,你应该如何解决?
新Java开发人员遇到的一个常见问题是,他们的程序无法运行,并显示错误消息:无法找到或加载主类。。。
这意味着什么,是什么导致的,你应该如何解决?
当前回答
好吧,已经有很多答案了,但没有人提到文件权限可能是罪魁祸首。
运行时,用户可能无法访问JAR文件或路径的某个目录。例如,考虑:
/dir1/dir2/dir3/myjar.Jar中的Jar文件
拥有JAR文件的用户1可以执行以下操作:
# 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仍然会发生错误。
其他回答
使用关键字“package”
如果源代码中有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放在类似于包的目录中:
C: \Users\workspace\testapp.com\test\Main.Java
然后将终端的当前目录更改为项目的根目录:
cd C:\Users\workspace\testapp
最后,运行代码:
java com.test.Main
没有关键字“package”
如果您的源代码名称中没有任何包,那么可能是您使用了错误的命令。假设您的Java文件名为Main.Java,编译后:
javac Main.java
编译后的代码将是Main.class
如果使用以下方法调用它,则会出现该错误:
java Main.class
相反,请使用以下方法:
java Main
首先使用此命令设置路径;
set path="paste the set path address"
然后需要加载程序。在存储的驱动器中键入“cd(文件夹名)”并编译它。例如,如果我的程序存储在D驱动器上,请键入“D:”,然后按enter键并键入“cd”(文件夹名称)。
您确实需要从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
如果源代码名为HelloWorld.java,则编译代码将为HelloWorld.class。
如果使用以下方法调用它,则会出现该错误:
java HelloWorld.class
相反,请使用以下方法:
java HelloWorld
排除以下文件解决了问题。
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'
)
}
}