2013-06-17 8 views
15

sind ich mehrere Dateien in einem Verzeichnis (javac * .java), aber ich habe ein Problem, wenn ich dies zu tun versuchen bin Kompilieren:, wie mehrere Java-Dateien kompilieren, wenn es Java-Dateien in anderen Paketen

ich kompilieren erhalten Fehler sagen, dass sagen, dass JavaC ein Symbol eines Objekts nicht finden kann.

Ich habe mehrere Pakete, die Java-Dateien enthalten, die zum Ausführen des Hauptprogramms benötigt werden. Aber es scheint, dass der Versuch, diese einzeln zu kompilieren, nicht funktioniert. Es läuft gut in meiner IDE, aber ich bin interessiert zu erfahren, wie es über die Eingabeaufforderung getan wird.

Das Hauptprogramm befindet sich im Treiberordner.

Ich habe versucht, die Dateien in der Reihenfolge der Abhängigkeit zu kompilieren, aber das hat nicht geklappt. this is a screenshot of the folders

+0

Wenn Sie in 'argfile' die Liste aller zu kompilierenden Dateien haben, können Sie [' javac @ argfile'] ausführen (http://docs.oracle.com/javase/7/docs/technotes/tools/ windows/javac.html # commandlinearegfile). Wenn Sie andere Bibliotheken verwenden, müssen Sie den Klassenpfad hinzufügen. – Alberto

+0

Wenn ich etwas wie die Bearbeitung des Klassenpfadnamens (in diesem Fall) mache, wo soll ich es tun und wie? Ich habe gehört, dass das in der Manifest-Datei gemacht wird, aber ich weiß, dass es auch in den OS-Einstellungen gemacht werden kann. – OKGimmeMoney

+0

Sie können die Klassenpfadabhängigkeit über die Option '-classpath' hinzufügen, beispielsweise:' javac -classpath \ examples; \ lib \ Banners.jar \ examples \ greetings \ Hi.java'. Sehen Sie sich http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html und http://docs.oracle.com/javase/7/docs/technotes/tools/windows/ an. Classpath.html. – Alberto

Antwort

19

Javac liefert alle notwendigen Informationen. Es kann jedoch nützlich sein, Ant oder Maven für Befehlszeilen-Builds zu verwenden.

This Seite bietet ein gutes Beispiel für die Verwendung von zuerst javac und dann Ant zum Erstellen eines einfachen Projekts.


Hier ist ein Beispielprojekt und wie kann es mit javac kompiliert werden.

Die Baumstruktur des Projekts ist dies:

. 
    ├── build 
    └── src 
     ├── attacks 
     ├── drivers 
     │   └── Driver.java 
     └── exceptions 
      └── MyException.java 

Es gibt zwei spezielle Verzeichnisse - build für kompilierten Klassen und src enthält Quelldateien enthalten (in verschiedenen Unterverzeichnisse sein könnte - Pakete). Der folgende Befehl kompiliert das gesamte Projekt und fügt das Ergebnis in das Verzeichnis build ein.

javac -sourcepath src -d build src/**/*.java 

Die -sourcepath src gibt Verzeichnis src als den Ort, wo die ganze Quelle kann durch den Compiler zu finden. Die Optionen -d build teilt dem Compiler mit, wo die kompilierten Dateien abgelegt werden sollen.

Die Option src/**/*.java teilt dem Compiler mit, welche Dateien tatsächlich kompiliert werden sollen. In diesem speziellen Fall wird javac angewiesen, zwei Ebenen nach unten zu suchen und alle * .java auf dieser Ebene auszuwählen.

Wenn *.java Dateien auf verschiedenen Ebenen vorhanden sind, muss eine Liste mit Dateien angegeben werden. Dazu könnte man eine solche Liste als eine externe Datei erstellen und diese Dateien wie in der Eingabeoption für javac übergeben.

Hier ist, wie dies unter Linux/Unix getan werden könnte:

find -name "*.java" > source.txt 

Der obige Befehl erstellt Datei source.txt die vollständigen Pfade für die gefundenen * .java-Dateien enthält.Für dieses Beispiel enthält:

./src/drivers/Driver.java 
./src/exceptions/MyException.java 

Um das Projekt mit der Liste der Quelldateien in source.txt, der folgenden Befehl gespült kompilieren kann verwendet werden:

javac -d build @source.txt 

Bitte beachten Sie, dass @source.txt bei der angegebenen end, das dem Compiler sagt, wo er nach einer Liste von Quelldateien suchen soll. Bitte beachten Sie auch, dass die Option -sourcepath weggelassen werden kann.

Hier ist, wie die Verzeichnisstruktur nach dem Ausführen des obigen Befehls geändert wurde.

. 
├── build 
│   ├── drivers 
│   │   └── Driver.class 
│   └── exceptions 
│    └── MyException.class 
└── src 
    ├── attacks 
    ├── drivers 
    │   └── Driver.java 
    └── exceptions 
     └── MyException.java 

Wie das build Verzeichnis nun beobachtet werden, enthält die kompilierten Klassendateien in den jeweiligen Paketen.

Und wenn Sie es ausführen möchten, unter der Annahme, dass Driver Methode main hat, führt der folgende Befehl das Programm aus.

java -cp .:build:**/*.class drivers.Driver 

Bitte beachten Sie, dass die Datei Separator : (Kolon) unter Unix verwendet, für Windows es ; (Semikolon) ändern.

+0

Ich werde über die Dokumentation schauen. Ein anderes Problem, das ich habe, ist, dass wenn ich die .jar-Datei bekomme, es nicht so laufen wird, wie es in der IDE läuft. Das Symbol blinkt nur und macht dann nichts. – OKGimmeMoney

+0

@CanIHaveSomeChange Es ist am besten, wenn Sie dieses andere Problem als eine andere Frage registrieren. Haben Sie das Projekt erfolgreich erstellt? – 01es

+0

Ich habe das Programm nicht kompilieren bekommen. Was passiert, ist im ursprünglichen Beitrag. – OKGimmeMoney

1

zwei Möglichkeiten:

1) Verwenden Sie die Befehlszeile alle Dateien angeben

2) eine Datei mit allen Dateinamen (Ausgabe von find erstellen zu kompilieren, vielleicht), und führen Sie javac @argfile

+0

Sie meinen, werfen Sie alle Java-Dateien in ein Verzeichnis? Ich werde das als Experiment versuchen, aber es ist keine Endlösung. – OKGimmeMoney

+0

Nein, er hat nichts darüber gesagt, alle Java-Dateien in ein Verzeichnis zu schreiben. Tun Sie das nicht, es kann nicht funktionieren. – EJP

+0

Ich bin nicht sicher, ob ich das richtig mache, aber ich habe diesen Fehler nach dem Versuch, das Programm nach dem ersten Schritt auszuführen: OK, habe ich versucht, und jetzt bekomme ich einen Laufzeitfehler, der sagt "Java. lang.NoClassDefFoundError: ProgramName Ich weiß nicht, wie ich diesen zweiten Schritt ausführen soll, ich lese die Java-Dokumentation, die in diesem Thread von jemand anderem empfohlen wird, und ich verstehe nicht, wie ich sie verwenden soll. – OKGimmeMoney

3

I am compiling multiple files in a directory (javac *.java)

Falsch schon. Das funktioniert nur, wenn die Java-Klassen nicht in Paketen sind. Der richtige Weg, dies zu tun, ist wie folgt, wobei src der Name des Verzeichnisses ist, an dem alle Paketverzeichnisse verwurzelt sind:

cd src 
javac package1/package2/*.java 
javac package3/package4/package5/*.java 

etc für was auch immer Ihr Paket/Verzeichnisstruktur ist. Jede javac-Befehlszeile kompiliert alle Dateien im genannten Verzeichnis und alle .java-Dateien in anderen Paketen/Verzeichnissen, von denen es abhängt, die nicht bereits kompiliert oder veraltet sind.

Siehe die Werkzeugdokumentation für javac.

+0

Genau das habe ich gesucht. Danke vielmals! :) – Hari