Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle...
Transcript of Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle...
Narzędzia budowy aplikacji Java
Narzędzi budowy
Narzędzia budowy (kompilacji) jest to narzędzie, które automatyzuje proces oprogramowanie
projektu budowlanego. Budowanie projektu zazwyczaj zawiera jedno lub więcej z działań:
generowanie kodu źródłowego (Jeśli automatycznie wygenerowany kod jest używany
w projekcie).
Generowanie dokumentacji z kodu źródłowego.
Kompilowanie kodu źródłowego.
Pakowania skompilowanego kodu do plików JAR lub plików ZIP.
Instalowanie pakietów kodu na serwerze, w repozytorium lub gdzieś indziej.
Stworzenie projektu maven-owego
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -
DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
w Eclipse wystarczy albo new maven project albo configure | convert to maven
project albo run as maven … (profile) eclipse:install
Struktura projektu
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<properties>
<!-- jar versions, for dependency management -->
<version.seam>2.2.2.Final</version.seam>
<version.drools>5.0.1</version.drools>
<version.jboss.embedded>beta3.SP9</version.jboss.embedded>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
o groupId
Identyfikuje projekt wśród innych projektów.
o artifactId
Nazwa artefaktu (modułu),
o version
Numer wersji. SNAPSHOT, jeśli wersja jest jeszcze rozwijana.
Para groupId i artifactId powinna być unikalna
Maven wykorzystuje informację z pliku pom.xml (Project Object Model) do budowania
projektu. Plik zawiera tag project, w którym obowiązkowo muszą znaleźć się tagi
modelVersion o wartości 4.0.0 (aktualnie wspierana wersja), groupId, artifactId, version
oraz tagi opcjonalne
o packaging
Określa co ma zostać zbudowane, w tym przypadku plik jar. Jeśli tworzymy aplikację
webową będzie to war.
o name
Nazwa projektu.
o url
Adres strony projektu.
o properties
Miejsce na wartości, których możemy używać w innych miejscach pliku pom.xml za
pomocą ${nazwa_ustawienia}.
<name>${project.groupId} : ${project.artifactId} :
${project.version}</name>
o dependencies
Zależności, czyli biblioteki których używamy w projekcie,
Zależności i repozytoria to jeden z podstawowych mechanizmów. Maven wykonuje
sprawdzenia zależności wymagaych przez projekt. Zależności to zewnętrzne pliki JAR
(biblioteki Java). Jeśli zależności nie znajdują się w lokalnym repozytorium Maven pobiera je
z centralnego repozytorium i umieszcza je w lokalnym repozytorium. Lokalne repozytorium
jest to po prostu katalogu na dysku twardym komputera. Można również określić adres
zdalnego repozytorium na potrzeby pobierania zależności.
Cykl życia
Jest to najważniejsza idea, na której opiera się Maven. Definiuje proces budowania i dystrybucji
projektów. Istnieją trzy wbudowane cykle życia:
o default
Odpowiada za zbudowanie (i wdrożenie) projektu.
o clean
Czyści projekt, usuwa stare, niepotrzebne pliki.
o site
Generuje stronę z dokumentacją projektu.
Domyślny cykl życia w uproszczeniu zawiera fazy:
1. validate
Sprawdzenie czy kod jest poprawny i czy projekt zawiera wszystkie niezbędne
informacje np. odpowiednie zależności. Jeśli używamy jakiejś biblioteki, musimy ją
zadeklarować w pliku pom.xml, w innym przypadku ta faza zakończy się błędem i
proces budowania zostanie przerwany.
2. compile
Podczas tej fazy kompilowany jest kod źródłowy projektu.
3. test
Skompilowany kod jest poddawany testom jednostkowym wykorzystując dołączone
biblioteki do testów.
4. package
Tworzony jest wynikowy plik, jar/war (lub z wykorzystaniem odpowiednuch plugin-
ow np. ear).
5. integration-test
Spakowany kod poddawany jest testom integracyjnym. Jeśli testy tego wymagają to
paczka wdrażana jest na specjalne środowisko, umożliwiające uruchomienie testów.
6. verify
Sprawdzana jest poprawność utworzonego artefaktu.
7. install
Artefakt jest instalowany w lokalnym repozytorium. Dzięki temu można
go wykorzystać go jako zależność w innym projekcie.
8. deploy
Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji, czy do
zdalnego repozytorium.
Profile Maven-a (Build Profiles)
Profile umożliwiają tworzenie projektu w różnych konfiguracjach. Zamiast tworzenia dwóch
osobnych plików POM, można po prostu określić profil z konfiguracji i inaczej kompilować,
budowa i rozmieszczać ten sam projekt w różnych profilach (np. rozmieszczanie na serwer
produkcyjny i na serwer testowy – UAT)
Każdy profil kompilacji jest opisany w pom-ie w tagu <profile>.
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0.0</version>
<profiles>
<profile>
<id>test</id>
<activation>...</activation>
<build>...</build>
<modules>...</modules>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<dependencies>...</dependencies>
<reporting>...</reporting>
<dependencyManagement>...</dependencyManagement>
<distributionManagement>...</distributionManagement>
</profile>
</profiles>
</project>
Profil opisuje, jakie zmiany powinny być wprowadzone w pliku POM podczas
wykonywania w ramach tego profilu. To może być np. zmiana pliku konfiguracji aplikacji albo
adresu serwera. Znaczniki w <profile> spowodują zastąpienie wartości znaczników o tej samej
nazwie zdefiniowanych domyślnie w POM. W znaczniku <profile> często występuje znacznik
<activation>. Ten znacznik opisuje warunek wyzwalający dla budowy tego profilu (np. inna
budowa dla innych wersji Javy) . Profil może być bezpośrednio wskazany w pliku settings.xml.
lub poprzez parametr - P w wierszu polecenia MVN . W Eclipse w Eclipse w run as maven
…
Plugin-y (wtyczki)
Maven można również traktować jako środowisko pluginów w którym każde zadania jest
faktycznie wykonane przez wtyczki. Wtyczki Maven są zazwyczaj używane do
Tworzenia pliku jar
Tworzenia pliku war
Tworzenia pliku ear
Kompilacji kodu
Testów jednostkowych
Tworzenia dokumentacji
Tworzenia raportów
Wtyczka zawiera zazwyczaj szereg celów, które mogą być wykonywane przy użyciu
następującej składni:
mvn [plugin-name]:[goal-name]
Na przykład projekt Java może zostać skompilowany z wtyczką kompilatora, uruchamiając
następujące polecenie.mvn
compiler:compile
Maven provided the following two types of Plugins −
Wtyczki kompilacji (budowy)
Wywoływane podczas budowania projektów, połączone ze znacznikiem <build/> w pom.xml.
Wtyczki raportów
Wywoływane podczas tworzenia dokumentacji projektów (faza site), połączone ze
znacznikiem <reporting/> w pom.xml.
Najpopularniejsze wtyczki
1
clean
Czyści katalog docelowy po kompilacji. Usuwa katalog
docelowy.
2 compiler
Kompiluje kod źródłowy javy
3 surefire
uruchamia testy JUNIT, generuje raporty
4 jar
Tworzy plik jar dla bieżącego projektu
5 war
Tworzy plik war dla bieżącego projektu
6
javadoc
Generuje Javadoc dla bieżacego projektu (na podstawie
komentarzy w kodzie źródłowym)
7
antrun
Uruchamia kod ANT w dowolnej fazie budowy
W przykladzie maven-antrun-plugin wyświetla dodatkowy komunikat
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>id.clean</id>
<phase>clean</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>jestem w fazie czyszczenia</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
C:\MVN\project>mvn clean
Efekt:
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------
[INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0
[INFO] task-segment: [post-clean]
[INFO] ------------------------------------------------------------------
[INFO] [clean:clean {execution: default-clean}]
[INFO] [antrun:run {execution: id.clean}]
[INFO] Executing tasks
[echo] jestem w fazie czyszczenia
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Sat Jul 07 13:38:59 IST 2012
[INFO] Final Memory: 4M/44M
[INFO] ------------------------------------------------------------------
Filtry zamiast ustawień
Deklaracja
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<executions>
<execution>
<configuration>
<files>
<file>../src/main/filters/filter-${env}.properties</file>
</files>
</configuration>
</execution>
</executions>
Definicja w pliku properties
jdk.debug =false
client.version=1.0.98
jdk.optimize=false
jdk.source =1.8
jdk.target =1.8
app.debug =false
app.unpack.modules=true
remote-external-user=
Odwołanie:
<modules>
<webModule>
<groupId>${project.groupId}</groupId>
<artifactId>seam-netclinic-war</artifactId>
<contextRoot>/${app.web.context}</contextRoot>
<unpack>${app.unpack.modules}</unpack>
</webModule>
Hierarchia Pom-ów
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<relativePath>../my-parent</relativePath>
</parent>
<artifactId>my-project</artifactId>
...
</project>
POM niższy w hierarchii może zmieniać ustawienia z POM-u nadrzędnego. Wystarczy tylko
jeszcze raz zdefiniować ustawienie.
Efektywny POM
Mechanizm dziedziczenia POM powoduje może być trudno się dowiedzieć, jak całkowity
(efektywny) plik POM wygląda, gdy wykonuje do Maven. Efektywny plik POM (wynik
wszystkich dziedziczeń) nazywa się skutecznym POM lub efektywnym POM. Maven może
pokazać skuteczny POM, za pomocą polecenia
mvn help:effective-pom
W Eclipse przedostatnia zakładka w widoku edytora to efektywny POM
Archetypy (szablony) – nie mylić z artefaktami (modułami)
1 maven-archetype-archetype
Archetyp prosty (sample)
2 maven-archetype-j2ee-simple
Archetyp uproszczonej aplikacji J2EE
3 maven-archetype-mojo
4 maven-archetype-plugin
5 maven-archetype-plugin-site
6 maven-archetype-portlet
Archetyp uproszczonej aplikacji JSR-268 Portlet.
7 maven-archetype-quickstart
8 maven-archetype-simple
9 maven-archetype-site
Archetyp do budowy dokumentacji
10 maven-archetype-site-simple
Archetyp do budowy dokumentacji uproszczony
11 maven-archetype-webapp
Archetyp uproszczonej aplikacji Web
Eclipse „nie widzi artefaktów”
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0
http://maven.apache.org/xsd/settings-1.1.0.xsd">
<profiles>
<profile>
<id>java-net-public</id>
<repositories>
<repository>
<id>java-net-public</id>
<name>Java Net Public</name>
<url>https://maven.java.net/content/groups/public/</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<updatePolicy>never</updatePolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>java-net-public</id>
<name>Java Net Public</name>
<url>https://maven.java.net/content/groups/public/</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<updatePolicy>never</updatePolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
<profile>
<id>securecentral</id>
<!--Override the repository (and pluginRepository) "central" from the
Maven Super POM -->
<repositories>
<repository>
<id>central</id>
<url>http://repo1.maven.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://repo1.maven.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
</profile>
…………….
</profiles>
<activeProfiles>
<activeProfile>java-net-public</activeProfile>
<activeProfile>securecentral</activeProfile>
…
</activeProfiles>
</settings>
Wyszukiwanie “ręczne”
Zasoby zewnętrzne (niezalecane)
Zależność zewnętrzna w Maven jest to biblioteka (w pliku JAR), która nie znajduje się w
repozytorium Mavena (lokalnym, centralnym lub zdalnym repozytorium). Może znajdować się
gdzieś na lokalnym dysku twardym, na przykład w katalogu lib webapp, lub gdzieś indziej.
Słowo "zewnętrzny" oznacza zatem zewnętrznych do systemu repozytorium Maven - nie tylko
zewnętrzne do projektu. Większość zależności są zewnętrzne do projektu, ale niewielu jest
zewnętrznych do systemu repozytorium (nie znajduje się w repozytorium). Można
skonfigurować zależności zewnętrznych w sposób zbliżony do poniższego:
<dependency>
<groupId>mydependency</groupId>
<artifactId>mydependency</artifactId>
<scope>system</scope>
<version>1.0</version>
<systemPath>${basedir}\war\WEB-INF\lib\mydependency.jar</systemPath>
</dependency>