Mariusz Prowaźnik

o programowaniu w Javie, Scali i Clojure.


Eclipse - podstawowa konfiguracja

Zainstalowanie Eclipse i skonfigurowanie środowiska pracy nie jest trudne. Jednak warto poświęcić temu nieco więcej uwagi, by zwiększyć w ten sposób możliwości, które nam oferuje Eclipse i sprawniej go wykorzystywać.

1. Ściągnięcie JDK, Eclipse i Maven

Odnalezienie odpowiednich plików za pomocą google jest banalnie proste, ale dla wygody podam linki:
Ściągnięte Eclipse i Maven wystarczy rozpakować.

2. Ustawienie zmiennych systemowych

Ścieżki w którym znajduje się JDK i Maven powinny zostać dodane do PATH, aby za każdym razem, gdy wydamy pod konsolą polecenie np. java czy mvn, system przeszukał podane ścieżki i odnalazł odpowiedni plik. Ustawienie zmiennych systemowych w Windows 7:
  1. naciskamy Windows Key + Pause, pojawia się Panel sterowania\System i zabezpieczenia\System
  2. klikamy zaawansowane ustawienia systemu, zakładka zaawansowane, przycisk zmienne środowiskowe
  3. powinno otworzyć się takie okno:

    Dodajemy zmienne JAVA_HOME i MAVEN_HOME, zawierające odpowiednio ścieżkę do katalogu javy i mavena.
  4. Na koniec należy odszukać zmienną PATH i zmodyfikować jej zawartość, dodając na końcu %JAVA_HOME%\bin;%MAVEN_HOME%\bin

Aby sprawdzić, czy wszystko działa, otwieramy konsolę i wpisujemy:
java -version
Polecenie to powinno zwrócić wersję javy, np:
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode, sharing)
Gdy to zadziała, sprawdzamy:
mvn -v
co powinno zwrócić coś w stylu:
Apache Maven 2.2.1 (r801777; 2009-08-06 21:16:01+0200)
Java version: 1.6.0_16
Java home: C:\Program Files\Java\jdk1.6.0_16\jre

3. JDK

Mimo, że skompilowanie kodów źródłowych i zbudowanie projektu załatwia za nas IDE, dobrze jest wiedzieć co się dzieje "pod spodem", a dokładnie, jakie narzędzia wchodzą w skład Java Development Kit i jak ich używać. Są to między innymi:
  • java - interpreter javy, umożliwia uruchomienie skompilowanych programów
  • javac - kompilator javy
  • jar - narzędzie do tworzenia, modyfikacji, rozpakowywania archiwów jar
  • javah - generator nagłówków C, używany np gdy jest potrzeba stworzenia kodu Java i C, który by współpracował ze sobą
  • jdb - debugger javy
  • javadoc - generator dokumentów javy
  • javap - disassembler javy
Dzięki tym narzędziom, można napisać kod java w notatniku, a potem skompilować i uruchomić go z lini poleceń. Jak to wygląda w praktyce pokażę na prostej klasie :
package helloworld;

public class Main {
 public static void main(String[] args) {
  System.out.println("hello world");
 }
}
Kod źródłowy znajduje się w katalogu src\helloworld\, skompilujemy go do bin/helloworld.
javac src\helloworld\Main.java -d bin
-d określa docelowy katalog dla skompilowanych klas. Gdybyśmy korzystali z jakichś zewnętrznych bibliotek, trzeba by było dodać je do classpath (określa gdzie JVM ma szukać klas i paczek).
javac src\helloworld\Main.java -classpath lib/jakislib.jar -d bin
Uruchamiamy program za pomocą:
cd bin
java helloworld.Main
lub
java -cp bin helloworld.Main
gdzie poprzez -cp określamy classpath. Uruchamiając kod, trzeba dodać do classpath użyte biblioteki.

