Warning: Creating default object from empty value in /chroot/home/zerotohe/zerotohero.hu/html/wp-content/themes/salient/nectar/redux-framework/ReduxCore/inc/class.redux_filesystem.php on line 29
Build plugins | zeroToHero

Build plugins

By 2014.12.10Maven

Sziasztok!

Korábbi bejegyzésünkben megismerkedtünk a Maven dependenciákkal, valamint a repository-kal. Most elsőként szeretném bemutatni a property-ket, melyek segítségével különböző környezeti változókat érhetünk el, illetve hozhatunk létre saját, a projektre érvényes változókat is (vagyis explicit értékeket helyettesíthetünk velük). Ezek után a build plugin-eket ismerheted meg, melyek lehetővé teszik különböző kiegészítő eszközök használatát.

 

Property-k

A property-kre ${property_név} formában tudunk hivatkozni. Segítségükkel egyszerűbbé tehetjük Maven projektjeink karbantartását, valamint megkönnyíthetjük hordozhatóságát. Például, ha néhány dependencia szorosan kapcsolódik egymáshoz, s azt szeretnénk, ha mind ugyanazt a verziószámú verziót használják, akkor azt a verziószámot beleírhatjuk egy property-be, így a későbbiekben csak egy helyen kell megváltoztatni azt. De a property-k segítségével használhatjuk projektünk környezeti változóit is (például a pom fájlt tartalmazó könyvtár), annak érdekében, hogy a projekten dolgozó összes fejlesztő változtatás nélkül tudja használni a pom fájlt. Végső soron több féle property különböztethető meg:

  • Beépített property-k:
    • ${basedir} a pom fájlt tartalmazó könyvtár-t reprezentálja
    • ${version} a projekt verziószámát reprezentálja
  • Projekt property-k: A projektünkre vonatkozó, automatikusan létrejövő property-k. Például: ${project.name}
  • Rendszerünk környezeti változóira is hivatkozhatunk. Például: ${java.home}, ${env.M2_HOME}
  • Saját magunk is hozhatunk létre property-ket a pom fájlban a <properties>…</properties> tag-ek között.

De lássuk a fent említett verziószámos példát:


    <properties>
        <vaadin.version>7.3.2</vaadin.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.vaadin</groupId>
            <artifactId>vaadin-server</artifactId>
            <version>${vaadin.version}</version>
        </dependency>
        <dependency>
            <groupId>com.vaadin</groupId>
            <artifactId>vaadin-client-compiled</artifactId>
            <version>${vaadin.version}</version>
        </dependency>
        <dependency>
            <groupId>com.vaadin</groupId>
            <artifactId>vaadin-themes</artifactId>
            <version>${vaadin.version}</version>
        </dependency>
        <dependency>
            <groupId>com.vaadin</groupId>
            <artifactId>vaadin-maven-plugin</artifactId>
            <version>${vaadin.version}</version>
        </dependency>
    </dependencies>

A property-ket továbbá a resource-ok kezelésében is fontos szerepet játszanak. Na de mik is azok a resource-ok? A resource-nak hívjuk a projektünk által használt, nem java forrásállományokat, például különböző xml leírókat, property fájlokat, vagy akár képeket is. A property-k segítségével a resource-ok könnyen paraméterezhetőek lesznek, ez által projektünk hordozhatóbbá válik (például elképzelhető, hogy az egyik fejlesztő Windows-t a másik Linuxot használ, s ez esetben a resource-ok elérési útvonala eltérhet).

Build Plugin-ek

A Maven alapvetően egy pluginekkel modularizált rendszer, vagyis a pom.xml értelmezésétől eltekintve, projektjeink gyakorlatilag plugin-ek futtatásának eredményeképp jönnek létre. Például az install plugin segítségével lefordíthatjuk és lokálisan installálhatjuk projektünket. Ám rengeteg olyan plugin létezik, melyeket alapvetően nem használnak a projektek, de kézzel beköthetjük őket. Pom fájlunk <build>…</build> tag-ekkel határolt részében adhatunk meg mindenféle, a fordítási folyamattal kapcsolatos beállítást, például build plugin-eket is itt húzhatunk be a projektbe. Az alábbi példában, az előző blogbejegyzésben található demo pom fájlját egészítjük ki két build plugin használatával.

  • A maven-jar-plugin segítségével többek közt megadhatjuk, hogy mely osztályunkban található a main metódus, mivel a plugin használata nélkül a jar fájlok futtatásakor kellene ezt megadni (pl. mvn exec:java -Dexec.mainClass=”hu.zerotohero.MavenDemo”).
  • A maven-dependency-plugin a dependenciák kezeléséért felel. A copy-dependencies goal felel azért, hogy a repositoryból, projektünk egy meghatározott könyvtárába kerüljenek a felhasznált dependenciák.

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>hu.zerotohero.MavenDemo</mainClass>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.8</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

Amint láthatod a <plugins>…</plugins> tag-ek között kell felsorolni a különböző plugineket. Hasonlóan a dependenciákhoz, mindig meg kell adni plugin-ek  groupId-át, artifactId-át és verziószámát. A configuration részben a plugin különböző tulajdonságait állíthatjuk be, míg az executions részben a build folyamatot lehet befolyásolni.