42

当我成为.classa 的一部分package并尝试从 cmd 运行它时,我不断收到错误。

这是使用javac然后使用java之后的代码:

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

然后是不起作用的代码:

package com;

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

尝试通过命令运行程序后给我这个错误java HelloWorld

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong nam
e: com/HelloWorld)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    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 sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

这是我到目前为止尝试做的事情:

java -cp . HelloWorld
java -cp . com.HelloWorld
java -cp . com/HelloWorld
java HelloWorld
java com.HelloWorld
java com/HelloWorld

请记住,javac返回时没有错误,只需删除即可package com;解决问题。有时在其他情况下,我会收到一个错误,指出找不到主类文件或类似的东西。

我究竟做错了什么?

4

12 回答 12

38

假设你做了cd C:/projects并且HelloWorld.classC:/projects/com,那么只需输入:

java com.HelloWorld
于 2013-08-09T03:54:42.813 回答
16

包与文件的预期目录位置直接相关。

也就是说,如果您有一个带有 package 指令的源文件com,则预计该文件将存在于com目录中。

在您的HelloWorld示例中,预计该HelloWorld.java文件将存储在com目录中,例如com\HelloWorld.java

当你编译文件时,它会HelloWorld.classcom目录中创建一个类文件,比如com\HelloWorld.class

这样,当 Java 去寻找com.HelloWorld类时,它实际上会搜索它的类路径并附com\HelloWorld.class加到它,直到它找到你的类文件或用完类路径

例子

HelloWorld.java所以,我将您的(带包)示例复制到C:\java\com\HelloWord.java

从命令行,我更改为C:\java目录...

C:\java>dir com
 Volume in drive C is OS
 Volume Serial Number is ####-####

 Directory of C:\java\com

09/08/2013  01:55 PM    <DIR>          .
09/08/2013  01:55 PM    <DIR>          ..
09/08/2013  01:55 PM               135 HelloWorld.java

然后我编译了HelloWorld.java

C:\java>javac com\HelloWorld.java

然后我跑了...

C:\java>java com.HelloWorld
Hello World!

您可能想阅读教程

于 2013-08-09T03:54:51.603 回答
4

语法是:

java -classpath /path/to/package-folder <packageName>.<MainClassName>

java com.HelloWorld因此,您可以尝试:com/HelloWorld.class默认情况下,文件将作为类路径存在,指向当前目录(如果未指定)。

如果您在不同的文件夹中,请尝试指定classpath

$ CLASSPATH=/path/to/package-folder/ java com.HelloWorld
Hello World!
$ java -cp /path/to/package-folder/ com.HelloWorld
Hello World!
$ cd /path/to/package-folder/ && java com.HelloWorld
Hello World!

如需进一步说明,请查看:如何运行 Java .class 文件?

于 2015-12-10T23:03:30.063 回答
3

从com目录的父目录运行程序。

java com.HelloWorld
于 2013-08-09T03:56:09.633 回答
3

假设文件位于 C:/projects/com/HelloWorld ,您可以尝试以下方法。

1.java -cp c:/projects com.HelloWorld

2. cd c:/projects
 java com.HelloWorld
(示例2在很多情况下都不起作用,例如java进程。)

如果没有包声明,会有一点变化。

1.java -cp c:/projects/com HelloWorld

2. cd c:/projects/com
 java HelloWorld
(同样的原因不好。)

或者,相对路径可以,但有一些风险。最后记得把类文件放在 cmd 的末尾。

于 2017-06-07T07:07:19.667 回答
2

当您编译java代码时,使用-d,在您的情况下,它将是

javac -d . com.HelloWorld.java

在上面的命令之后,java编译器会生成一个名为“com”的文件夹,在“com”文件夹下,你会看到你的HelloWorld.class

然后在运行 javac 的同一文件夹下,运行以下命令

java com.HelloWorld
于 2017-05-03T17:40:46.173 回答
1

在 Java 文件夹下创建一个名为的com文件夹并将其HelloWorld.java放入com文件夹中。然后再次运行javacjava.

于 2013-08-09T04:04:52.483 回答
1

当您直接从“*.class”文件的文件夹中执行“java”命令时,可能会出现这样的问题。此命令应从项目“父”目录执行。在下面的文章中很好地解释了一切:

http://javarevisited.blogspot.de/2015/04/error-could-not-find-or-load-main-class-helloworld-java.html

于 2017-03-08T10:53:58.213 回答
0

尝试使用绝对目录或将您的 HelloWorld.class 放入 ..\last_directory\com

1. java -cp .......\last_directory com.HelloWorld
2. java -cp .......\last_directory HelloWorld(with created com)
于 2013-08-09T03:55:27.150 回答
0

运行 java 类时不需要 -cp 标志,运行二进制(jar)文件中的类或主程序时需要 -cp 标志。从命令行运行主程序时,您需要确保该类与 java 文件中的包名称位于相同的文件夹结构中,例如。

home/user/foo java com.test.className   

here classNmae class file and exist under home/user/foo/com/test

希望能帮助到你。

于 2017-01-02T04:50:42.193 回答
0

Linux中的简单解决方案,原理相同:

说,文件是/work/packageName/file.java,第一行:

package packageName;

在工作目录下/work/packageName/*

javac file.java只要包含对该包中其他文件的任何引用,它将不起作用。file.java解决方案是使用这个:

javac --class-path  ../  file.java

或者升到 1 级/work/*并运行:

javac  ./packageName/Member.java

或者干脆使用java代替javac来执行。

于 2020-05-18T09:11:34.747 回答
-2

您应该首先通过在 CMD 中键入此命令来编译它,例如您的文件位于 c:\ 目录中:

C:\com>javac HelloWorld.java

之后,您可以通过键入以下内容运行结果:

c:\com>java HelloWorld
于 2013-08-09T04:22:26.723 回答