Skompilowane klasy zwykle pakuje się do archiwum jar. Przytoczę tutaj definicję z Wikipedii:
JAR (ang. Java ARchive) – archiwum ZIP używane do strukturalizacji i kompresji plików klas języka Java oraz powiązanych z nimi metadanych.

Archiwum JAR składa się z pliku manifestu umieszczonego w ścieżce META-INF/MANIFEST.MF, który informuje o sposobie użycia i przeznaczeniu archiwum. Archiwum JAR, o ile posiada wyszczególnioną klasę główną, może stanowić osobną aplikację.
Aby stworzyć archiwum jar, musimy najpierw stworzyć plik MANIFEST.MF, w którym określimy główną klasę
Main-Class: helloworld.Main
potem używamy narzędzia jar:
jar cvfm main.jar MANIFEST.MF -C bin \
to powinno zwrócić wynik podobny do tego:
added manifest
adding: helloworld/(in = 0) (out= 0)(stored 0%)
adding: helloworld/Main.class(in = 424) (out= 290)(deflated 31%)
Następnie:
java -jar main.jar
co powinno zwrócić
hello world

4. Maven

Z Wikipedii:
Apache Maven jest narzędziem automatyzującym budowę oprogramowania na platformę Java. Poszczególne funkcjonalności Mavena realizowane są poprzez wtyczki, które są automatycznie pobierane przy ich pierwszym wykorzystaniu. Plik określający sposób budowy aplikacji nosi nazwę POM-u (ang. Project Object Model).

Po co używać Mavena? Bardzo wiele ułatwia. Dzięki niemu na przykład nie trzeba ręcznie ściągać bibliotek używanych w projekcie, wiele procesów związanych budowaniem i uruchamianiem projektów jest zautomatyzowana, dostępna jest duża ilość archetypów - które dostarczają podstawową strukturę dla projektów różnego typu. Cała konfiguracja zawarta jest w jednym pliku - pom.xml.

Dobry opis tego, jak można używać Mavena zająłby wiele więcej niż cały ten post, dlatego zawartość tego punktu należy traktować raczej jako prosty przykład jego zastosowania.

Aby stworzyć projekt, wydajemy pod konsolą polecenie
mvn archetype:generate
Maven zapyta wtedy o dodatkowe parametry:
  • nr archetypu - z wyświetlonej listy, można sobie wybrać rodzaj projektu, który chcemy stworzyć - wybieramy domyślny
  • version - wybieramy najnowszą
  • groupId - wymyślamy nazwę grupy dla projektu np. com.blogspot.evojava
  • artifactId - wymyślamy nazwę dla projektu np. testApp
  • version - podajemy nr wersji dla projektu, można domyślną
  • package - nazwa paczki dla kodu, zostawiamy domyślną, czyli nazwę grupy
Zatwierdzamy i projekt został utworzony. Teraz, aby można było go otworzyć za pomocą Eclipse, wchodzimy do katalogu projektu i wydajemy polecenie:
mvn eclipse:eclipse

Pierwsze wykonanie tych poleceń może trochę potrwać, ze względu na to, że maven potrzebuje ściągnąć kilka potrzebnych zależności. Przy kolejnym wywołaniu tych poleceń już tego robić nie będzie.

Otwieramy projekt w Eclipse poprzez zaimportowanie go do workspace (File -> Import -> General -> Existing Project Into Workspace). W projekcie mamy następujące pliki:


Jak widać został stowrzony katalog src/main/java, a w nim przykładową klasę, oraz katalog src/test/java z przykładową klasą testów jednostkowych. I co najważniejsze, plik
pom.xml.:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.blogspot.evojava</groupId>
  <artifactId>testApp</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>testApp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>
W sekcji dependencies są zależności - biblioteki wymagane do działania programu. W tym przypadku jest to junit, bez której nie będą działać testy jednostkowe. W tym momencie Eclipse sygnalizuje czerwonym wykrzyknikiem brak bibliotek, ale podczas pierwszego budowania projektu maven ściągnie z repozytoriów zależne biblioteki.

