Skip to content

Maven

Maven – narzędzie służące do budowania oraz zarządzania aplikacjami opartymi na Javie.

Jego główne założenia:

  • Ułatwienie procesu budowania
  • Dostarczenie jednolitego środowiska budowania
  • Dostarczenie jakości informacji projektowych
  • Dostarczenie wytycznych związanych z dobrymi praktykami programowania
  • Zapewnienie łatwego przejścia na nowsze rozwiązania

Po utworzeniu projektu w celu nadania mu natury Mavena, do naszej przestrzeni roboczej musimy dodać plik konfiguracyjny pom.xml. Początkowo można nadać mu następującą strukturę:

<project>
    <name>MavenProject</name>
    <groupId>com.company</groupId>
    <artifactId>MavenProject</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
</project>
  • name – dowolna nazwa projektu
  • groupId – początkowy fragment pakietu aplikacji
  • artifactId – unikalny identyfikator projektu
  • version – wersja aplikacji
  • modelVersion – wersja schematu pliku XML
  • packaging – docelowy format pakowania naszej aplikacji

Podstawowe cele (goals) Mavena:

  • clean – usuwa folder target, który jest generowany przez Mavena
  • compile – kompiluje pliki źródłowe oraz kopiuje do podfolderów target
  • package – w pierwszej kolejności kompiluje wszystkie pliki z kodami źródłowymi, a następnie pakuje program do wybranego formatu

Do kompilacji używamy polecenia mvn compile. Chcąc więc skompilować program z wykorzystaniem Mavena, w konsoli wpisujemy np.: clean compile

Maven pozwala w niemal automatyczny sposób pobierać zewnętrzne biblioteki do projektu. W tym celu należy dodać odpowiednią zależność do pliku pom.xml:

<project>
    <name>MavenProject</name>
    <groupId>com.company</groupId>
    <artifactId>MavenProject</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-parent</artifactId>
            <version>3.0.8.RELEASE</version>
        </dependency>
    </dependencies>
</project>

Należy jednak pamiętać o zależnościach tranzytywnych i możliwości wystąpienia konfliktu pomiędzy wersjami bibliotek (jeżeli pobierana przez nas biblioteka używa przechodnio innej bliblioteki w nowszej wersji, a ręcznie mimo to dodamy później starszą wersję, to ta pierwsza zostanie zignorowana).

Kolejną zaletą Mavena, jest możliwość korzystania z pluginów. Pozwalają one na np. automatyczne uruchamianie testów jednostkowych lub generację dokumentacji JavaDoc. W celu dodania pluginu:

<project>
    <name>MavenProject</name>
    <groupId>com.company</groupId>
    <artifactId>MavenProject</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
    
   <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>package.ClassName</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

W celu pakowania aplikacji, która zawiera już inne zależności można skorzystać z Apache Maven Assembly Plugin.

Aplikacje Mavena posiadają swój cykl życia. Posiadając tę wiedzę, możemy zdecydować, której fazy mają dotyczyć dodawane przez nas zależności, np:

<plugin>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <id>default-jar</id>
            <phase>package</phase>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Ostatnią rzeczą, która jest konieczna, aby w stopniu minimalnym pojąć istotę Mavena, są zasięgi zależności. Ich wykorzystanie umożliwia łatwe odseparowanie np. bibliotek potrzebnych wyłącznie do wykonania testów od tych, które są niezbędne samej aplikacji.

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>group-a</groupId>
      <artifactId>artifact-b</artifactId>
      <version>1.0</version>
      <type>bar</type>
      <scope>runtime</scope>
    </dependency>
  </dependencies>
</project><span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">​</span>

Wpis zawiera jedynie ścisłe podstawy, mogące wskazać drogę dalszej nauki korzystania z tego niezwykle przydatnego narzędzia.

Facebooktwitterredditlinkedinmail
Published inJavaNarzędzia