Przypadek użycia jest prosty. Mam pliki źródłowe utworzone za pomocą Eclipse. Tak więc istnieje głęboka struktura katalogów, w której każda klasa Java może odwoływać się do innej klasy Java w tym samym folderze podrzędnym, siostrzanym lub nadrzędnym.
Jak skompilować to wszystko z terminala przy użyciu javac?
java
compilation
javac
directory-structure
euforia83
źródło
źródło
Odpowiedzi:
Musisz znać wszystkie katalogi lub umieć używać symboli wieloznacznych.
javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java
źródło
javac $(find . -name "*.java")
.Dzięki Bash 4+ możesz po prostu włączyć globstar
shopt -s globstar
a potem zrób
źródło
Jeśli wszystko, co chcesz zrobić, to uruchomić swoją główną klasę (bez kompilowania
.java
plików, od których nie zależy główna klasa), możesz wykonać następujące czynności:cd <root-package-directory> javac <complete-path-to-main-class>
lub
javac -cp <root-package-directory> <complete-path-to-main-class>
javac
automatycznie rozwiązałby wszystkie zależności i skompilowałby również wszystkie zależności.źródło
-sourcepath .
opcji, a następnie nazwać plik główny, aby uzyskać ten sam efektfind . -type f -name "*.java" | xargs javac
numer 2, a ta metoda jest dostępna tylko wtedy, gdy istnieje jeden główny punkt wejścia metody, który obejmuje całą aplikację.Wziąłbym Jon sugestia „s i użyć Ant, ponieważ jest to dość skomplikowane zadanie.
Jeśli jednak jesteś zdeterminowany, aby uzyskać to wszystko w jednym wierszu w terminalu, w systemie Linux możesz użyć polecenia find . Ale w ogóle tego nie polecam, ponieważ nie ma gwarancji, że, powiedzmy, Foo.java zostanie skompilowany po Bar.java, nawet jeśli
Foo
używaBar
. Przykładem może być:find . -type f -name "*.java" -exec javac {} \;
Jeśli wszystkie twoje klasy nie zostały jeszcze skompilowane, jeśli istnieje jedna główna wiązka przewodów lub klasa sterownika (w zasadzie ta zawierająca twoją główną metodę), kompilowanie tej głównej klasy indywidualnie powinno skompilować większość projektu, nawet jeśli znajdują się w różnych folderach, ponieważ Javac będzie starał się jak najlepiej rozwiązać problemy z zależnościami.
źródło
find_gnu . -type f -name "*.java" | xargs javac
systemie Windows można użyć, gdy nazwa find.exe wersji gnu zostanie zmieniona na find_gnu.exe. Mam plik gnu find.exe z msysgit.for /f "usebackq" %f in (``dir /s /b *.java``) do javac %f
(użyj pojedynczych cudzysłowów wstecz,dir /s /b
ale nie mogę znaleźć sposobu, aby poprawnie go sformatować).find
rozwiązanie jest problematyczne, ponieważ kompiluje każdą klasę Java oddzielnie, co czyni ją bardzo powolną.Oto metoda, którą znalazłem:
1) Utwórz listę plików ze ścieżkami względnymi w pliku (na przykład FilesList.txt) w następujący sposób (oddzielone spacjami lub wierszami):
2) Użyj polecenia:
javac @FilesList.txt -d classes
Spowoduje to skompilowanie wszystkich plików i umieszczenie plików klas w katalogu klas.
Teraz prosty sposób na utworzenie FilesList.txt jest następujący: Przejdź do katalogu głównego źródła.
Ale to zapełni ścieżkę absolutną. Za pomocą edytora tekstu „Zamień wszystko” ścieżkę do katalogu źródłowego (dołącz \ na końcu) z „” (tj. Pusty ciąg znaków) i Zapisz.
źródło
Wydaje się, że istniejące już odpowiedzi dotyczą tylko samych plików * .java, a nie tego, jak łatwo to zrobić z plikami bibliotek, które mogą być potrzebne do kompilacji.
Przyjemna jednowierszowa sytuacja, która rekursywnie pobiera wszystkie pliki * .java, a także zawiera pliki * .jar niezbędne do budowania, to:
javac -cp ".:lib/*" -d bin $(find ./src/* | grep .java)
Tutaj plik bin jest miejscem docelowym plików klas, lib (i potencjalnie bieżący katalog roboczy) zawiera pliki bibliotek, a wszystkie pliki java w katalogu src i poniżej są skompilowane.
źródło
Aby to zrobić hierarchicznie, musiałbyś użyć czegoś takiego jak Ant:
http://ant.apache.org/manual/Tasks/javac.html
Będziesz musiał utworzyć skrypt kompilacji z celem o nazwie kompilacja, zawierającym następujące elementy:
<javac sourcepath="" srcdir="${src}" destdir="${build}" > <include name="**/*.java"/> </javac>
Wtedy będziesz mógł skompilować wszystkie pliki, uruchamiając:
Alternatywnie, zaimportuj swój projekt do Eclipse, a on automatycznie skompiluje wszystkie pliki źródłowe dla tego projektu.
źródło
Jest na to sposób bez użycia potoku, co jest wygodne, jeśli rozwidlasz proces z innego języka programowania, aby to zrobić:
find $JAVA_SRC_DIR -name '*.java' -exec javac -d $OUTPUT_DIR {} +
Chociaż jeśli jesteś w Bash i / lub nie masz nic przeciwko używaniu fajki, możesz zrobić:
find $JAVA_SRC_DIR -name '*.java' | xargs javac -d $OUTPUT_DIR
źródło
Rozwiązanie dla Windows: Zakładając, że wszystkie pliki zawarte w podkatalogu „src” chcesz skompilować do „bin”.
for /r src %i in (*.java) do javac %i -sourcepath src -d bin
Jeśli src zawiera plik .java bezpośrednio pod nim, jest to szybsze
źródło