Jednak, żeby ściągnięte przez Mavena biblioteki były widziane przez Eclipse, trzeba dodać Classpath Variable:
  1. Window -> Preferences -> Java -> Build Path -> Classpath Variables
  2. New ->
    Name: M2_REPO
    Path: {UserDir}/.m2/repository
Jak zbudować projekt? Na przykład poleceniem
mvn package
Jeżeli wszystko przebiegnie prawidłowo, na konsoli wyświetli się komunikat podobny do tego:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8 seconds
[INFO] Finished at: Wed Aug 18 18:49:18 CEST 2010
[INFO] Final Memory: 8M/17M
[INFO] ------------------------------------------------------------------------
package jest jednym z celów mavena. W głównym cyklu zawiera się 8 celów, które wykonywane są jeden po drugim. Aby przejść do kolejnego, wywołanie poprzedniego musi zakończyć się sukcesem.
Z wikipedii:
  • validate - sprawdzenie, czy projekt jest poprawny i czy wszystkie niezbędne informacje zostały określone
  • compile - kod źródłowy jest kompilowany
  • test - przeprowadzane są testy jednostkowe
  • package - budowana jest paczka dystrybucyjna
  • integration-test - zbudowany projekt umieszczany jest w środowisku testowym, gdzie przeprowadzane są testy integracyjne
  • verify - sprawdzenie, czy paczka jest poprawna
  • install - paczka umieszczana jest w repozytorium lokalnym - może być używana przez inne projekty jako zależność
  • deploy - paczka umieszczana jest w repozytorium zdalnym (opublikowana)
Wywołanie któregoś z celów powoduje wywołanie również realizację wcześniejszych. Zatem po użyciu mvn package spowoduje ściągnięcie zależności (w tym przypadku biblioteki junit) i umieszczenie ich w repozytorium lokalnym mavena (znajduje się w {UserDir}/.m2/repository), skompilowanie klas, uruchomienie testów jednostkowych i stowrzenie pliku jar w katalogu target.

Aby zmiany zostały zauważone w eclipse, należy ponownie wywołać polecenie
mvn eclipse:eclipse
i odświeżyć projekt (F5).


W folderze target pojawił się między innymi plik .jar i raporty, zniknął czerwony wykrzyknik oznaczający brak wymaganych bibliotek. Można teraz uruchomić projekt (Alt+Shift+X,J).

Próba uruchomienia projektu bez wcześniejszego zbudowania spowodowałaby wyrzucenie wyjątku przez Classloader'a, który nie był w stanie znaleźć skompilowanych klas:
java.lang.NoClassDefFoundError: com/blogspot/evojava/App
Caused by: java.lang.ClassNotFoundException: com.blogspot.evojava.App
 at java.net.URLClassLoader$1.run(Unknown Source)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
Exception in thread "main" 

Aby wyczyścić wygenerowane przez mavena pliki i katalogi podczas budowania należy użyć
mvn clean
Najczęściej łączy się te polecenia w jeden ciąg, np:
mvn clean package eclipse:eclipse

5. Instalacja wtyczek

Przyda nam się również kilka wtyczek, które rozszerzą funkcjonalność Eclipse. W przypadku systemów Windows 7 i Vista z włączonym UAC, mogą wystąpić pewne problemy przy instalacji wtyczek. To znaczy wtyczka wydaje się instalować poprawnie, ale jej nie ma. Aby temu zapobiec, na potrzeby instalacji dodatków należy uruchomić Eclipse jako administrator.

Kolejna rzecz, eclipse domyślnie używa jre zamiast jdk i zalecam to zmienić:
  1. Wchodzimy do Window->Preferences->Java->Installed JRE's
  2. klikamy Add->Standard VM.
  3. klikamy directory i wyszukujemy katalog w którym znajduje się JDK


  4. klikamy Finish i zaznaczamy dodane jre
  5. dodaj do pliku eclipse.ini (katalog eclipse) przed -vmargs linijkę:
    -vm
    C:\Program Files (x86)\Java\jdk1.6.0_20\bin\javaw.exe
    podając oczywiście własny katalog do javy
