到目前为止,我一直主要使用eclipse。现在我正在尝试从终端运行java,但我遇到了包的问题。
这是我的Main.java
文件:
package main;
class Main {
public static void main(String[] args) {
System.out.println("it's working");
}
}
我使用javac Main.java
进行编译,然后使用java Main
运行,这样就可以了:
java Main
Exception in thread "main" java.lang.NoClassDefFoundError: Main
Caused by: java.lang.ClassNotFoundException: Main
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: Main. Program will exit.
当我删除package Main
时,一切正常。我错过了什么?
java -version
给出:
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
答案 0 :(得分:6)
您需要在一个目录级别运行java命令并以完全限定的包名称提供它,例如:java main.Main
请参阅How the Java Launcher Finds User Classes了解其工作原理。
答案 1 :(得分:0)
您可以使用此命令:
java main.Main
确保main
(小写)包目录位于类路径上。
答案 2 :(得分:0)
您的类路径可能未正确设置。 由于您为.java文件提供了一个包,因此不再命名。
一个例子:
java -cp ./package1/ main.Main //from the current directory and
//if main package is contained in package1
您需要完全限定班级名称。 如果要从命令行运行以供将来参考,则必须在包级别停止间接(缺少更好的术语)。 假设您的课程在 package1.package2.Main.java 包中 我会这样运行 java -cp / blah / blah package1.package2.Main
答案 3 :(得分:0)
视窗:
javac main\Main.java
苹果:
javac main/Main.java
java main.Main
答案 4 :(得分:0)
如果添加package Main
,则必须将源文件放在Main / Main.java文件夹中。之后你可以编译。运行程序时,使用“cd”转到Main文件夹,然后写java -cp Main.Main
请参阅我的问题noclassdeffounderror
答案 5 :(得分:0)
试试这个......
在窗口中,您只需将代码编译为
javac - d。 Main.java
然后创建一个包含您在类中指定名称的包(文件夹)(在您的代码中,创建名称为“main”的包)在程序所在的同一路径中...
然后你只需运行程序 java main.Main 要么 java main / Main