如何从命令行执行Java .class


113

我有一个编译的Java类:

回声类

public class Echo {
    public static void main (String arg) {

            System.out.println(arg);
    }
}

cd到目录并输入:java Echo "hello"

我收到此错误:

C:\Documents and Settings\joe\My Documents\projects\Misc\bin>java Echo "hello"
Exception in thread "main" java.lang.NoClassDefFoundError: Echo
Caused by: java.lang.ClassNotFoundException: Echo
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: Echo.  Program will exit.

以必须可以使用Eclipse IDE的方式从命令行运行我的Java代码的最简单方法是什么?


14
建议:在快速回顾下,最好不要修改原始问题,以免使答案无效。真的很奇怪,看到正确的方法签名,然后看到一堆答案,说这是不正确的。为了与正确版本进行比较,至少应该保留错误代码。
JSmyth 2014年

Answers:


119

尝试:

java -cp . Echo "hello"

假设您使用:

javac Echo.java 

然后就有可能“当前”目录不在您的类路径中(java在其中寻找.class定义)

如果是这样,并列出目录的内容,则显示:

Echo.java
Echo.class

然后,任何一种方法都可以工作:

java -cp . Echo "hello"

要么

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

后来正如Fredrik指出的那样,您还会收到另一条错误消息。

线程“主”中的异常java.lang.NoSuchMethodError:主

发生这种情况时,请去阅读他的答案:)


2
-cp。告诉Java他应该加。(当前工作目录)到类路径,即他正在查找代码的位置。
弗雷德里克(Fredrik),

16

您需要指定类路径。应该这样做:

java -cp . Echo "hello"

这告诉java使用.(当前目录)作为其类路径,即查找类的位置。请注意,使用包时,类路径必须包含根目录,而不是包子目录。例如,如果您的类是my.package.Echo.class文件bin/my/package/Echo.class,则正确的类路径目录是bin


15

您没有有效的main方法...签名应为:public static void main(String [] args);

因此,在您的情况下,代码应如下所示:

public class Echo {
    public static void main (String[] arg) {

            System.out.println(arg[0]);
    }
}

编辑:请注意,奥斯卡也是对的,因为您不见了。在您的类路径中,处理该错误后,您将遇到我解决的问题。


15

使用Java 11,您将不必再经历这个繁琐的工作了!

相反,您可以这样做:

> java MyApp.java

您无需事先进行编译,因为所有操作都只需一步即可完成。

您可以在此处获取Java 11 JDK:JDK 11 GA版本


>复制C:\ Desenv \ workspaceServer \ TestProject \ src \ WebServiceStandAlone \ MyApp.java。/ y && javac MyApp.java && java -cp。MyApp && del MyApp.class && del MyApp.java有些人确实喜欢老式的方式=)
Jr.

3

如果您在Java源代码中

package mypackage;

并且您的类是hello.java与

public class hello {

在那个hello.java中,

 public static void main(String[] args) {

然后(在编译后)将changeDir(cd)转到hello.class所在的目录。然后

java -cp . mypackage.hello

在类名之前注意当前目录和包名。它适用于我的Linux Mint,也希望适用于其他OS

感谢Stack Overflow提供了大量信息。


1
注意:该类文件应可通过./mypackage/hello.class名称找到。另请参阅:“ 从命令行在程序包中运行Java ”问题。
ruvim

2

我的情况有点复杂。自从我在资源目录中使用.dll进行JNI代码以来,我必须执行三个步骤。我的文件是

S:\Accessibility\tools\src\main\resources\dlls\HelloWorld.dll
S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.class

我的代码包含以下行

System.load(HelloWorld.class.getResource("/dlls/HelloWorld.dll").getPath());

首先,我必须移至classpath目录

cd /D "S:\Accessibility\tools\src\test\java"

接下来,我必须更改类路径以指向当前目录,以便加载我的类,并且我必须更改类路径以指向他的资源目录,以便加载我的dll。

set classpath=%classpath%;.;..\..\..\src\main\resources; 

然后,我必须使用类名运行Java。

java com.accessibility.HelloWorld 

0

首先,您是否使用命令行javac编译器编译了该类?其次,似乎您的main方法的签名不正确-它应该采用String对象的数组,而不只是一个:

public static void main(String[] args){

一旦更改了代码以接受String对象的数组,则需要确保要打印的是数组的元素,而不是数组本身:

System.out.println(args[0])

如果要打印整个命令行参数列表,则需要使用循环,例如

for(int i = 0; i < args.length; i++){
    System.out.print(args[i]);
}
System.out.println();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.