5.a. Subclipse
Subclipse umożliwia korzystanie repozytoriów SVN za pomocą Eclipse. Instalacja:
  1. Help -> Install New Software
  2. w pole Work With wklej: http://subclipse.tigris.org/update_1.6.x
  3. next -> next -> finish
  4. zrestartuj eclipse
  5. sprawdź czy w Window->Preferences->Team znajduje się sekcja SVN, jeśli tak, to wtyczka jest zainstalowana
Teraz wystarczy wybrać Window->Show View->Other->SVN->SVN Repositories i otwiera się okno, w którym można zarządzać repozytoriami. Wygodnie commit'uje i update'uje się przy użyciu perspektywy Team Synchronizing (Window->Open Perspective->Other->Team Synchronizing)

5.b. m2eclipse
Wtyczka ta umożliwia integracje Mavena z Eclipse. Nie jest ona pozbawiona wad, jednak może się przydać.
Instalacja wtyczki:
  1. Help -> Install New Software
  2. w pole Work With wklej: http://m2eclipse.sonatype.org/sites/m2e
  3. next -> next -> finish
  4. zrestartuj eclipse
  5. gdy już się zainstaluje, podaj ścieżkę katalogu w którym znajduje się Maven: Window -> Preferences -> Maven -> Instalations -> Add. Jeśli nie ma sekcji Maven w preferencjach, to znaczy że wystąpiły jakieś problemy przy instalacji wtyczki.
Teraz po kliknięciu prawym przyciskiem myszy na projekcie i wybierając z menu kontekstowego Run As, zobaczymy opcje dodane przez m2eclipse:

W menu tworzenia nowego projektu została dodana nowa sekcja:

6. Widoki i perspektywy

Dowolny widok można otworzyć wybierając Window->Show View. Dostępne są tam zarówno podstawowe widoki takie jak Console, czy Package Explorer (warto to wiedzieć chociażby na wypadek gdybyśmy przez przypadek zamknęli któryś z tych widoków), jak i takie które się używa rzadziej. Nie będę opisywał tutaj ich, najlepiej samemu sobie je zobaczyć.

Perspektywy zawierają predefiniowany układ widoków zorientowany na jakieś konkretne zadanie. Można się między nimi szybko przełączać, np. pisząc kod używamy perspektywy Java, postanawiamy zrobić commit na repozytorium, więc przełączamy się na perspektywę Team Synchronizing, a gdy już skończymy synchronizować kod, wracamy do perspektywy Java i dalej kodujemy.
Wybrać perspektywę możemy wybierając w Window->Open Perspective, lub wybierając z toolbar'a w prawym górnym rogu:

Do najczęściej przeze mnie używanych perspektyw należą: Java, Java EE, Team Synchronizing, Debug.

7. Debugger

Nieodłącznym elementem pracy programisty jest wyszukiwanie błędów i naprawianie ich. W pewnym momencie trzeba przestać kodować i zacząć badać co się dzieje w programie i dlaczego nie działa on tak jak powinien. Kiedyś w tym celu modyfikowałem kod tak, by wyrzucał mi na konsolę wartości zmiennych. Teraz wiem, że lepiej użyć do tego narzędzia do debuggowania. Krótki opis tego, jak go używać, zamieszczam tutaj.
Klikając dwukrotnie na lewo od kodu, można wstawić Breakpoint. Określi on miejsce, gdzie podczas Debugowania wykonanie programu się zatrzyma i będzie można podejrzeć np wartości zmiennych:
powyżej wstawione są dwa breakpointy na lini 8 i 10. Teraz wystarczy uruchomic debugowanie:


