blob: 7607fb6a2b95cede7ebad8441028dfef9c2c7129 [file] [log] [blame]
------
Supplementing Missing POM Information
------
John Casey
------
2011-01-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.
Supplementing Missing POM Information
<<Note:>> This feature was added in version 1.0-alpha-5.
One of Maven's great strengths is that it allows you, the user, to build directly on the work of
others with minimal effort. For instance, by adding five lines (or less) to your POM, you can
declare a dependency on someone else's library, and instruct Maven to use that library during
the build for your own project. Since the library's JAR is usually accompanied by a POM of its
own, your project doesn't need to provide an exhaustive listing of all libraries used by all
of your direct dependencies.
However, this approach of reusing POM metadata from your dependencies can be inhibited by a
dependency POM that provides less-than-complete information about its project. While most POMs
provide reasonably accurate information about their dependencies, they sometimes leave out some
information critical to assembling licensing and dependency notice files.
For example, the templates used by many Apache distributions assemble a listing of project
dependencies according to their organization name (and URL), along with the URL each project's
website. When dependency POMs are missing this information, the dependency notice file
that the Remote Resources Plugin renders can be invalid.
To compensate for incomplete dependency POMs, you can use the supplemental models support, introduced
to the Remote Resources Plugin in version 1.0-alpha-5, and improved in version 1.1.
* Fixing Incomplete POMs: Using Supplemental Models
For those cases where your project's dependencies don't list organization name, organization URL,
project URL, or whatever other metadata you require for you legal notice files, the Remote Resources
Plugin allows you to configure a series of supplemental models. These models consist of one or more
model files, each of which contains one or more POM fragments that can be merged into existing
dependency POMs to supplement the metadata provided there. The plugin uses the key <<<groupId:artifactId>>>
to match each supplemental model with the dependency POM into which it should be merged.
For example, imagine that your project's POM has declared the following two dependencies:
+---+
<dependency>
<groupId>org.foo</groupId>
<artifactId>missing-org-info</artifactId>
<version>1</version>
</dependency>
<dependency>
<groupId>org.foo</groupId>
<artifactId>missing-project-url</artifactId>
<version>1</version>
</dependency>
+---+
Now imagine that your project needs to include a file in its distribution that lists organization and
project URLs for each dependency, in a format like this:
+---+
From: Apache Software Foundation (http://www.apache.org/)
- Commons FOO (http://commons.apache.org/foo/) org.apache.commons.foo:foo:1
- Commons BAR (http://commons.apache.org/bar/) org.apache.commons.bar:bar:1
+---+
However, as you try generating these licensing resources for your project, you quickly learn that your dependencies
provide POMs that don't always include all the information needed by this format. The first dependency is missing
all of the information provided by the <<<organization>>> element of the POM, and the second is missing a project-
specific URL (the <<<url>>> element of the POM).
To fix these omissions for the purposes of resource generation, we can simply provide a supplemental-model file that
contains the missing information. The file, located at <<<src/main/appended-resources/supplemental-models.xml>>>,
would look something like this:
+---+
<?xml version="1.0" encoding="UTF-8"?>
<supplementalDataModels xmlns="http://maven.apache.org/supplemental-model/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/supplemental-model/1.0.0 https://maven.apache.org/xsd/supplemental-model-1.0.0.xsd">
<supplement>
<project>
<groupId>org.foo</groupId>
<artifactId>missing-org-info</artifactId>
<organization>
<name>FOO, Inc.</name>
<url>http://www.foo.org/</url>
</organization>
</project>
</supplement>
<supplement>
<project>
<groupId>org.foo</groupId>
<artifactId>missing-project-url</artifactId>
<url>http://www.foo.org/projects/missing-project-url/</url>
</project>
</supplement>
</supplementalDataModels>
+---+
Finally, we tell the Remote Resources Plugin to use the new supplemental-model file:
+---+
<plugin>
<artifactId>maven-remote-resources-plugin</artifactId>
<version>${project.version}</version>
<executions>
<execution>
<id>process-remote-resources</id>
<goals>
<goal>process</goal>
</goals>
<configuration>
<supplementalModels>
<supplementalModel>supplemental-models.xml</supplementalModel>
</supplementalModels>
[...]
</configuration>
</execution>
</executions>
</plugin>
+---+
After re-running the project build, the supplemental information we provided will be merged with the metadata
from the dependency POMs, providing enough information to complete the dependencies listing.
* Publishing and Reusing Supplemental Models
<<Note:>> This feature was added in version 1.1.
The configuration above is fine for single projects that need to address deficiencies in their dependencies'
metadata. But what happens when your organization wants to use these same deficient dependencies across multiple
projects? The configuration we just examined cannot handle reuse of supplemental-model files.
To address this shortcoming, version 1.1 of the Remote Resources Plugin introduces a new parameter:
<<<supplementalModelArtifacts>>>. When combined with the <<<supplementalModels>>> parameter used above, this new
parameter allows the Remote Resources Plugin to resolve artifacts containing supplemental model information, then
search those artifacts for the paths given in the <<<supplementalModels>>> listing.
To make the supplemental models above reusable using this mechanism, we first publish them in their own project:
+---+
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.myco</groupId>
<artifactId>dependency-resource-supplement</artifactId>
<version>1</version>
</project>
+---+
Note that this is just a simple, unadorned JAR artifact. We then move the above POM and <<<supplemental-models.xml>>> file
into a separate project directory structure:
+---+
|-- pom.xml
`-- src
`-- main
`-- resources
`-- supplemental-models.xml
+---+
Once we install this new project, we can reference it from the configuration for the Remote Resources Plugin,
like this:
+---+
<plugin>
<artifactId>maven-remote-resources-plugin</artifactId>
<version>${project.version}</version>
<executions>
<execution>
<id>process-remote-resources</id>
<goals>
<goal>process</goal>
</goals>
<configuration>
<!-- Reference the supplemental-model artifact from above -->
<supplementalModelArtifacts>
<supplementalModelArtifact>org.myco:dependency-resource-supplement:1</supplementalModelArtifact>
</supplementalModelArtifacts>
<!-- Specify the path, relative to the JAR root, where the supplemental model file is located -->
<supplementalModels>
<supplementalModel>supplemental-models.xml</supplementalModel>
</supplementalModels>
[...]
</configuration>
</execution>
</executions>
</plugin>
+---+
Once the <<<supplemental-model>>> project is released and deployed, any number of projects can then make use of the
supplemental information it provides.