------ 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 ** ... +-----