这些示例假定以下源结构:
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:\
here):
C:\>javac temp\compile-test\src\a\b\c\D.java
上述两个选项都会导致您的类文件在与源相同的文件夹中创建。 IE。:
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”,并提供完全限定类名 http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getName%28%29. I.e.:
C:\temp\compile-test\src>java a.b.c.D
Exception in thread "main" java.lang.NoSuchMethodError: main
注意我得到一个例外D
类没有 main 方法,因此无法运行。为了解决这个问题,我们添加了一个 main 方法:
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