如何从命令行执行java .class

时间:2009-08-14 18:52:30

标签: java

我有一个编译的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?

8 个答案:

答案 0 :(得分:105)

尝试:

java -cp . Echo "hello"

假设您编译为:

javac Echo.java 

然后有可能“class”目录不在你的类路径中(java查找.class定义)

如果是这种情况并列出你的目录内容:

Echo.java
Echo.class

然后任何一个都可行:

java -cp . Echo "hello"

SET CLASSPATH=%CLASSPATH;.  

java Echo "hello"

后来Fredrik指出你会收到另一条错误消息。

  

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

当发生这种情况时,去看看他的答案:)

答案 1 :(得分:15)

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

java -cp . Echo "hello"

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

答案 2 :(得分:15)

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

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

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

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

修改:请注意Oscar也是正确的,因为您遗失了。在你的类路径中,你会遇到我在处理完这个错误后解决的问题。

答案 3 :(得分:5)

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

相反,您可以执行以下操作:

> java MyApp.java

您不必事先进行编译,因为这一切都一步一步完成。

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

答案 4 :(得分:3)

可能有一些问题 - 这是一个可以帮助你入门的教程:Running Java as a Command Line Application

答案 5 :(得分:2)

我的情况有点复杂。对于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"

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

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

然后,我必须使用classname运行java。

java com.accessibility.HelloWorld 

答案 6 :(得分:1)

如果你有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薄荷,我希望在其他操作系统

感谢Stack溢出以获取大量信息。

答案 7 :(得分: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();