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 o o groupid Identyfikuje projekt wśród innych projektów. artifactid Nazwa artefaktu (modułu), 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 o o name Nazwa projektu. url Adres strony projektu. 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 o default Odpowiada za zbudowanie (i wdrożenie) projektu. 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 pluginow 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 clean 1 2 Czyści katalog docelowy po kompilacji. Usuwa katalog docelowy. compiler
3 4 5 6 7 Kompiluje kod źródłowy javy surefire uruchamia testy JUNIT, generuje raporty jar Tworzy plik jar dla bieżącego projektu war Tworzy plik war dla bieżącego projektu javadoc Generuje Javadoc dla bieżacego projektu (na podstawie komentarzy w kodzie źródłowym) 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 2 maven-archetype-archetype Archetyp prosty (sample) maven-archetype-j2ee-simple Archetyp uproszczonej aplikacji J2EE
3 maven-archetype-mojo 4 maven-archetype-plugin 5 maven-archetype-plugin-site 6 7 maven-archetype-portlet Archetyp uproszczonej aplikacji JSR-268 Portlet. maven-archetype-quickstart 8 maven-archetype-simple 9 10 11 maven-archetype-site Archetyp do budowy dokumentacji maven-archetype-site-simple Archetyp do budowy dokumentacji uproszczony 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>