从命令行运行Eclipse项目

8
我在使用命令行编译和运行Eclipse Java项目时,遇到了两个问题。在使用Eclipse IDE运行时一切正常。我尝试了谷歌搜索,但无法解决这个问题。非常感谢任何帮助。
问题1:当我尝试从不同于.java文件所在目录的位置进行编译时,会抛出“cannot read: myfile.java”的错误。但是如果我迁移到此目录,则可以编译通过。
我正在使用如下命令(位于其他目录时):
javac -cp C:\ABC\src\XYZ myfile.java
我在XYZ目录中执行的命令:
javac myfile.java
这将生成两个.class文件myfile.class和Testing_Thread.class(我猜测是因为我的代码中有一个线程)。
问题2:在进入目录并编译后,当我尝试运行程序时,即使我试图从XYZ目录运行,也会出现“Exception in thread "main" java.lang.NoClassDefFoundError: myfile (wrong name: XYZ/myfile.java)”的错误。我在其他地方尝试运行时也会出现相同的错误。
在XYZ目录中尝试的命令:
java myfile
在其他位置尝试的命令:
java -cp C:\ABC\src\XYZ myfile 如果有帮助,我还附加了目录结构的层次结构:
enter image description here
1个回答

8

以下示例假定有以下源码结构:

C:\temp\compile-test\src\a\b\c\D.java

D.java是指:

package a.b.c;

public class D { }

第一个问题,无法读取:myfile.java,是因为使用cp命令行选项指向源代码是不正确的。

C:\temp\compile-test\src>javac -cp c:\temp\compile-test\src\a\b\c D.java
javac: file not found: D.java
Usage: javac <options> <source files>
use -help for a list of possible options

应该改为以下形式,其中javac从您的源文件夹运行,我们可以使用相对路径到源文件(注意 - 这里javac是从源文件夹运行的):

C:\temp\compile-test\src>javac a\b\c\D.java

或者这样,我们指定源文件的完整路径,javac可以从任何地方运行(注意-这里javac是从C:\运行的):

C:\>javac temp\compile-test\src\a\b\c\D.java

以上两个选项都会导致您的类文件被创建在与源代码相同的文件夹中。例如:

C:\temp\compile-test\src\a\b\c\D.class

对于第二个问题,如果您尝试从“内部”包中运行具有包名称的类,则会导致名称错误(请注意 - 在此处“内部”运行java):

C:\temp\compile-test\src\a\b\c>java D
Exception in thread "main" java.lang.NoClassDefFoundError: D (wrong name: a/b/c/D)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: D.  Program will exit.

为了运行 D 类,你应该在 'root' 包中,并提供完全限定类名。例如:
C:\temp\compile-test\src>java a.b.c.D
Exception in thread "main" java.lang.NoSuchMethodError: main

注意,由于 D 类没有主方法,因此会出现异常,无法运行。为了解决这个问题,我们需要添加主方法:

package a.b.c;

public class D {
    public static void main(String[] args) {
        System.out.println("main");
    }
}

然后重新运行:

C:\temp\compile-test\src>java a.b.c.D
main

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接