Maven - podstawowa konfiguracja i generowanie pliku JAR

Posted on 25 September, 2018 at 19:59

Tags: Java


Maven - podstawowa konfiguracja i generowanie pliku JAR

Uruchomienie aplikacji bez generowania pliku JAR

Na początku musimy stworzyć statyczną metodę w głównej klasie aplikacji.

package pl.devtomek;

public class App {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

Następnie tworzymy plik pom.xml w głównym katalogu aplikacji o następującej treści:

<?xml version="1.0" encoding="UTF-8"?>
<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>pl.devtomek</groupId>
    <artifactId>myproject</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <exec.mainClass>pl.devtomek.App</exec.mainClass>
    </properties>

</project>

gdzie pl.devtomek.App to lokalizacja naszej głównej klasy, która zawiera statyczną metodę main().

Aby uruchomić projekt musimy otworzyć terminal w głównym katalogu aplikacji i wpisać następującą komendę:

mvn clean compile exec:java

W terminalu powinien pojawić się tekst o treści Hello World!.

Generowanie piku JAR

W celu wygenerowania pliku JAR musimy dodać plugin o nazwie maven-jar-plugin do naszego projektu oraz atrybut packaging, który określa typ wygenerowanego pliku, a dokładniej mówiąc archiwum JAR. Dodatkowo w konfiguracji pluginu musimy wskazać ścieżkę do głównej klasy aplikacji.

<?xml version="1.0" encoding="UTF-8"?>
<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>pl.devtomek</groupId>
    <artifactId>myproject</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>pl.devtomek.App</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Teraz możemy wygenerować plik JAR za pomocą następującej komendy:

mvn clean package

Archiwum zostało wygenerowane i zapisane w katalogu target. Wygenerowany plik JAR uruchamiamy za pomocą poniższej komendy:

java -jar ./target/myproject-1.0-SNAPSHOT.jar
Nazwa pliku generowana jest automatycznie na podstawie konwencji {artifactId}-{version}.

Generowanie pliku JAR z wszystkimi zależnościami

Czasami istnieje konieczność dodania wielu zależności do projektu (ang. dependencies), co oznacza że musielibyśmy wygenerować wiele plików JAR, które następnie musielibyśmy statycznie podlinkować do naszej głównej aplikacji. Aby uniknąć takiej sytuacji możemy posłużyć się pluginem o nazwie maven-shade-plugin, który generuje tylko jeden plik JAR zawierający wszystkie zależności.

<?xml version="1.0" encoding="UTF-8"?>
<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>pl.devtomek</groupId>
    <artifactId>myproject</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>pl.devtomek.App</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

Generowanie pliku JAR oraz uruchamianie aplikacji przebiega tak samo jak poprzednio.

Przekazywanie parametrów do aplikacji

W celu przekazywania parametrów do aplikacji musimy dodać dodatkowy atrybut o nazwie -Dexec.args podczas uruchamiania aplikacji np.:

mvn clean compile exec:java -Dexec.args="Hello World!"

Po zmodyfikowaniu głównej klasy App, a dokładnie mówiąc metody main() do poniższej formy na ekranie terminala zostaną wypisane przekazane parametry w formie tekstu.

package pl.devtomek;

import java.util.Arrays;

public class App {
    public static void main(String[] args) {
        Arrays.stream(args).forEach(System.out::print);
    }
}

W naszym przypadku zostanie wypisany napis o treści Hello World!.


Please provide a valid nick.
Please provide a valid content.

* These fields are required.