2013-06-17 10 views
15

Mam kompilacji wielu plików w katalogu (javac * .java), ale mam problem, gdy próbuję to zrobić:jak skompilować wiele plików java, gdy istnieją pliki Java w innych pakietach

dostaję kompilacji błędy mówiąc, że javac nie może znaleźć symbolu obiektu.

Mam wiele pakietów zawierających pliki Java, które są potrzebne do uruchomienia programu głównego. Wydaje się jednak, że próba kompilacji tych jeden po drugim nie będzie działać. Działa dobrze w moim IDE, ale jestem zainteresowany uczeniem się, jak to zrobić za pomocą wiersza polecenia.

Główny program znajduje się w folderze drivers.

Próbowałem kompilacji plików w kolejności zależności, ale to się nie udało. this is a screenshot of the folders

+0

Jeśli w "argfile" masz listę wszystkich plików do skompilowania, możesz uruchomić ['javac @ argfile'] (http://docs.oracle.com/javase/7/docs/technotes/tools/ windows/javac.html # commandlineargfile). Jeśli używasz innych bibliotek, musisz je dodać. – Alberto

+0

Kiedy robię coś takiego jak edycja nazwy ścieżki klasy (w tym przypadku), gdzie powinienem to zrobić i jak? Słyszałem o tym, że robiono to w pliku manifestu, ale wiem, że można to zrobić również w ustawieniach systemu operacyjnego. – OKGimmeMoney

+0

Możesz dodać zależność od classpath poprzez opcję '-classpath' jak:' javac -classpath \ examples; \ lib \ Banners.jar \ examples \ greetings \ Hi.java'. Zobacz http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html i http://docs.oracle.com/javase/7/docs/technotes/tools/windows/ classpath.html. – Alberto

Odpowiedz

19

Javac documentation zawiera wszystkie niezbędne informacje. Jednak może być użyteczne użycie Ant lub Maven dla buildów linii poleceń.

This strona zapewnia dobry przykład użycia pierwszego javac, a następnie Ant do zbudowania prostego projektu.


Oto przykładowy projekt i jak można go skompilować z javac.

Struktura drzewa projektu to:

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

Istnieją dwa specjalne katalogi - build do przechowywania skompilowanych klas i src do zawierają pliki źródłowe (może być w różnych podkatalogów - Pakiety).

Następujące polecenie kompiluje cały projekt i umieszcza wynik w katalogu build.

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

-sourcepath src określa katalog src jako miejsce, gdzie wszystko można znaleźć źródło przez kompilator. Opcje -d build informują kompilator, gdzie umieścić skompilowane pliki.

Opcja src/**/*.java mówi kompilatorowi, jakie pliki faktycznie skompilować. W tym konkretnym przypadku mówi on javacowi, że powinien przejrzeć dwa poziomy w dół i wybrać wszystkie * .java na tym poziomie.

Jeśli istnieją pliki *.java na różnych poziomach niż musi być określona lista plików. W tym celu można utworzyć taką listę jako plik zewnętrzny i przekazać te pliki jako opcję wejściową dla javac.

Oto jak można to zrobić pod Linux/Unix:

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

Powyższe polecenie tworzy plik source.txt zawierający pełne ścieżki dla znalezionych plików * .java.W tym przykładzie zawiera:

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

Aby skompilować projekt z listy plików źródłowych przepłukać pod source.txt następujące polecenie można stosować:

javac -d build @source.txt 

Uwaga @source.txt określone na end, który mówi kompilatorowi, gdzie szukać listy plików źródłowych. Należy również pamiętać, że opcję -sourcepath można pominąć.

Oto jak zmieniła się struktura katalogów po uruchomieniu powyższej komendy.

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

Jak można zaobserwować katalog build zawiera teraz skompilowane pliki klas w poszczególnych pakietach.

I jeśli chcesz go uruchomić, zakładając na przykład, że Driver ma metodę main, następujące polecenie wykonuje program.

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

Należy pamiętać, że separator plik : (dwukropek) jest używana w systemie Unix, Windows zmień go na ; (średnik).

+0

Zajrzę do dokumentacji. Innym problemem jest to, że gdy otrzymam plik .jar, nie będzie działał tak, jak działa w środowisku IDE. Ikona miga, a następnie nic nie robi. – OKGimmeMoney

+0

@CanIHaveSomeChange Najlepiej, jeśli rejestrujesz ten inny problem jako inne pytanie. Czy udało Ci się skompilować projekt? – 01es

+0

Nie otrzymałem programu do kompilacji. Co się dzieje w oryginalnym poście. – OKGimmeMoney

1

dwie opcje:

1) Za pomocą wiersza polecenia, aby określić wszystkich plików do kompilacji

2) Utwórz plik ze wszystkimi nazwami plików (wyjście od znalezienia, być może), i uruchom javac @argfile

+0

Masz na myśli rzucić wszystkie pliki Java w jednym katalogu? Spróbuję tego jako eksperyment, ale to nie jest rozwiązanie końcowe. – OKGimmeMoney

+0

Nie, nie powiedział nic o umieszczeniu wszystkich plików java w jednym katalogu. Nie rób tego, to nie działa. – EJP

+0

Nie jestem pewien, czy robię to dobrze, ale mam ten błąd po próbie uruchomienia programu po pierwszym kroku: OK, próbowałem tego i teraz otrzymuję komunikat o błędzie wykonywania, który mówi "java. lang.NoClassDefFoundError: ProgramName Nie wiem, jak wykonać ten drugi krok, przeczytałem Dokumentację Java zalecaną w tym wątku przez kogoś innego i nie rozumiem, jak z niego korzystać. – OKGimmeMoney

3

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

Zły już. To będzie działać poprawnie tylko wtedy, gdy klasy Java nie są w pakietach. Poprawny sposób to zrobić w następujący sposób, gdzie src jest nazwą katalogu, w którym wszystkie katalogi pakietów są zakorzenione:

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

etc niezależnie układ pakiet/katalog jest. Każda linia poleceń javac skompiluje wszystkie pliki w nazwanym katalogu i wszystkie pliki .java w innych pakietach/katalogach, które zależą od tego, które nie są już skompilowane lub które są nieaktualne.

Zobacz dokumentację narzędzia dla javac.

+0

To jest dokładnie to, czego szukałem. Wielkie dzięki! :) – Hari