【问题标题】:How to run a .class file that is part of a package from cmd?如何从 cmd 运行作为包一部分的 .class 文件?
【发布时间】: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 才能工作。

标签: java class cmd package javac


【解决方案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:/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来执行。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2021-12-09
                    • 2016-01-23
                    • 1970-01-01
                    • 2019-08-08
                    • 2012-10-21
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多