Pokazywanie postów oznaczonych etykietą Maven. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Maven. Pokaż wszystkie posty

wtorek, 22 listopada 2011

Maven na szybko

Szybki zbiór informacji pomocnych by szybko zacząć pracę z Mavenem.

Instalacja

1) Binarka dostępna na stronie Apache.
2) Jeśli korzystasz z Spring STS masz już Mavena w katalogu instalacyjnym Eclipse'a.

Konfiguracja

1) Dodaj 'bin' Maven'a do PATH w systemie operacyjnym i dojdaj zmienna systemowa MAVEN_HOME

n.p.:
Ubuntu: wpisz w linii komend
sudo vi ~/.bashrc
dodaj na końcu pliku wpis:
export MAVEN_HOME=/home/jlong/bin/springsource/maven-2.2.1.RELEASE
export PATH=$PATH:$MAVEN_HOME/bin


Zatwierdź zmiany: ESC i wpisz: !wq wciśnij ENTER

Windows 7: w Menu start wpisz 'edit system environment variables'


Następnie przycisk Environment Variables i dopisz w zmiennej Path jak na obrazie poniżej



W ten sam sposób musisz mieć ustawioną zmienna JAVA_HOME wskazująca na katalog instalacji JDK, n.p.: W:\tools\java\jdk1.7.0_01
Potem dodaj nowa zmienną systemową MAVEN_HOME przyciskiem 'New...' w sekcji 'System variables'


Sprawdź instalację wpisując w linii komend:
mvn -version

To powinno zwrócić cos w podobie:
Apache Maven 3.0.3 (r1075438; 2011-02-28 18:31:09+0100)
Maven home: W:\tools\apache-maven-3.0.3\bin\..
Java version: 1.7.0_01, vendor: Oracle Corporation
Java home: W:\tools\java\jdk1.7.0_01\jre
Default locale: en_US, platform encoding: Cp1250
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"


Maven tworzy lokalnie na dysku repozytorium bibliotek potrzebnych do pracy.
Domyślnie jest ono składowane w folderze:
/.m2/repository.

Np. pod Windows C:\Documents and Settings\{user}\.m2\repository

repozytorium może zajmować dużo przestrzeni dyskowej i czasem porządana jest zmiana jego lokalizacji. Można to zrobić w pliku konfiguracyjny Mavena w jego katalogu domowym:
MAVEN_HOME/conf/settings.xml

Należy wpisać:

<localRepository>W:/dev/maven_repo</localRepository>

gdzie podajemy nową lokalizację.

Użycie

Standardowa struktura projektu mvn wygląda tak:
./pom.xml
./src
./src/main
./src/main/java
./src/main/resources
./src/test
./src/test/java
./src/test/resources


POM - Project Object Model, opisuje projekt, zależności, biblioteki używane.























FolderWyjaśnienie
src/main/javakod Java projektu
src/main/resourcespliki konfiguracyjne dla klas Java, np. Spring context .xml
src/test/javakod Java dla testów (np.: JUnit), ten folder nie będzie dołączony w buildzie projektu, jeśli testy nie przejdą build nie będzie zakończony
src/test/resourcespliki konfiguracyjne dla klas testowych

Użycie z linii komend:

Stwórz prosty projekt, z linii komend Linux:

mkdir spring-example1;
cd spring-example1;
mkdir -p src/{test,main}/{java,resources}


Stwórz plik pom.xml






<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.maven</groupId>
<artifactId>spring-example1</artifactId>
<version>1.0-SNAPSHOT</version><name>Simple Project</name></project>

Simple Project

Wejdź z linii komend do folderu głównego projektu, gdize umieściłeś plik pom.xml i wpisz polecenie:

mvn install

Fazy Maven'a:







































FazaWyjaśnienie
validatevaliduje strukture projektu
compilekompiluje kod źródłowy
testuruchamia testy
packagetworzy artifact w katalogu określonym jako 'target'
integration-testdeploy artifaktu w środowisku integracyjnym
integration-testuruchamia walidacje paczki
installinstaluje paczke w lokalnym repozytorium
deploykopiuje artifact na serwer

Build Mavena działa wg. w/w faz. Jego wynikiem jest powstanie paczki/artifactu.
Typ artifactu można zmienić przez tag <packaging> (jar, war, ear).

Aby poinstruować Mavena, żeby wyczyścił wszystko co zainstalował w lokalnym repozytorium i jeszcze raz zbudował artifact w folderze 'target' używamy komendy:

mvn clean install

Identyfikacja artifaktów:



















TagWyjaśnienie
groupIdmoże być to cokolwiek, zwykle jest to nazwa pakietu
artifactIdnazwa artifaktu w ramach tego samego goupId (groupId może być takie samo dla kilku artifaktów które razem tworza jeden system)
Versionversja artifaktu: numer lub SNAPSHOT, np 1.0-SNAPSHOT, rozumiany jest jako "ostatni build wersji 1.0"

