[MDEP-753] handle different classes from same artifact used by model and test code (#37)
* test to demonstrate failure
* fix the bug
diff --git a/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java b/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java
index b4b505c..cb44ddc 100644
--- a/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java
+++ b/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java
@@ -67,15 +67,18 @@
Map<Artifact, Set<String>> artifactClassMap = buildArtifactClassMap( project );
Set<String> dependencyClasses = buildDependencyClasses( project );
+ Set<String> mainDependencyClasses = buildMainDependencyClasses( project );
Set<String> testOnlyDependencyClasses = buildTestDependencyClasses( project );
Set<Artifact> declaredArtifacts = buildDeclaredArtifacts( project );
Set<Artifact> usedArtifacts = buildUsedArtifacts( artifactClassMap, dependencyClasses );
-
- Set<Artifact> testOnlyArtifacts = buildUsedArtifacts( artifactClassMap, testOnlyDependencyClasses );
-
+ Set<Artifact> mainUsedArtifacts = buildUsedArtifacts( artifactClassMap, mainDependencyClasses );
+
+ Set<Artifact> testArtifacts = buildUsedArtifacts( artifactClassMap, testOnlyDependencyClasses );
+ Set<Artifact> testOnlyArtifacts = removeAll( testArtifacts, mainUsedArtifacts );
+
Set<Artifact> usedDeclaredArtifacts = new LinkedHashSet<>( declaredArtifacts );
usedDeclaredArtifacts.retainAll( usedArtifacts );
@@ -226,6 +229,16 @@
return dependencyClasses;
}
+
+ private Set<String> buildMainDependencyClasses( MavenProject project )
+ throws IOException
+ {
+
+ String outputDirectory = project.getBuild().getOutputDirectory();
+ Set<String> dependencyClasses = new HashSet<>( buildDependencyClasses( outputDirectory ) );
+
+ return dependencyClasses;
+ }
private Set<String> buildDependencyClasses( String path )
throws IOException
diff --git a/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java b/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java
index ffbe626..ebb85fa 100644
--- a/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java
+++ b/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java
@@ -183,10 +183,14 @@
}
ProjectDependencyAnalysis actualAnalysis = analyzer.analyze( project2 );
+
+ assertTrue( "Incorrectly classified Guava as testonly",
+ actualAnalysis.getTestArtifactsWithNonTestScope().isEmpty() );
Artifact project1 = createArtifact( "org.apache.maven.shared.dependency-analyzer.tests",
"jarWithCompileDependency1", "jar", "1.0", "compile" );
- Set<Artifact> usedDeclaredArtifacts = Collections.singleton( project1 );
+ Artifact guava = createArtifact( "com.google.guava", "guava", "jar", "30.1.1-android", "compile" );
+ Set<Artifact> usedDeclaredArtifacts = new HashSet<>( Arrays.asList( project1, guava ) );
ProjectDependencyAnalysis expectedAnalysis = new ProjectDependencyAnalysis( usedDeclaredArtifacts, null, null,
null );
@@ -237,7 +241,7 @@
MavenProject project2 = getProject( "jarWithTestDependency/project2/pom.xml" );
ProjectDependencyAnalysis actualAnalysis = analyzer.analyze( project2 );
-
+
Artifact project1 = createArtifact( "org.apache.maven.shared.dependency-analyzer.tests",
"jarWithTestDependency1", "jar", "1.0", "test" );
Artifact junit = createArtifact( "junit", "junit", "jar", "3.8.1", "test" );
diff --git a/src/test/resources/jarWithCompileDependency/project2/pom.xml b/src/test/resources/jarWithCompileDependency/project2/pom.xml
index d68784a..bc920b8 100644
--- a/src/test/resources/jarWithCompileDependency/project2/pom.xml
+++ b/src/test/resources/jarWithCompileDependency/project2/pom.xml
@@ -36,6 +36,11 @@
<artifactId>jarWithCompileDependency1</artifactId>
<version>1.0</version>
</dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>30.1.1-android</version>
+ </dependency>
</dependencies>
</project>
diff --git a/src/test/resources/jarWithCompileDependency/project2/src/main/java/jarWithCompileDependency/project2/Project2.java b/src/test/resources/jarWithCompileDependency/project2/src/main/java/jarWithCompileDependency/project2/Project2.java
index 5bc71ce..c634c86 100644
--- a/src/test/resources/jarWithCompileDependency/project2/src/main/java/jarWithCompileDependency/project2/Project2.java
+++ b/src/test/resources/jarWithCompileDependency/project2/src/main/java/jarWithCompileDependency/project2/Project2.java
@@ -20,6 +20,7 @@
*/
import jarWithCompileDependency.project1.Project1;
+import com.google.common.base.Strings;
/**
*
@@ -31,5 +32,6 @@
public Project2()
{
Project1 project = new Project1();
+ System.out.println(Strings.emptyToNull("this"));
}
}
diff --git a/src/test/resources/jarWithCompileDependency/project2/src/test/java/jarWithCompileDependency/project2/Project2Test.java b/src/test/resources/jarWithCompileDependency/project2/src/test/java/jarWithCompileDependency/project2/Project2Test.java
new file mode 100644
index 0000000..ea8eb88
--- /dev/null
+++ b/src/test/resources/jarWithCompileDependency/project2/src/test/java/jarWithCompileDependency/project2/Project2Test.java
@@ -0,0 +1,31 @@
+package jarWithCompileDependency.project2;
+
+/*
+ * 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 jarWithCompileDependency.project1.Project1;
+import com.google.common.base.Preconditions;
+
+public class Project2Test
+{
+ public Project2Test()
+ {
+ Preconditions.checkNotNull("");
+ }
+}