Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle...

18
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.

Transcript of Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle...

Page 1: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

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.

Page 2: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,
Page 3: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,
Page 4: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

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

Page 5: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

`-- 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.

Page 6: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

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.

Page 7: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

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>

Page 8: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

<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

Page 9: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

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

Page 10: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

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

Page 11: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

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

Page 12: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

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>

Page 13: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

<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

Page 14: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

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”

Page 15: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

<?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>

Page 16: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

<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>

Page 17: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

</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”

Page 18: Narzędzia budowy aplikacji Javaandrzej.ae.jgora.pl › materialy › inzynieria › maven gradle ivy...8. deploy Wdrożenie (rozmieszczenie) artefaktu, przykładowo na serwer aplikacji,

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>