如何从 cmd 运行作为包一部分的 .class 文件?

Posted

技术标签:

【中文标题】如何从 cmd 运行作为包一部分的 .class 文件?【英文标题】:How to run a .class file that is part of a package from cmd? 【发布时间】:2013-08-10 23:26:03 【问题描述】:

当我将我的.class 作为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; 即可解决问题。有时在其他情况下,我会收到一条错误消息,提示找不到主类文件或类似的内容。

我做错了什么?

【问题讨论】:

HelloWord 住在哪里?它是否存在于com/ 目录中? 我认为您没有“com”文件夹。 它位于我创建的目录 C:\java 中,其中有 HelloWorld.java 和 HelloWorld.class 让我尝试将目录重命名为包名,看看会发生什么 问题现已解决。原来我使用的是包文件夹中的 java 命令,我必须向后 cd 才能工作。 【参考方案1】:

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

java com.HelloWorld

【讨论】:

文件现在位于 C:\com。当我尝试你的命令时,它说: 错误:无法找到或加载主类 com.HelloWorld 此时您必须进入 C:\,而不是 C:\com。换句话说,您需要尝试从包目录之外运行它。 但是为什么要从外面跑。怎么能从里面跑?【参考方案2】:

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

也就是说,如果您有一个带有com 包指令的源文件,那么该文件应该位于com 目录中。

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

编译文件时,会在com目录下创建一个名为HelloWorld.class的类文件,如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!

您可能想阅读Packages 教程

【讨论】:

文件现在位于 C:\com。当我使用“java HelloWorld”时问题是一样的,当我尝试像@sbat 建议的“java com.HelloWorld”时它找不到或加载主类。 好的。你试过我的例子吗?您可以将C:\java\com 替换为C:\com,因为正如我所演示的,它工作正常... 有一个错字。你的意思是说生活,但说的是生活【参考方案3】:

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

1. java -cp .......\last_directory com.HelloWorld
2. java -cp .......\last_directory HelloWorld(with created com)

【讨论】:

【参考方案4】:

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

java com.HelloWorld

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

你应该首先在 CMD 中输入这个命令来编译它,例如你的文件在 c:\ 目录中:

C:\com>javac HelloWorld.java

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

c:\com>java HelloWorld

【讨论】:

【参考方案7】:

语法是:

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!

更多解释请查看:How do I run Java .class files?

【讨论】:

【参考方案8】:

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

home/user/foo java com.test.className   

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

希望对你有帮助。

【讨论】:

【参考方案9】:

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

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

【讨论】:

【参考方案10】:

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

javac -d . com.HelloWorld.java

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

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

java com.HelloWorld

【讨论】:

对我来说工作:javac -d HelloWord.java 然后 -> java com.HelloWorld【参考方案11】:

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

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

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

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

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

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

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

【讨论】:

【参考方案12】:

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

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

package packageName;

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

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

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

或者上一级到/work/* 并运行:

javac  ./packageName/Member.java

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

【讨论】:

以上是关于如何从 cmd 运行作为包一部分的 .class 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将“=”作为参数的一部分从 Windows 的 bit-bash 传递给 .cmd 或 .bat 文件

java 使用cmd javac编译class时怎么指定外部jar包?

如何使用 sbtosgi 生成 osgi 包作为 sbt 发布任务的一部分

如何在Linux下运行java的.class文件

如何运行 *.class 的文件

怎样在cmd中,将java打包为jar包~