Zależności w projekcie dodaje się w tagu <dependencies>








<?xml version="1.0" encoding="UTF-8"?>


  <modelVersion>4.0.0</modelVersion>

  <groupId>org.springsource.greenbeans.maven</groupId>

  <artifactId>example2</artifactId>

  <version>1.0-SNAPSHOT</version>

  <name>Our Simple Project</name>

  <dependencies>

       <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-context</artifactId>

            <version>3.0.5.RELEASE</version>

       </dependency>

  </dependencies>

</project>


Defaultowe ustawienia Mavena modyfikuje sie w tagu <plugins>:

np. aby zmienić wersje kompilatora Java








<?xml version="1.0" encoding="UTF-8"?>


  <modelVersion>4.0.0</modelVersion>

  <groupId>org.springsource.greenbeans.maven</groupId>

  <artifactId>example2</artifactId>

  <version>1.0-SNAPSHOT</version>

  <name>Our Simple Project</name>

  <dependencies>

       <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-context</artifactId>

            <version>3.0.5.RELEASE</version>

       </dependency>

  </dependencies>

  <build>

    <plugins>

      <plugin>

        <groupId>org.apache.maven.plugins</groupId>

        <artifactId>maven-compiler-plugin</artifactId>

        <version>2.3.2</version>

        <configuration>

          <source>1.5</source>

          <target>1.5</target>

        </configuration>

      </plugin>

    </plugins>

  </build>

</project>


Pluginy same w sobie często zawieraja zestaw komend które moga być używane niezależnie od projektu i bez budowania projektu. Składnia jest nastepująca:

Plugins usually provide several specific commands that they provide. To invoke a plugin, you use the following form:
mvn [plugin-name]:[command-name]
np. dependency plugin może wypisać drzewo pokazujące zależności w prjekcie. Uzyj komendy:
mvn dependency:tree
Aby skopiować wszystkie zależności potrzebne w projekcie do jednego folderu w target/dependencies użyj komendy:
mvn dependency:copy-dependencies

Użycie z Spring STS:

Zaimportuj stworzony wyżej projekt w Spring STS:

File > Import..



Naspępnie znajdź folder domowy z plikiem pom.xml i Finish


* Jeśli używasz Javy 7 do uruchamienia Spring STS możliwe, że otrzymasz błąd opisany tutaj. Opisany sposób naprawy pomógł. Dodaj wspomniany parametr ("-Djava.util.Arrays.useLegacyMergeSort=true") w pliku STS.ini w folderze sts-x.x.x.RELEASE w zależności od swojej wersji Spring STS (np. sts-2.7.2.RELEASE)

Project Javowy

1. maven-compiler-plugin - kompilowanie Javy

konfiguracja:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<executable>${JAVA_1_4_HOME}/bin/javac</executable>
<compilerVersion>1.3</compilerVersion>
</configuration>
</plugin>
</plugins>
</build>
...
</project>

użycie:

mvn compile

lub żeby skombilować testy:

mvn test-compile

2. exec-maven-plugin - uruchamianie klas Javy

konfiguracja:


<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1.1</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>com.example.App</mainClass>
<arguments>
<argument>arg0</argument>
<argument>arg1</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

użycie:

dla fazy nazwanej jak wyżej 'test' uruchamiamy klasę  com.example.App poleceniem:

mvn test

Tutaj inne zaawansowane przykłady

Zależności w projektach Maven

Jak stworzyć moduł Maven o groupId=example.group zawierający 2 podrzędne moduły o nazwach example.module1 i example.module2 należące do grupy example.group ?
Oto kroki:

1. mvn archetype:create -DgroupId=example.group -DartifactId=example.group.core

2. cd example.group.core

w stworzonym pliku pom.xml zmieniamy typ paczki na


<packaging>pom</packaging>


usuwamy folder src

3. cd example.group.core
4.
mvn archetype:create -DgroupId=example.group -DartifactId=example.module1
mvn archetype:create -DgroupId=example.group -DartifactId=example.module2

5.

Nowe moduły dodajemy do głównego pom.xml w folderze 'example.group.core'


<modules>
<module>example.module1</module>
<module>example.module2</module>
</modules>


W plikach pom.xml w podmodułach example.module1 i example.module2 dodajemy odniesienie do głównego modułu:


<parent>
<groupId>example.group</groupId>
<artifactId>example.group.core</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>


Tak stworzoną strukturę możemy zaimportować jako projekt Maven w Eclipse (jeśli zainstalowaliśmy plugin Mavena)
Możemy też z lini komend zbudować projekt i wygenerować pliki konfiguracyjne Eclipse:

mvn install
mvn eclipse:eclipse