Ich verwende den Javac-Compiler, um Java-Dateien in meinem Projekt zu kompilieren. Die Dateien werden mehrere Pakete wie folgt verteilt: com.vistas.util
, com.vistas.converter
, com.vistas.LineHelper
, com.current.mdcontect
.
Jedes dieser Pakete enthält mehrere Java-Dateien. Ich benutze Javac wie folgt:
javac com/vistas/util/*.java com/vistas/converter/*.java
com.vistas.LineHelper/*.java com/current/mdcontect/*.java
(in einer Zeile)
Wie kann ich den Compiler bitten, alle Java-Dateien aus dem übergeordneten com-Verzeichnis rekursiv zu kompilieren, anstatt so viele Pfade anzugeben?
Antworten:
Ich würde auch vorschlagen, eine Art Build-Tool ( Ant oder Maven , Ant wird bereits vorgeschlagen und ist einfacher zu beginnen) oder eine IDE zu verwenden, die die Kompilierung verwaltet (Eclipse verwendet die inkrementelle Kompilierung mit Abgleichsstrategie, und Sie müssen nicht einmal Pflege alle drücken „Compile“ Tasten).
Verwenden von Javac
Wenn Sie etwas für ein größeres Projekt ausprobieren müssen und keine geeigneten Build-Tools in der Nähe haben, können Sie immer einen kleinen Trick verwenden,
javac
der Folgendes bietet: Die zu kompilierenden Klassennamen können in einer Datei angegeben werden. Sie müssen lediglich den Namen der Dateijavac
mit dem@
Präfix übergeben.Wenn Sie eine Liste aller
*.java
Dateien in Ihrem Projekt erstellen können , ist dies ganz einfach:sources.txt
Datei jedes Mal neu generieren müssen, wenn Sie eine neue Quelle erstellen oder eine vorhandene Datei umbenennen. Dies ist eine leicht zu vergessende (daher fehleranfällige) und mühsame Aufgabe.Verwenden eines Build-Tools
Auf lange Sicht ist es besser, ein Tool zu verwenden, das zum Erstellen von Software entwickelt wurde.
Mit Ant
Wenn Sie eine einfache
build.xml
Datei erstellen , in der beschrieben wird, wie die Software erstellt wird:Sie können die gesamte Software kompilieren, indem Sie den folgenden Befehl ausführen:
Mit Maven
Maven ist nicht so trivial einzurichten und zu bearbeiten, aber es lohnt sich zu lernen. Hier ist ein großartiges Tutorial, um ein Projekt innerhalb von 5 Minuten zu starten .
Verwenden einer IDE
Nun, was könnte Ihre Entwicklungsproduktivität steigern. Es gibt einige Open-Source-Alternativen (wie Eclipse und NetBeans , ich bevorzuge die ersteren) und sogar kommerzielle (wie IntelliJ ), die sehr beliebt und leistungsstark sind.
Sie können das Projektgebäude im Hintergrund verwalten, sodass Sie sich nicht um alle Befehlszeilen kümmern müssen. Es ist jedoch immer praktisch, wenn Sie wissen, was tatsächlich im Hintergrund passiert, damit Sie gelegentliche Fehler wie a aufspüren können
ClassNotFoundException
.Ein zusätzlicher Hinweis
Bei größeren Projekten wird immer empfohlen, eine IDE und ein Build-Tool zu verwenden. Ersteres steigert Ihre Produktivität, während letzteres die Verwendung verschiedener IDEs für das Projekt ermöglicht (z. B. kann Maven mit einem einfachen
mvn eclipse:eclipse
Befehl Eclipse-Projektdeskriptoren generieren ). Darüber hinaus ist es einfach, ein Projekt, das mit einem einzeiligen Befehl getestet / erstellt werden kann, neuen Kollegen und beispielsweise einem Server für die kontinuierliche Integration vorzustellen. Stück Kuchen :-)quelle
javac
ist es besser, ein Ausgabeverzeichnis anzugeben.find -name "*.java" > sources.txt && javac -d bin @sources.txt
. Andernfalls werden * .class-Dateien in dem Verzeichnis gespeichert, in dem sich die Quellen befinden.javac
, das KonzeptCLASSPATH
, wie Code ausgeführt wirdjava
, wie mit Paketen umgegangen wird, die der Stammordner für die Ausführung sein sollten usw., normalerweise nicht klar ist. Daher habe ich das Ausgabeverzeichnis weggelassen. Trotzdem danke für den Vorschlag!find
find . -name "*.java" > sources.txt
.
Ein bisschen brutal, funktioniert aber höllisch. (Nur für kleine Programme verwenden, es ist absolut nicht effizient)
quelle
find ... -print0
undxargs -0 ...
stattdessen nicht Leerzeichen in Dateinamen zu brechenWenn Ihre Shell dies unterstützt, würde so etwas funktionieren?
Wenn Ihre Shell nicht unterstützt
**
, dann vielleichtfunktioniert (für alle Pakete mit 3 Komponenten - mehr oder weniger anpassen).
quelle
In dem üblichen Fall, in dem Sie Ihr gesamtes Projekt kompilieren möchten, können Sie javac einfach mit Ihrer Hauptklasse versorgen und alle erforderlichen Abhängigkeiten kompilieren lassen:
javac -sourcepath . path/to/Main.java
quelle
Main.java
, was Sie wahrscheinlich nicht gleich nach dem Erstellen Ihrer zweiten Datei tun würden, wird nichts anderes zum Compiler.javac -cp "jar_path/*" $(find . -name '*.java')
(Ich bevorzuge es, xargs nicht zu verwenden, da es sie aufteilen und javac mehrmals ausführen kann, jeweils mit einer Teilmenge von Java-Dateien, von denen einige andere importieren können, die nicht in derselben javac-Befehlszeile angegeben sind.)
Wenn Sie einen App.java-Einstiegspunkt haben, ist der Freaker-Weg mit -sourcepath am besten. Es kompiliert jede andere Java-Datei, die es benötigt, und folgt dabei den Importabhängigkeiten. z.B:
javac -cp "jar_path/*" -sourcepath src/ src/com/companyname/modulename/App.java
Sie können auch ein Verzeichnis der Zielklassendatei angeben :
-d target/
.quelle
Ich würde Ihnen raten, mit Ameise zu lernen , die für diese Aufgabe sehr gut geeignet und sehr leicht zu erfassen und gut dokumentiert sind.
Sie müssten lediglich ein solches Ziel in der Datei build.xml definieren:
quelle
Ich verwende make nur mit einem einfachen Makefile, das so aussieht:
Es kompiliert die Quellen einzeln und kompiliert sie nur bei Bedarf neu.
quelle
Der Befehl javac folgt keinem rekursiven Kompilierungsprozess. Sie müssen also entweder jedes Verzeichnis angeben, wenn Sie den Befehl ausführen, oder eine Textdatei mit Verzeichnissen bereitstellen, die Sie einschließen möchten:
quelle
Ich habe dies in einem Xcode JNI-Projekt verwendet, um meine Testklassen rekursiv zu erstellen:
quelle