Eclipse automatycznie przełączy na perspektywę Debug:
W widoku Variables można podejrzeć wartości zmiennych. Wznowić wykonywanie programu można za pomocą zaznaczonego toolbar'a, a za pomocą Step Over, i Step Into z menu Run można wykonywać program krokowo, linia po linii.

8. Skróty klawiaturowe

Beż używania skrótów klawiaturowych korzystanie z Eclipse byłoby o wiele bardziej czasochłonne. Zamieszczam tutaj ściągawkę z tymi, które najczęściej używam i które są według mnie najbardziej przydatne.
  • Ctr+Spacja - Content Assist - wyświetla podpowiedzi nazw zmiennych, nazw metod, parametrów metod.
  • Ctr+Shift+O - Organize Imports - wstawia potrzebne importy, usuwa zbędne
  • Ctr+Shift+F - Format - formatuje ładnie kod
  • Shift+Alt+S - Source - wyświetla menu, z którego można wybrać wygenerowanie np setterów i getterów, konstruktorów, toStringów itp.
  • Ctr+/ - Toggle comment - komentuje / odkomentowuje zaznaczone linie
  • Alt+Shift+X - po użyciu tego skrótu z lewej u dołu wyskakuje okienko z kolejnymi skrótami uruchamiającymi w różny sposób projekt
  • Ctr+M - Maximize Active View - maksymalizuje okno
  • Ctr+1 - Quick Fix - wyświetla menu z proponowanymi rozwiązaniami jakiegoś błedu
  • Ctr+D - Delete Line - usuwa linię
  • Alt+dół - Move lines down - przenosi linię w dół, można tak samo w górę
  • Ctr+Alt+dół - Copy Lines - kopiuje linie
  • Ctr+T - Quick Hierarchy - umożliwia szybkie przejście do klas dziedziczących lub implementujących zaznaczony element
  • Ctr+Shift+T - Open Type - wyświetla klasę lub interfejs o wpisanej nazwie. Bardzo użyteczne gdy mamy wiele klas w projekcie
  • Ctr+Alt+H - Call Hierarchy - wyświetla wywołania danej metody w innych klasach
  • F3 - Open Declaration - otwiera deklarację
  • F4 - Open Type Hierarchy - działanie takie jak Quick Hierarchy, tylko wyświetla wyniki nowym oknie
  • Ctr+wskazanie myszką - wyświetla się menu, z którego możemy przejść do implementacji lub deklaracji metody lub klasy
  • Alt+Shift+R - Rename - zmienia nazwę metody, zmiennej, czy klasy, uwzględniając wszystkie odwołania do niej
Oczywiście można w ustawieniach (Window->Preferences->General->Keys) zmienić przypisania skrótów klawiaturowych. Np. polecam znaleźć polecenie "Next Editor" i zmienić na Ctr+Tab, bo domyślny skrót nie jest zbyt wygodny.

To tyle jeśli chodzi o podstawowe kwestie wokół środowiska Eclipse. Mając tę wiedzę, tworzenie nieskomplikowanych projektów nie powinno sprawiać problemów :)

1 komentarz :

  1. Witam,
    chcę właśnie rozpocząć przygodę z programowaniem na androida i trafiłem między innymi na tę stronę. Męczę się już drugi dzień i nie mam zielonego pojęcia co powinienem zrobić.
    Java zainstalowana i działa. Wersja 1.8. Eclipse zainstalowane. Problem mam natomiast z programem MAVEN. Wypakowuje plik i nawet po stworzeniu nowej zmiennej w zmiennych systemowych wiersz poleceń wyrzuca mi, ze nie ma takiej komendy ja "mvn" gdy chcę sprawdzić wersję i czy poprawnie "siedzi". No i okazuje się, że nie siedzi.
    Pomożesz? Nawet zacząć nie mogę.
    Chociaż teoretycznie w kursie z programowania nie pisza (narazie), że potrzebuje Mavena.
    Pozdrawiam i liczę na pomoc.

    OdpowiedzUsuń