blob: fd4f7c82af1f27e4d62398213231a11768673e0b [file] [log] [blame]
------
Excluding Files From the EAR
------
Dennis Lundberg
------
2011-12-09
------
~~ 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.
~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/doxia/references/apt-format.html
Excluding Files From the EAR
It is possible to exclude certain files from the EAR, by using the
<<<\<packagingIncludes\>>>> and <<<\<packagingExcludes\>>>> configuration
parameters. They each take a comma-separated list of Ant file set patterns.
You can use wildcards such as <<<**>>> to indicate multiple directories and
<<<*>>> to indicate an optional part of a file or directory name.
* Shared libraries
One use case for this is if you want to use shared libraries in your
application server. This involves configuring a location in your application
server that contains some libraries that you want to share between several
EARs. This is a bit like {{{./skinny-wars.html}skinny WARs}}, but taken to the
next level. With skinny WARs you share libraries (JARs) between web
applications within an enterprise application. Shared libraries as described
here shares libraries (JARs) between enterprise applications.
As an example, let's say that we want to exclude all non-in-house artifacts
from the generated EARs, so that the EAR files we distribute only contains our
own artifacts. The other dependencies we want to put in a shared library on
our application server. They only serve to bloat our EAR files, especially
if we're building or deploying several EARs, each with all of those
dependencies in them.
Our company in this example, the Acme Corporation, have wisely set a naming
convention for all their in-house artifacts. The artifactId is always prefixed
with "acme-". If they do not use a shared library, the directory layout for
their applications might look like this:
+-----------------+
acme-ear-1
|-- acme-ejb-1.jar
|-- acme-library-1.jar
|-- acme-library-2.jar
|-- acme-war-1.war
|-- acme-war-2.war
|-- external-library-1.jar
|-- external-library-2.jar
`-- external-library-3.jar
acme-ear-2
|-- acme-ejb-1.war
|-- acme-library-1.jar
|-- acme-library-2.jar
|-- acme-war-3.war
|-- acme-war-4.war
|-- external-library-2.jar
|-- external-library-3.jar
`-- external-library-4.jar
+-----------------+
** Configuring the EARs
In order for us to avoid having duplicate copies of the external libraries we
need to do two things. First we make sure that our EARs only contain our own
artifacts. We do this with the <<<\<packagingIncludes\>>>> parameter, which
tells the EAR Plugin what files to include in the EAR. Everything else will be
excluded. This configuration should be used in all of Acme's EAR projects, so
it would be better to move this configuration to a parent that is shared
by all of Acme's EAR projects.
+-----------------+
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-ear-plugin</artifactId>
<version>${project.version}</version>
<configuration>
<packagingIncludes>META-INF/**,**/acme-*.jar,**/acme-*.war</packagingIncludes>
</configuration>
</plugin>
</plugins>
</build>
...
</project>
+-----------------+
** Creating the shared library EAR
Next we create a shared library EAR that contains all the dependencies that we
want to share between the EARs. In this example we are packaging our shared
library as an EAR. What type of packaging you can use differ between various
application servers.
<<Note:>> The <<<\<version\>>>> elements of the dependencies have been omitted
here for brevity.
+-----------------+
<project>
...
<artifactId>external-shared-libraries</artifactId>
<packaging>ear</packaging>
...
<dependencies>
<dependency>
<groupId>com.external.supplier</groupId>
<artifactId>external-library-1.jar</artifactId>
</dependency>
<dependency>
<groupId>com.external.supplier</groupId>
<artifactId>external-library-2.jar</artifactId>
</dependency>
<dependency>
<groupId>com.external.supplier</groupId>
<artifactId>external-library-3.jar</artifactId>
</dependency>
<dependency>
<groupId>com.external.supplier</groupId>
<artifactId>external-library-4.jar</artifactId>
</dependency>
</dependencies>
...
<build>
<plugins>
<plugin>
<artifactId>maven-ear-plugin</artifactId>
<version>${project.version}</version>
</plugin>
</plugins>
</build>
...
</project>
+-----------------+
** The results
With all the Maven configuration done, the resulting directory layout would
look like this:
+-----------------+
external-shared-libraries
|-- external-library-1.jar
|-- external-library-2.jar
|-- external-library-3.jar
`-- external-library-4.jar
acme-ear-1
|-- acme-ejb-1.jar
|-- acme-library-1.jar
|-- acme-library-2.jar
|-- acme-war-1.war
`-- acme-war-2.war
acme-ear-2
|-- acme-ejb-1.war
|-- acme-library-1.jar
|-- acme-library-2.jar
|-- acme-war-3.war
`-- acme-war-4.war
+-----------------+
<<Note:>> You would also need to configure your application server to use
<<<external-shared-libraries>>> as a shared library. How you do that is
however out of scope for this example.
* Transitive artifacts
For those who have good reason to exclude transitive dependencies, they can configure their <<<pom.xml>>> like this when using Maven3
+---------------------
<dependency>
<groupId>GROUPID</groupId>
<artifactId>ARTIFACTID</artifactId>
<version>VERSION</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
+---------------------
As you can see <<<exclusions>>> support wildcard expressions, so you can have fast and full control over all the dependencies you'd like to exclude.