Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

Compiling Using Maven

To compile izpack using Maven, use the izpack-maven-plugin. There is good documentation at the izpack-maven-plugin page, but this page will describe how to use the most recent izpack plugin (5.0.0-beta9 at the time of this writing).

I'll assume you have some custom izpack panels, but if you don't, you can omit some of the steps that we go over here:

Using Custom Panels

If you have custom panels, you'll want to put them in their own Maven module. This module should be a standard Maven project, but you should include izpack as a provided dependency:

<dependencies>
<dependency>
<groupId>org.codehaus.izpack</groupId>
<artifactId>izpack-compiler</artifactId>
<version>${izpack.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>

We use scope = provided because we only need Maven to use the izpack dependency at compile time. In this project, you can create your custom IzPack panels. Be sure that the Java package names that contain your custom IzPack panels begin with "com", "net", or "org", or else they will not be able to be loaded by your IzPack installer.

Creating the IzPack Installer Module

Now, create a separate Maven module that will produce your izpack installer.

The basic strategy we'll use is this:

  1. We'll configure our Maven pom to create a "staging" area that will contain our izpack descriptor and all of our installer resources, including the jars that we want to package in our installer. 
    1. We will use the Maven maven-antrun-plugin to copy our izpack descriptor file and resources into this "staging" area. 
    2. We'll use the maven-dependency-plugin to copy the jar with our custom panels, and any other jar dependencies that we want in our installer. We'll configure two different "executions" of the maven-dependency-plugin; we'll have this plugin copy our application jars into one location, and the custom panel jars into a separate location.
  2. We'll then configure the izpack-maven-plugin to point it to our staging area and our installer descriptor.
Ok, let's get started.
Create "izpack.staging" Property
We'll be referencing the staging area location a few times in the pom, so let's configure it as a pom property to make things clearer. Put this in your pom file:
<properties>
<izpack.staging>${project.build.directory}/staging</izpack.staging>
</properties>

(Note that ${project.build.directory} typically references the compilation ./target/ directory of your module.)

Add Your Dependencies

We'll want to add at least two dependencies–one will be the dependency that contains your custom panel, the other(s) will be the dependency that contains your actual Java application. My dependencies look like this:

<dependencies>
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>myapplication</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>mycustompanels</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
Configure the maven-antrun-plugin

We'll use the maven-antrun-plugin to copy our installer descriptor and installer resources (images, text files, etc.) into our "staging" area.

Put your installer descriptor and resources underneath src/izpack in your module. In your pom's <build> section, configure maven-antrun-plugin to copy this entire directory to our staging area:

   <plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>create-staging-area</id>
<phase>process-resources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<copy todir="${izpack.staging}">
<fileset dir="${basedir}/src/izpack"/>
</copy>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
Configure the maven-dependency-plugin

We'll configure the maven-depenency-plugin to copy both our application jars and the jar with our custom panel. Here's how it looks (see the inline XML comments for more details):

   <plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<!-- copy *application* jars to izpack staging lib -->
<id>copy-product-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${izpack.staging}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>true</stripVersion>
<overWriteReleases>true</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<excludeScope>system</excludeScope> <!-- this excludes tools.jar, e.g. -->
<excludeArtifactIds>mycustompanels</excludeArtifactIds> <!-- IMPORTANT: don't copy custom panels where our application jars live -->
                      <excludeGroupIds>org.codehaus.izpack</excludeGroupIds> <!-- IMPORTANT: we don't want to copy the izpack dependency where our application jars live -->
</configuration>
</execution>
<execution>
<!-- copy izpack custom (custom panels, etc.) jars to izpack staging custom -->
<id>copy-izpack-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${izpack.staging}/custom</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>true</stripVersion>
<overWriteReleases>true</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<includeArtifactIds>mycustompanels</includeArtifactIds> <!-- IMPORTANT: this causes *only* our custom panels to be copied -->
</configuration>
</execution>
</executions>
</plugin>

Some key points:

  • The first execution section configures copying our application jars to the lib/ directory under our staging directory (i.e., target/staging/lib). Note that we have to explicitly exclude the izpack dependency as well as our custom panels dependency. We don't need these showing up in our installed application!
  • The second execution section configures copying our custom panels jar to the custom/ directory under our staging directory (i.e., target/staging/custom). Note that we explicitly include our custom panels dependency so that no other jars are copied to custom/. It wouldn't hurt anything if this happened, but why do unnecessary work?
The maven-dependency-plugin is very configurable. You may need to customize some of this configuration for your own purposes.
Configure the izpack-maven-plugin

TODO

<plugin>
<groupId>org.codehaus.izpack</groupId>
<artifactId>izpack-maven-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals><goal>izpack</goal></goals>
<configuration>
<!-- base for relative paths in izpack descriptor -->
<baseDir>${izpack.staging}</baseDir>
<installFile>${basedir}/src/izpack/install.xml</installFile>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.codehaus.izpack</groupId>
<artifactId>izpack-panel</artifactId>
<version>${izpack.version}</version>
</dependency>
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>mycustompanels</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</plugin>

Some key points:

  • TODO

Summary

When finished, the entire build section of our pom should look something like this:

<build>
<plugins>
<!-- copy izpack resources into izpack staging area, expected by izpack.xml -->
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>create-staging-area</id>
<phase>process-resources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<copy todir="${izpack.staging}">
<fileset dir="${basedir}/src/izpack"/>
</copy>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<!-- copy product jars to izpack staging lib -->
<id>copy-product-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${izpack.staging}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>true</stripVersion>
<overWriteReleases>true</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<excludeScope>system</excludeScope> <!-- this excludes tools.jar, e.g. --> 
                      <excludeArtifactIds>mycustompanels</excludeArtifactIds>
<excludeGroupIds>org.codehaus.izpack</excludeGroupIds>
</configuration>
</execution>
<execution>
<!-- copy izpack custom (custom panels, etc.) jars to izpack staging custom -->
<id>copy-izpack-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${izpack.staging}/custom</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>true</stripVersion>
<overWriteReleases>true</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<includeArtifactIds>mycustompanels</includeArtifactIds>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.izpack</groupId>
<artifactId>izpack-maven-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals><goal>izpack</goal></goals>
<configuration>
<!-- base for relative paths in izpack descriptor -->
<baseDir>${izpack.staging}</baseDir>
<installFile>${basedir}/src/izpack/install.xml</installFile>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.codehaus.izpack</groupId>
<artifactId>izpack-panel</artifactId>
<version>${izpack.version}</version>
</dependency>
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>mycustompanels</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>

 

Troubleshooting

TODO

References

[1] http://izpack.codehaus.org/izpack-maven-plugin/

[2] https://github.com/aspear/izpack5-example-installer

  • No labels