如何从 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.class
在C:/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
文件夹。然后再次运行javac
和java
。
【讨论】:
【参考方案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:/projects
java com.HelloWorld
(示例2在很多情况下都不起作用,例如java进程。)
如果没有包声明,会有一点变化。
1.java -cp c:/projects/com HelloWorld
2.cd c:/projects/com
java 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包?