如何在命令行中执行Java的.class文件

135

我有一个已编译的 Java 类:

Echo.class

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.

如何以最简单的方式将我的Java代码转换成可以在命令行中运行而不是必须使用Eclipse IDE?


18
建议:也许最好不要编辑原始问题,以免在快速审核下使答案无效。看到正确的方法签名,然后看到一堆说它是错误的答案真的很奇怪。为了与正确版本进行比较,错误的代码应该保留下来。 - JSmyth
7个回答

135

尝试:

java -cp . Echo "hello"

假设你使用以下命令进行了编译:

javac Echo.java 

那么有可能"当前"目录不在你的类路径中(Java用来查找.class定义的位置)。

如果是这种情况,列出您的目录内容显示:

Echo.java
Echo.class

那么以下任何一种方式都可能有效:

java -cp . Echo "hello"
或者
SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

正如Fredrik所指出的那样,你将会得到另一个错误信息:

Exception in thread "main" java.lang.NoSuchMethodError: main

当这种情况发生时,请参考他的答案 :)


2
使用 -cp . 告诉 Java 应该将当前工作目录添加到类路径中,也就是代码所在的位置。 - Fredrik

43

有了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.

20

您需要指定类路径。这应该可以解决:

java -cp . Echo "hello"

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


19

你没有有效的主方法... 方法签名应该是: public static void main(String[] args);

因此,在你的情况下,代码应该像这样:

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

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

编辑: 请注意,Oscar 也是正确的,您的类路径中缺少“.”,在处理完该错误之后,您会遇到我解决的问题。


只有这一个能在更新的Java版本中给出正确的结果。 - undefined
请记住,这个帖子可以追溯到2009年 :-) - undefined

7
如果您在Java源代码中有以下内容:
package mypackage;

您的类是hello.java

public class hello {

而在那个hello.java文件中,你有以下内容:
 public static void main(String[] args) {

编译后,切换目录(cd)到您的hello.class所在的目录。

java -cp . mypackage.hello

请注意类名前的当前目录和包名。 它在我的Linux Mint上运行,希望在其他操作系统上也能运行。 感谢Stack Overflow提供了丰富的信息。

3
注意:应该通过./mypackage/hello.class名称找到类文件。另请参阅:“如何在命令行中运行带有包的Java程序?”问题。 - ruvim

3

我的情况有点复杂。因为我在JNI代码中使用了资源目录中的.dll文件,所以我需要进行三个步骤。我的文件如下:

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());

首先,我需要移动到类路径目录。

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

接下来,我需要更改classpath以指向当前目录,这样我的类就会被加载,我还需要更改classpath以指向资源目录,这样我的dll文件才会被加载。

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

接下来,我需要使用类名运行Java。

java com.accessibility.HelloWorld 

0

首先,您是否使用命令行javac编译器编译了该类?其次,似乎您的主方法具有不正确的签名 - 它应该接受一个字符串对象数组,而不仅仅是一个:

public static void main(String[] args){

一旦您将代码更改为接受字符串对象数组,那么您需要确保打印的是数组的元素,而不是数组本身:
System.out.println(args[0])

如果您想打印整个命令行参数列表,您需要使用循环,例如:
for(int i = 0; i < args.length; i++){
    System.out.print(args[i]);
}
System.out.println();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接