te przykłady zakładają następującą strukturę źródło:
C:\temp\compile-test\src\a\b\c\D.java
Gdzie D.java jest:
package a.b.c;
public class D { }
Pierwszym problemem, nie można odczytać: myfile.java, to dlatego, że nie jest poprawne użycie opcji wiersza polecenia cp
wskazać do twojego kodu źródłowego.
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
ten powinien zamiast być następujące, gdzie javac
jest uruchamiany z folderu źródłowego, a możemy użyć względnych ścieżek do plików źródłowych (UWAGA - javac
jest uruchamiany z folderu źródłowego tutaj):
C:\temp\compile-test\src>javac a\b\c\D.java
Albo to, gdzie określamy pełne ścieżki do plików źródłowych, a javac
można uruchomić z dowolnego miejsca (uwaga - javac
prowadzony jest od C:\
tutaj):
C:\>javac temp\compile-test\src\a\b\c\D.java
Obie powyższe opcje spowodują, że pliki klas zostaną utworzone w tym samym folderze co źródło. To znaczy.:
C:\temp\compile-test\src\a\b\c\D.class
Dla drugiego problemu, jeśli spróbujesz uruchomić klasę, która ma nazwę pakietu z „wewnątrz” pakietu, spowoduje to nazwa jest nieprawidłowa (UWAGA - java
prowadzony od „wewnątrz” pakiet tutaj):
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.
Aby uruchomić klasę D
, powinieneś być w pakiecie „root” i dostarczyć Fully Qualified Class Name. Tj .:
C:\temp\compile-test\src>java a.b.c.D
Exception in thread "main" java.lang.NoSuchMethodError: main
Uwaga uzyskać wyjątek jako klasy D
nie posiada główną metodę, a więc nie można go uruchomić. Aby ustalić, dodajemy główne metody:
package a.b.c;
public class D {
public static void main(String[] args) {
System.out.println("main");
}
}
i ponownie uruchom:
C:\temp\compile-test\src>java a.b.c.D
main
Dzięki za wyjaśnienie :) cudownie jasny – sachin11