In the Section 6.8, “Running the Simple Weather Program” section earlier in descriptor in the Maven Assembly plugin to produce a distributable JAR file, which contains the project’s bytecode and all of the dependencies.
The Maven Assembly plugin is a plugin you can use to create arbitrary
distributions for your applications. You can use the Maven Assembly
plugin to assemble the output of your project in any format you desire
by defining a custom assembly descriptor. In a later chapter we will
show you how to create a custom assembly descriptor which produces a
more complex archive for the Simple Weather application. In this
chapter, we’re going to use the predefined jar-with-dependencies
format. To configure the Maven Assembly Plugin, we need to add the
following plugin configuration to our existing build configuration in
the pom.xml.
Configuring the Maven Assembly Descriptor.
<project>
[...]
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
[...]
</project>
Once you’ve added this configuration, you can build the assembly by
running the assembly:assembly goal. In the following screen listing,
the assembly:assembly goal is executed after the Maven build reaches
the install lifecycle phase:
$ mvn install assembly:assembly ... [INFO] [jar:jar] [INFO] Building jar: ~/examples/ch-custom/simple-weather/target/simple-weather-1.0.jar [INFO] [assembly:assembly] [INFO] Processing DependencySet (output=) [INFO] Expanding: \ .m2/repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar into \ /tmp/archived-file-set.1437961776.tmp [INFO] Expanding: .m2/repository/commons-lang/commons-lang/2.1/\ commons-lang-2.1.jar into /tmp/archived-file-set.305257225.tmp ... (Maven Expands all dependencies into a temporary directory) ... [INFO] Building jar: \ ~/examples/ch-custom/simple-weather/target/\ simple-weather-1.0-jar-with-dependencies.jar
Once our assembly is assembled in
target/'simple-weather-1.0-jar-with-'dependencies.jar, we can run
the Main class again from the command line. To run the simple
weather application’s Main class, execute the following commands
from your project’s base directory:
$ cd target
$ java -cp simple-weather-1.0-jar-with-dependencies.jar \
org.sonatype.mavenbook.weather.Main 10002
0INFO YahooRetriever - Retrieving Weather Data
221 INFO YahooParser - Creating XML Reader
399 INFO YahooParser - Parsing XML Response
474 INFO WeatherFormatter - Formatting Weather Data
*********************************
Current Weather Conditions for:
New York, NY, US
Temperature: 44
Condition: Fair
Humidity: 40
Wind Chill: 40
*********************************
The jar-with-dependencies format creates a single JAR file that
includes all of the bytecode from the simple-weather project as well
as the unpacked bytecode from all of the dependencies. This somewhat
unconventional format produces a 9 MiB JAR file containing
approximately 5,290 classes, but it does provide for an easy
distribution format for applications you’ve developed with
Maven. Later in this book, we’ll show you how to create a custom
assembly descriptor to produce a more standard distribution.
In Maven 1, a build was customized by stringing together a series of
plugin goals. Each plugin goal had prerequisites and defined a
relationship to other plugin goals. With the release of Maven 2, a
lifecycle was introduced and plugin goals are now associated with a
series of phases in a default Maven build lifecycle. The lifecycle
provides a solid foundation that makes it easier to predict and manage
the plugin goals which will be executed in a given build. In Maven 1,
plugin goals related to one another directly; in Maven 2, plugin goals
relate to a set of common lifecycle stages. While it is certainly
valid to execute a plugin goal directly from the command-line as we
just demonstrated, it is more consistent with the design of Maven to
configure the Assembly plugin to execute the assembly:assembly goal
during a phase in the Maven lifecycle.
The following plugin configuration configures the Maven Assembly
plugin to execute the attached goal during the package phase of
the Maven default build lifecycle. The attached goal does the same
thing as the assembly goal. To bind to assembly:attached goal to
the package phase we use the executions element under plugin in the
build section of the project’s POM.
Configuring Attached Goal Execution During the Package Lifecycle Phase.
<project>
[...]
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>simple-command</id>
<phase>package</phase>
<goals>
<goal>attached</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
Once you have this configuration in your POM, all you need to do to
generate the assembly is run mvn package. The execution
configuration will make sure that the assembly:attached goal is
executed when the Maven lifecycle transitions to the package phase
of the lifecycle. The assembly will also be created if you run mvn
install as the package phase precedes the install phase in the
default Maven lifecycle.