這些示例假設以下源結構:
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
類,你應該在包裝「根」,並提供Fully Qualified Class Name。即:
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
感謝您的奇妙明確的解釋:) – sachin11