------
Selecting Contents for Uber JAR
------
Mauro Talevi
------
2008-07-21
------
~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements. See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership. The ASF licenses this file
~~ to you under the Apache License, Version 2.0 (the
~~ "License"); you may not use this file except in compliance
~~ with the License. You may obtain a copy of the License at
~~
~~ http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing,
~~ software distributed under the License is distributed on an
~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~~ KIND, either express or implied. See the License for the
~~ specific language governing permissions and limitations
~~ under the License.
Selecting Contents for Uber JAR
The POM snippet below shows how to control which project dependencies should be included/excluded in the uber JAR:
+-----
...
org.apache.maven.plugins
maven-shade-plugin
${project.version}
package
shade
classworlds:classworlds
junit:junit
jmock:*
*:xml-apis
org.apache.maven:lib:tests
log4j:log4j:jar:
...
+-----
Of course, <<<\>>> can be used as well to specify a white list of artifacts. Artifacts are denoted by a
composite idenitifer of the form :[[:]:]. Since plugin version 1.3, the
wildcard characters '*' and '?' can be used to do glob-like pattern matching.
For fine-grained control of which classes from the selected dependencies are included, artifact filters can be used:
+-----
...
org.apache.maven.plugins
maven-shade-plugin
${project.version}
package
shade
junit:junit
junit/framework/**
org/junit/**
org/junit/experimental/**
org/junit/runners/**
*:*
META-INF/*.SF
META-INF/*.DSA
META-INF/*.RSA
...
+-----
Here, Ant-like patterns are used to specify that from the dependency <<>> only certain classes/resources
should be included in the uber JAR. The second filter demonstrates the use of wildcards for the artifact identity which
was introduced in plugin version 1.3. It excludes all signature related files from every artifact, regardless of its
group or artifact id.
Besides user-specified filters, the plugin can also be configured to automatically remove all classes of dependencies
that are not used by the project, thereby minimizing the resulting uber JAR:
+-----
...
org.apache.maven.plugins
maven-shade-plugin
${project.version}
package
shade
true
...
+-----
As of version 1.6, minimizeJar will respect classes that were specifically marked for inclusion in a filter.
Note that specifying an include filter for classes in an artifact implicitly excludes all non-specified
classes in that artifact.
+-----
...
org.apache.maven.plugins
maven-shade-plugin
${project.version}
package
shade
true
log4j:log4j
**
commons-logging:commons-logging
**
...
+-----