2017-03-16 2 views
0

Projektstruktur hinzufügen:kann nicht Klasse im selben Paket zugreifen, ohne Classpath

./src/com/example/Test.java 
./src/com/example/Dog.java 

Test.java

package com.example; 

public class Test { 
    public void testing() { 
     Dog d = new Dog("Lab"); 
    } 

} 

Dog.java

package com.example; 

public class Dog { 
    private String breed; 

    Dog(String breed) { 
     this.breed = breed; 
    } 
} 

Es kompiliert erfolgreich, wenn ich versuche diese

.\src > javac com\example\Test.java

aber es funktioniert nicht, wenn ich dies tun

.\src > javac -cp "C:\Tomcat\lib\servlet-api.jar" com\example\Test.java

Mit diesem Fehler

error: cannot find symbol 
       Dog d = new Dog("Lab"); 
       ^
    symbol: class Dog 
    location: class Test 

Ich vermute, es ist, weil die vorhandenen Classpath überschrieben wird. Wie vermeide ich das?

Sie können aber auch mehr auf Detail erklären, warum nicht er, wenn es aus dem übergeordneten Verzeichnis \ src ausgeführt wird, wie dies

javac src\com\example\Test.java

ich die gleichen Fehler wie die mit Classpath bekommen.

Sorry für die Verwirrung.

Danke Jon Skeet für die Hilfe.

+0

Ich schlage vor, Sie schreiben dies als [mcve], die nur "Test.java" und "Dog.java" hat - der Servlet Teil ist fast sicher ein Red Hering. –

+0

Ich kann diesen Fehler nicht reproduzieren, indem ich das 'src'-Verzeichnis in den Klassenpfad gestellt habe. Sind Sie sicher, dass "C: \ Users \ AK051428 \ Desktop \ projects \ listener_test \ src" 'dasselbe ist wie nur' src'? Warum nicht einfach als 'src' angeben? –

+0

@JonSkeet Ich habe versucht, es zu minimieren und prägnant – user3600999

Antwort

0

Die Compiler Verzeichnisse auf dem Classpath als Quelle Stammverzeichnisse behandeln - mit anderen Worten, wenn sie versuchen, für die Klassen zu finden Paket com.example, wird es beiden Dateien Klasse und Quelle aus jedem Verzeichnis sucht auf dem in einem com/example Unterverzeichnis Klassenpfad.

Wenn Sie wie folgt zusammenstellen:

.\src > javac com\example\Test.java 

... die Classpath ist implizit "das aktuelle Verzeichnis".

Wenn Sie den Classpath explizit wie folgt angeben:

.\src > javac -cp "C:\Tomcat\lib\servlet-api.jar" com\example\Test.java 

... ist es nicht.Sie müssten . auf dem Classpath explizit hinzufügen:

.\src > javac -cp "C:\Tomcat\lib\servlet-api.jar";. com\example\Test.java 

Ähnlich, wenn Sie nicht insrc sind, dann würden Sie src als auf dem Classpath angeben:

. > javac -cp src src\com\example\Test.java 

Persönlich versuche ich sicherzustellen, dass alle Quellen, die ich kompilieren will, sowieso in javac aufgeführt sind - ansonsten ist es durchaus möglich, veraltete Klassendateien zu verwenden, anstatt den Quellcode neu zu kompilieren.

+0

Vielen Dank für die Erklärung. Nur um sicherzustellen, dass ich den letzten Teil verstehe, wenn ich nur sage. > javac src \ com \ example \ Test.java' ohne Klassenpfad, sucht sie nach dem Beispiel Dog.java in. \ com \ und nicht in. \ src \ com \ Beispiel, richtig? – user3600999

+0

und vielen Dank für Ihre Geduld und Hilfsbereitschaft. Du bist ein guter Mann: D – user3600999

-1
.\listener_test > javac -cp .;C:\Tomcat\lib\servlet-api.jar;"C:\Users\AK051428\Desktop\projects\listener_test\src" -d classes src\com\example\TestServlet.java 

Add;

0

Eine weitere mögliche Lösung "":

javac -cp C:\Tomcat\lib\servlet-api.jar -sourcepath C:\Users\AK051428\Desktop\projects\listener_test\src -d classes src\com\example\TestServlet.java

Das sagt jetzt javac, wo Ihr Quellbaum befindet.

+0

src Quellpfad hinzufügen oder Classpath tut diesen Trick, aber ich möchte wissen, warum es ohne das nicht funktioniert. – user3600999

Verwandte Themen