javac opcja kompilacji wszystkich plików java pod danym katalogiem rekurencyjnie

Używam kompilatora javac do kompilacji plików java w moim projekcie. Pliki są dystrybuowane w kilku pakietach, takich jak ten: com.vistas.util, com.vistas.converter, com.vistas.LineHelper, com.current.mdcontect.

Każdy z tych pakietów zawiera kilka plików java. Ja używam javaca w ten sposób:

javac com/vistas/util/*.java com/vistas/converter/*.java
      com.vistas.LineHelper/*.java com/current/mdcontect/*.java

(w jednej linii)

Zamiast podawać tak wiele ścieżek, jak Mogę poprosić kompilator o rekursywne skompilowanie wszystkich plików Javy z nadrzędnego katalogu com?

8 answers

Sugerowałbym również użycie jakiegoś narzędzia do budowania (Ant lub Maven , Ant jest już sugerowany i łatwiej zacząć od niego) lub IDE, które obsługuje kompilację (Eclipse używa kompilacji przyrostowej ze strategią uzgadniania, a nawet nie musisz się przejmować naciśnięciem przycisków "Compile" ).

Korzystanie Z Javac

Jeśli chcesz wypróbować coś dla większego projektu i nie masz żadnych odpowiednich narzędzi do budowania w pobliżu, zawsze możesz użyć małego sztuczka, którą oferuje javac: nazwy klas do kompilacji mogą być określone w pliku. Po prostu musisz przekazać nazwę pliku {[3] } z prefiksem @.

Jeśli możesz utworzyć listę wszystkich plików *.java w swoim projekcie, jest to proste:

# Linux / MacOS
$ find -name "*.java" > sources.txt
$ javac @sources.txt

:: Windows
> dir /s /B *.java > sources.txt
> javac @sources.txt
  • zaletą jest to, że jest to szybkie i łatwe rozwiązanie.
  • wadą jest to, że musisz zregenerować plik sources.txt za każdym razem, gdy tworzysz nowe źródło lub zmieniasz nazwę istniejącego pliku, który jest łatwe do zapomnienia (a więc podatne na błędy) i męczące zadanie.

Używanie narzędzia do budowania

Na dłuższą metę lepiej jest użyć narzędzia, które zostało zaprojektowane do tworzenia oprogramowania.

Używanie Ant

Jeśli utworzysz prosty plik build.xml, który opisuje jak zbudować oprogramowanie:

<project default="compile">
    <target name="compile">
        <mkdir dir="bin"/>
        <javac srcdir="src" destdir="bin"/>
    </target>
</project>

Możesz skompilować całe oprogramowanie, uruchamiając następujące polecenie:

$ ant
  • zaletą jest to, że używasz standardowego narzędzia do budowania, które jest łatwe rozszerzyć.
  • wadą jest to, że musisz pobrać, skonfigurować i nauczyć się dodatkowego narzędzia. Zauważ, że większość IDE (takich jak NetBeans i Eclipse) oferuje świetne wsparcie dla pisania plików kompilacji, więc nie musisz nic pobierać w tym przypadku.

Używanie Mavena

Maven nie jest tak trywialny w konfiguracji i pracy, ale nauka dobrze się opłaca. Oto świetny samouczek, aby rozpocząć projekt w ciągu 5 minut.
  • to główną zaletą (dla mnie) jest to, że obsługuje również zależności, więc nie będziesz musiał pobierać więcej plików Jar i zarządzać nimi ręcznie i uznałem, że jest bardziej przydatny do budowania, pakowania i testowania większych projektów.
  • wadą jest to, że ma stromą krzywą uczenia się, a jeśli wtyczki Mavena lubią tłumić błędy :-) inną rzeczą jest to, że sporo narzędzi działa również z repozytoriami Mavena (jakSBT dla Scali, Ivy dla Ant, Graddle dla Groovy).

Używanie IDE

Teraz, co może zwiększyć wydajność rozwoju. Istnieje kilka alternatyw open source (jak Eclipse i NetBeans, wolę pierwszą), a nawet komercyjne (jak IntelliJ), które są dość popularne i potężne.

Mogą zarządzać budową projektu w tle, dzięki czemu nie musisz zajmować się wszystkimi sprawami z linii poleceń. Jednak zawsze się przydaje jeśli wiesz, co faktycznie dzieje się w tle, dzięki czemu możesz wytropić sporadyczne błędy, takie jak ClassNotFoundException.

Jedna uwaga dodatkowa

W przypadku większych projektów zawsze zaleca się użycie IDE i narzędzia do budowania. Pierwsze z nich zwiększa twoją produktywność, podczas gdy drugie umożliwia używanie różnych IDE w projekcie (np. Maven może generować deskryptory projektu Eclipse za pomocą prostego polecenia mvn eclipse:eclipse). Ponadto posiadanie projektu, który można przetestować/zbudować za pomocą jednego wiersza polecenie jest łatwe do wprowadzenia do nowych kolegów i do serwera ciągłej integracji na przykład. Bułka z masłem: -)
 181
Author: rlegendi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-25 08:58:01
find . -name "*.java" -print | xargs javac 
Trochę brutalne, ale działa jak diabli. (Używaj tylko na małych programach, to absolutnie nie jest wydajne)
 38
Author: Matthieu Riegler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-30 20:00:52

Jeśli twoja powłoka go obsługuje, czy coś takiego zadziała ?

javac com/**/*.java 

Jeśli twoja powłoka nie obsługuje **, to może

javac com/*/*/*.java

Działa (dla wszystkich pakietów z 3 komponentami-dostosuj do mniej więcej).

 26
Author: phtrivier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-08 14:41:34

W zwykłym przypadku, gdy chcesz skompilować cały projekt, możesz po prostu dostarczyć javac ze swoją główną klasą i pozwolić jej skompilować wszystkie wymagane zależności:

javac -sourcepath . path/to/Main.java

 19
Author: freaker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-02 11:32:31

Radzę nauczyć się używać ant , który jest bardzo-dobrze nadaje się do tego zadania, jest bardzo łatwy do uchwycenia i dobrze udokumentowany.

Musiałbyś tylko zdefiniować taki cel w kompilacji.plik xml:

<target name="compile">
    <javac srcdir="your/source/directory"
           destdir="your/output/directory"
           classpath="xyz.jar" />
</target>
 3
Author: JB Nizet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-08 10:32:29

Używam tylko make z prostym makefile, który wygląda tak:

JAVAC = javac -Xlint:unchecked
sources = $(shell find . -type f -name '*.java')
classes = $(sources:.java=.class)

all : $(classes)

clean :
        rm -f $(classes)

%.class : %.java
        $(JAVAC) $<

Kompiluje źródła pojedynczo i rekompiluje tylko w razie potrzeby.

 2
Author: Edward Doolittle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-03 18:52:22

Polecenie Javac nie wykonuje rekurencyjnego procesu kompilacji, więc musisz albo określić każdy katalog podczas uruchamiania polecenia, albo podać plik tekstowy z katalogami, które chcesz dołączyć:

javac -classpath "${CLASSPATH}" @java_sources.txt
 1
Author: gvalenncia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-18 04:03:12

Używałem tego w projekcie Xcode JNI do rekurencyjnego budowania klas testowych:

find ${PROJECT_DIR} -name "*.java" -print | xargs javac -g -classpath ${BUILT_PRODUCTS_DIR} -d ${BUILT_PRODUCTS_DIR}
 0
Author: bishopthom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-04 22:09:27