Maven-projektia täydennetty

Vastoin edellisen artikkelini suuntaviivoja, päätin täydentää edellistä Maven-projektiani kattamaan esimerkiksi resurssien suodattamisen ja paketoinnin. Uusi paketti on saatavissa tästä linkistä:

jarproject-2014-04-13.zip

Tarkastellaan sen pom.xml-tiedostoa, joka näyttää tältä:

<?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>fi.mikkonummelin</groupId>
    <artifactId>jarproject</artifactId>
    <packaging>jar</packaging>
    <version>1.3-SNAPSHOT</version>
    <name>${project.artifactId}</name>
    <url>http://www.mikkonummelin.fi</url>
    <scm>
        <developerConnection>scm:git:file:///home/mnummeli/Asiakirjat/java/jarproject</developerConnection>
        <tag>HEAD</tag>
    </scm>
    <properties>
        <commons-logging.version>1.1.3</commons-logging.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>${commons-logging.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>fi.mikkonummelin.jarproject.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptors>
                        <descriptor>src/main/assembly/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>fi.mikkonummelin.jarproject.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
    <distributionManagement>
        <repository>
            <id>Local Releases</id>
            <name>My Local Releases Repository</name>
            <url>file:///home/mnummeli/maven-releases</url>
        </repository>
    </distributionManagement> 
</project>

Uusina elementteinä siellä ovat ensinnä scm ja properties-osiot, joilla otetaan kantaa käytettävään versionhallintamalliin ja sellaisiin ominaisuuksiin, joihin halutaan viitata muuttujan nimellä resursseja suodatettaessa. maven-jar-pluginissa on nyt määritelty manifesti, jossa on luokkapolku ja pääasiallisesti ajettava Java-luokka, joka sisältää main-metodin. maven-assembly-pluginiin on vastaavasti määritelty, että se hakee loput määrityksensä assembly.xml-tiedostosta ja että se ajetaan samalla kun tehdään muutakin paketointia. resources-osiossa on määritelty resurssit suodatettaviksi ja distributionManagement-osiossa on määritelty se versionhallintaohjelman tietovarasto, johon voidaan tehdä paketista uusia julkaisuja ensisijaisesti.

Pakettien rakenteita kuvaava uusi assembly.xml näyttää tältä:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <id>jarproject</id>
    <formats>
        <format>dir</format>
        <format>zip</format>
    </formats>
    <fileSets>
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.build.directory}/classes</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>*.properties</include>
                <include>*.sh</include>
            </includes>
        </fileSet>
    </fileSets>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>commons-logging:commons-logging</include>
            </includes>
        </dependencySet>
    </dependencySets>
</assembly>

Siinä määritellään, käytännössä, minkätyyppisiä paketteja halutaan tehdä (zip ja tavallinen hakemisto), kohdassa fileSets määritellään, mitkä tiedostot kopioidaan mihinkin hakemistoon ja kohdassa depencencySets määritellään, mitkä projektin riippuvuus-jar-paketit kopioidaan mihinkin hakemistoon. Uusi tiedosto jarproject.properties on tarkoitettu pelkkään versionumeron siirtoon ja jarproject.sh käynnistysskriptiksi. Kannattaa tutkia koodia tältä osin itse.

Projekti on mahdollista kääntää käskyllä mvn clean install. Jos projektipohjasta haluaa itselleen uuden arkkityypin, sen voi tehdä kirjoittamalla mvn archetype:create-from-project. Tällöin target-hakemistoon muodostuu asennettava arkkityypin lähdekoodipohja. Kirjoittamalla tämän jälkeen cd target/generated-sources/archetype/ päästään arkkityypin hakemistoon ja käskyllä mvn install se asennetaan paikalliseen Maven-tietovarastoon. Sitä voi käyttää hyödyksi myöhemmin kirjoittamalla

$ mvn archetype:generate -DarchetypeCatalog=local