[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("");
+    }
+}