Author: pgier
Date: Fri Feb 10 14:52:40 2012
New Revision: 1242799
URL: http://svn.apache.org/viewvc?rev=1242799&view=rev
Log:
[MENFORCER-128] Add new rule to check for incompatible versions in the
dependency tree.
Submitted By: Geoffrey De Smet
o Applied without change
Added:
maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/IncompatibleDependencyOverwrite.java
maven/enforcer/trunk/enforcer-rules/src/site/apt/IncompatibleDependencyOverwrite.apt.vm
maven/enforcer/trunk/maven-enforcer-plugin/src/it/compatible_dependency_overwrite/
maven/enforcer/trunk/maven-enforcer-plugin/src/it/compatible_dependency_overwrite/module/
maven/enforcer/trunk/maven-enforcer-plugin/src/it/compatible_dependency_overwrite/module/pom.xml
maven/enforcer/trunk/maven-enforcer-plugin/src/it/compatible_dependency_overwrite/pom.xml
maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/
maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/invoker.properties
maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/module/
maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/module/pom.xml
maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/pom.xml
Modified:
maven/enforcer/trunk/enforcer-rules/src/site/apt/index.apt
Added:
maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/IncompatibleDependencyOverwrite.java
URL:
http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/IncompatibleDependencyOverwrite.java?rev=1242799&view=auto
==============================================================================
---
maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/IncompatibleDependencyOverwrite.java
(added)
+++
maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/IncompatibleDependencyOverwrite.java
Fri Feb 10 14:52:40 2012
@@ -0,0 +1,294 @@
+package org.apache.maven.plugins.enforcer;
+
+/*
+ * 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.
+ */
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+import org.apache.maven.artifact.versioning.OverConstrainedVersionException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.shared.dependency.tree.DependencyNode;
+import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
+import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
+import
org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import
org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.codehaus.plexus.i18n.I18N;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class IncompatibleDependencyOverwrite extends
AbstractNonCacheableEnforcerRule
+{
+
+ private static Log log;
+
+ private static I18N i18n;
+
+ /**
+ * Uses the {@link EnforcerRuleHelper} to populate the values of the
+ * {@link DependencyTreeBuilder#buildDependencyTree(MavenProject,
ArtifactRepository, ArtifactFactory, ArtifactMetadataSource, ArtifactFilter,
ArtifactCollector)}
+ * factory method. <br/>
+ * This method simply exists to hide all the ugly lookup that the {@link
EnforcerRuleHelper} has to do.
+ *
+ * @param helper
+ * @return a Dependency Node which is the root of the project's dependency
tree
+ * @throws EnforcerRuleException when the build should fail
+ */
+ private DependencyNode getNode( EnforcerRuleHelper helper )
+ throws EnforcerRuleException
+ {
+ try
+ {
+ MavenProject project = (MavenProject) helper.evaluate(
"${project}" );
+ DependencyTreeBuilder dependencyTreeBuilder =
+ (DependencyTreeBuilder) helper.getComponent(
DependencyTreeBuilder.class );
+ ArtifactRepository repository = (ArtifactRepository)
helper.evaluate( "${localRepository}" );
+ ArtifactFactory factory = (ArtifactFactory) helper.getComponent(
ArtifactFactory.class );
+ ArtifactMetadataSource metadataSource =
+ (ArtifactMetadataSource) helper.getComponent(
ArtifactMetadataSource.class );
+ ArtifactCollector collector = (ArtifactCollector)
helper.getComponent( ArtifactCollector.class );
+ ArtifactFilter filter = null; // we need to evaluate all scopes
+ DependencyNode node =
+ dependencyTreeBuilder.buildDependencyTree( project,
repository, factory, metadataSource, filter,
+ collector );
+ return node;
+ }
+ catch ( ExpressionEvaluationException e )
+ {
+ throw new EnforcerRuleException( "Unable to lookup an expression "
+ e.getLocalizedMessage(), e );
+ }
+ catch ( ComponentLookupException e )
+ {
+ throw new EnforcerRuleException( "Unable to lookup a component " +
e.getLocalizedMessage(), e );
+ }
+ catch ( DependencyTreeBuilderException e )
+ {
+ throw new EnforcerRuleException( "Could not build dependency tree
" + e.getLocalizedMessage(), e );
+ }
+ }
+
+ public void execute( EnforcerRuleHelper helper )
+ throws EnforcerRuleException
+ {
+ if ( log == null )
+ {
+ log = helper.getLog();
+ }
+ try
+ {
+ if ( i18n == null )
+ {
+ i18n = (I18N) helper.getComponent( I18N.class );
+ }
+ DependencyNode node = getNode( helper );
+ IncompatibleOverwriteVisitor visitor
+ = new IncompatibleOverwriteVisitor();
+ node.accept( visitor );
+ List<String> errorMessages = buildErrorMessages(
visitor.getConflicts() );
+ if ( errorMessages.size() > 0 )
+ {
+ throw new EnforcerRuleException(
+ "Failed while enforcing
IncompatibleDependencyOverwrite. The error(s) are "
+ + errorMessages );
+ }
+ }
+ catch ( ComponentLookupException e )
+ {
+ throw new EnforcerRuleException( "Unable to lookup a component " +
e.getLocalizedMessage(), e );
+ }
+ catch ( Exception e )
+ {
+ throw new EnforcerRuleException( e.getLocalizedMessage(), e );
+ }
+ }
+
+ private List<String> buildErrorMessages( List<List<DependencyNode>>
conflicts )
+ {
+ List<String> errorMessages = new ArrayList<String>(conflicts.size());
+ for ( List<DependencyNode> conflict : conflicts )
+ {
+ errorMessages.add(buildErrorMessage(conflict));
+ }
+ return errorMessages;
+ }
+
+ private String buildErrorMessage(List<DependencyNode> conflict) {
+ StringBuilder errorMessage = new StringBuilder();
+ errorMessage.append("\nIncompatible dependency overwrite error for "
+ + getFullArtifactName(conflict.get(0).getArtifact())
+ + " paths to dependency are:\n");
+ if ( conflict.size() > 0 )
+ {
+ errorMessage.append(buildTreeString(conflict.get(0)));
+ }
+ for ( DependencyNode node : conflict.subList( 1, conflict.size() ) ) {
+ errorMessage.append("and\n");
+ errorMessage.append(buildTreeString(node));
+ }
+ return errorMessage.toString();
+ }
+
+ private StringBuilder buildTreeString( DependencyNode node )
+ {
+ List<String> loc = new ArrayList<String>();
+ DependencyNode currentNode = node;
+ while ( currentNode != null )
+ {
+ loc.add( getFullArtifactName( currentNode.getArtifact() ) );
+ currentNode = currentNode.getParent();
+ }
+ Collections.reverse( loc );
+ StringBuilder builder = new StringBuilder();
+ for ( int i = 0; i < loc.size(); i++ )
+ {
+ for ( int j = 0; j < i; j++ )
+ {
+ builder.append( " " );
+ }
+ builder.append("+-").append(loc.get(i));
+ builder.append( "\n" );
+ }
+ return builder;
+ }
+
+ private String getFullArtifactName(Artifact artifact)
+ {
+ return artifact.getGroupId() + ":" + artifact.getArtifactId() + ":" +
artifact.getVersion();
+ }
+
+ private static class IncompatibleOverwriteVisitor implements
DependencyNodeVisitor {
+
+ private Map<String, List<DependencyNodeHopCountPair>> keyToPairsMap
+ = new LinkedHashMap<String,
List<DependencyNodeHopCountPair>>();
+
+ public boolean visit(DependencyNode node) {
+ DependencyNodeHopCountPair pair = new
DependencyNodeHopCountPair(node);
+ String key = pair.constructKey();
+ List<DependencyNodeHopCountPair> pairs = keyToPairsMap.get(key);
+ if (pairs == null) {
+ pairs = new ArrayList<DependencyNodeHopCountPair>();
+ keyToPairsMap.put(key, pairs);
+ }
+ pairs.add(pair);
+ Collections.sort(pairs);
+ return true;
+ }
+
+ public boolean endVisit(DependencyNode node) {
+ return true;
+ }
+
+ public List<List<DependencyNode>> getConflicts()
+ {
+ List<List<DependencyNode>> output = new
ArrayList<List<DependencyNode>>();
+ for ( List<DependencyNodeHopCountPair> pairs :
keyToPairsMap.values() )
+ {
+ if ( containsConflicts( pairs ) )
+ {
+ List<DependencyNode> outputSubList = new
ArrayList<DependencyNode>(pairs.size());
+ for (DependencyNodeHopCountPair pair : pairs) {
+ outputSubList.add( pair.getNode() );
+ }
+ output.add(outputSubList);
+ }
+ }
+ return output;
+ }
+
+ private boolean containsConflicts(List<DependencyNodeHopCountPair>
pairs) {
+ ArtifactVersion resolvedVersion =
pairs.get(0).extractArtifactVersion();
+ for (DependencyNodeHopCountPair pair : pairs) {
+ ArtifactVersion version = pair.extractArtifactVersion();
+ if (resolvedVersion.compareTo(version) < 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ }
+
+ private static class DependencyNodeHopCountPair implements
Comparable<DependencyNodeHopCountPair> {
+
+ private DependencyNode node;
+ private int hopCount;
+
+ private DependencyNodeHopCountPair(DependencyNode node) {
+ this.node = node;
+ countHops();
+ }
+
+ private void countHops() {
+ hopCount = 0;
+ DependencyNode parent = node.getParent();
+ while (parent != null) {
+ hopCount++;
+ parent = parent.getParent();
+ }
+ }
+
+ private String constructKey()
+ {
+ Artifact artifact = node.getArtifact();
+ return artifact.getGroupId() + ":" + artifact.getArtifactId();
+ }
+
+ public DependencyNode getNode() {
+ return node;
+ }
+
+ private ArtifactVersion extractArtifactVersion() {
+ Artifact artifact = node.getArtifact();
+ String version = artifact.getVersion();
+ if (version != null) {
+ return new DefaultArtifactVersion(version);
+ }
+ try {
+ return artifact.getSelectedVersion();
+ } catch (OverConstrainedVersionException e) {
+ throw new RuntimeException("Version ranges problem with " +
node.getArtifact(), e);
+ }
+ }
+
+ public int getHopCount() {
+ return hopCount;
+ }
+
+ public int compareTo(DependencyNodeHopCountPair other) {
+ return
Integer.valueOf(hopCount).compareTo(Integer.valueOf(other.getHopCount()));
+ }
+
+ }
+
+}
Added:
maven/enforcer/trunk/enforcer-rules/src/site/apt/IncompatibleDependencyOverwrite.apt.vm
URL:
http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/site/apt/IncompatibleDependencyOverwrite.apt.vm?rev=1242799&view=auto
==============================================================================
---
maven/enforcer/trunk/enforcer-rules/src/site/apt/IncompatibleDependencyOverwrite.apt.vm
(added)
+++
maven/enforcer/trunk/enforcer-rules/src/site/apt/IncompatibleDependencyOverwrite.apt.vm
Fri Feb 10 14:52:40 2012
@@ -0,0 +1,115 @@
+ ~~ 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.
+
+ -----
+ Comparing against a specific artifact
+ -----
+ -----
+ 2012-02-08
+ -----
+
+ This rule requires that every dependency (including transitive dependencies)
is resolved to a version
+ which is at least the specified version.
+
+ Here is a concrete example. This will cause a build to fail:
+
+-----------------------------------------------------------------------------------
+ <dependencies>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.4.0</version>
+ </dependency>
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
+ <version>0.9.9</version>
+ <!-- Depends on org.slf4j:slf4j-api:1.5.0 -->
+ </dependency>
+ </dependencies>
+-----------------------------------------------------------------------------------
+
+ Because the project will run logback-classic 0.9.9 with slf4j-api 1.4.0
+ and slf4j-api 1.4.0 is probably not forwards compatible with slf4j-api 1.5.0.
+
+ This is the log message:
+
+-----------------------------------------------------------------------------------
+
+Failed while enforcing IncompatibleDependencyOverwrite. The error(s) are [
+IncompatibleDependencyOverwrite error for org.slf4j:slf4j-api:1.4.0 paths to
dependency are:
++-test:TestParent:1.0-SNAPSHOT
+ +-org.slf4j:slf4j-api:1.4.0
+and
++-test:TestParent:1.0-SNAPSHOT
+ +-ch.qos.logback:logback-classic:0.9.9
+ +-org.slf4j:slf4j-api:1.5.0
+]
+
+-----------------------------------------------------------------------------------
+
+ And this will succeed.
+
+-----------------------------------------------------------------------------------
+ <dependencies>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.6.0</version>
+ </dependency>
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
+ <version>0.9.9</version>
+ <!-- Depends on org.slf4j:slf4j-api:1.5.0 -->
+ </dependency>
+ </dependencies>
+-----------------------------------------------------------------------------------
+
+
+ Here is how a project should be setup to use this rule
+
+-----------------------------------------------------------------------------------
+<project>
+ ...
+ <build>
+ <plugins>
+ ...
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-enforcer-plugin</artifactId>
+ <version>${project.version}</version>
+ <executions>
+ <execution>
+ <id>enforce</id>
+ <configuration>
+ <rules>
+ <IncompatibleDependencyOverwrite/>
+ </rules>
+ </configuration>
+ <goals>
+ <goal>enforce</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ ...
+ </plugins>
+ </build>
+ ...
+</project>
+-----------------------------------------------------------------------------------
Modified: maven/enforcer/trunk/enforcer-rules/src/site/apt/index.apt
URL:
http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/site/apt/index.apt?rev=1242799&r1=1242798&r2=1242799&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/site/apt/index.apt (original)
+++ maven/enforcer/trunk/enforcer-rules/src/site/apt/index.apt Fri Feb 10
14:52:40 2012
@@ -37,6 +37,8 @@ Standard Rules
* {{{./dependencyConvergence.html}dependencyConvergence}} - ensure all
dependencies converge to the same version.
+ *
{{{./incompatibleDependencyOverwrite.html}IncompatibleDependencyOverwrite}} -
ensures that every (transitive) dependency is resolved to it's specified
version or higher.
+
* {{{./evaluateBeanshell.html}evaluateBeanshell}} - evaluates a beanshell
script.
* {{{./requireReleaseDeps.html}requireReleaseDeps}} - enforces that no
snapshots are included as dependencies.
Added:
maven/enforcer/trunk/maven-enforcer-plugin/src/it/compatible_dependency_overwrite/module/pom.xml
URL:
http://svn.apache.org/viewvc/maven/enforcer/trunk/maven-enforcer-plugin/src/it/compatible_dependency_overwrite/module/pom.xml?rev=1242799&view=auto
==============================================================================
---
maven/enforcer/trunk/maven-enforcer-plugin/src/it/compatible_dependency_overwrite/module/pom.xml
(added)
+++
maven/enforcer/trunk/maven-enforcer-plugin/src/it/compatible_dependency_overwrite/module/pom.xml
Fri Feb 10 14:52:40 2012
@@ -0,0 +1,12 @@
+<?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
http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>test</groupId>
+ <artifactId>TestParent</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>TestModule</artifactId>
+ <version>1.1-SNAPSHOT</version>
+</project>
Added:
maven/enforcer/trunk/maven-enforcer-plugin/src/it/compatible_dependency_overwrite/pom.xml
URL:
http://svn.apache.org/viewvc/maven/enforcer/trunk/maven-enforcer-plugin/src/it/compatible_dependency_overwrite/pom.xml?rev=1242799&view=auto
==============================================================================
---
maven/enforcer/trunk/maven-enforcer-plugin/src/it/compatible_dependency_overwrite/pom.xml
(added)
+++
maven/enforcer/trunk/maven-enforcer-plugin/src/it/compatible_dependency_overwrite/pom.xml
Fri Feb 10 14:52:40 2012
@@ -0,0 +1,44 @@
+<?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
http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>test</groupId>
+ <artifactId>TestParent</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+ <dependencies>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.6.0</version>
+ </dependency>
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
+ <version>0.9.9</version>
+ <!-- Depends on org.slf4j:slf4j-api:1.5.0 -->
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-enforcer-plugin</artifactId>
+ <version>@project.version@</version>
+ <executions>
+ <execution>
+ <id>enforce</id>
+ <configuration>
+ <rules>
+ <IncompatibleDependencyOverwrite/>
+ </rules>
+ </configuration>
+ <goals>
+ <goal>enforce</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
Added:
maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/invoker.properties
URL:
http://svn.apache.org/viewvc/maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/invoker.properties?rev=1242799&view=auto
==============================================================================
---
maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/invoker.properties
(added)
+++
maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/invoker.properties
Fri Feb 10 14:52:40 2012
@@ -0,0 +1 @@
+invoker.buildResult=failure
\ No newline at end of file
Added:
maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/module/pom.xml
URL:
http://svn.apache.org/viewvc/maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/module/pom.xml?rev=1242799&view=auto
==============================================================================
---
maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/module/pom.xml
(added)
+++
maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/module/pom.xml
Fri Feb 10 14:52:40 2012
@@ -0,0 +1,12 @@
+<?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
http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>test</groupId>
+ <artifactId>TestParent</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>TestModule</artifactId>
+ <version>1.1-SNAPSHOT</version>
+</project>
Added:
maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/pom.xml
URL:
http://svn.apache.org/viewvc/maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/pom.xml?rev=1242799&view=auto
==============================================================================
---
maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/pom.xml
(added)
+++
maven/enforcer/trunk/maven-enforcer-plugin/src/it/incompatible_dependency_overwrite/pom.xml
Fri Feb 10 14:52:40 2012
@@ -0,0 +1,44 @@
+<?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
http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>test</groupId>
+ <artifactId>TestParent</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+ <dependencies>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.4.0</version>
+ </dependency>
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
+ <version>0.9.9</version>
+ <!-- Depends on org.slf4j:slf4j-api:1.5.0 -->
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-enforcer-plugin</artifactId>
+ <version>@project.version@</version>
+ <executions>
+ <execution>
+ <id>enforce</id>
+ <configuration>
+ <rules>
+ <IncompatibleDependencyOverwrite/>
+ </rules>
+ </configuration>
+ <goals>
+ <goal>enforce</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>