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>


Reply via email to