[ 
https://issues.apache.org/jira/browse/MDEP-715?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17205867#comment-17205867
 ] 

Michael Boyles commented on MDEP-715:
-------------------------------------

The issue seems to be that a class with the same FQN exists in two dependencies.

When shared-utils dependencies are like this 
{code:java}
<dependency>
    <groupId>junit</groupId>        <!-- has transitive dependency on 
hamcrest-core:1.3 -->
    <artifactId>junit</artifactId>
    <version>4.13</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-core</artifactId>
    <version>2.2</version>
    <scope>test</scope>
</dependency>{code}
The hamcrest-core we explicitly declare overrides Junit's. The 2.2 core is 
actually deprecated and just contains a text file, but crucially gives us the 
transitive dependency to hamcrest:2.2, which has the classes we actually want. 
Actually, we only use 1 class, org.hamcrest.CoreMatchers

So in this case we have a transitive dependency on hamcrest:2.2 which we did 
not declare, so the output of analyze is *correct*.

 

However, when we make the seemingly obvious fix:
{code:java}
<!-- junit here -->
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest</artifactId>
    <version>2.2</version>
    <scope>test</scope>
</dependency> {code}
Then now what we have is a transitive dependency on hamcrest-core:1.3 via Junit 
and our own dependency on hamcrest:2.2. Both contain a class with the FQN. 

hamcrest-core must "win" the lookup, so the dependency plugin thinks 
org.hamcrest.CoreMatchers comes *only* from there. If that assumption were 
true, hamcrest-core would be an undeclared transitive dependency through junit, 
while hamcrest itself is unnecessary, hence the spurious result.

I found 2 ways you can work around it:
 * Move Junit after hamcrest. hamcrest "wins" the ownership of the class so is 
now counted as being "used", while hamcrest-core is "unused" (but that's 
transitive, so not a warning) 
 * Exclude the hamcrest-core from junit

—

The ideal fix is less clear to me.

Should we should omit some warning that we found a class that exists in two or 
more dependencies, and consider all such dependencies to be used, and advise 
them the solve the problem manually (via exclusions etc.)?

> Hamcrest used and unused
> ------------------------
>
>                 Key: MDEP-715
>                 URL: https://issues.apache.org/jira/browse/MDEP-715
>             Project: Maven Dependency Plugin
>          Issue Type: Bug
>          Components: analyze
>            Reporter: Elliotte Rusty Harold
>            Priority: Major
>              Labels: S2, intern
>
> This is something I've seen when analyzing several Maven plugins. For 
> example, maven-shared-utils circa July 20, 2020:
>  
> [WARNING] Used undeclared dependencies found:
> [WARNING] org.hamcrest:hamcrest:jar:2.2:test
> [WARNING] org.eclipse.sisu:org.eclipse.sisu.plexus:jar:0.0.0.M2a:test
> [WARNING] Unused declared dependencies found:
> [WARNING] org.hamcrest:hamcrest-core:jar:2.2:test
> [WARNING] org.apache.maven:maven-core:jar:3.1.0:test
> [WARNING] org.codehaus.plexus:plexus-container-default:jar:2.1.0:provided
>  
> Easy fix, right? don't declare org.hamcrest:hamcrest-core:jar:2.2:test and 
> instead declare org.hamcrest:hamcrest:jar:2.2:test
>  
> But when I do that:
>  
> [WARNING] Used undeclared dependencies found:
> [WARNING] org.hamcrest:hamcrest-core:jar:1.3:test
> [WARNING] org.eclipse.sisu:org.eclipse.sisu.plexus:jar:0.0.0.M2a:test
> [WARNING] Unused declared dependencies found:
> [WARNING] org.hamcrest:hamcrest:jar:2.2:test
> [WARNING] org.apache.maven:maven-core:jar:3.1.0:test
> [WARNING] org.codehaus.plexus:plexus-container-default:jar:2.1.0:provided
>  
> Figure out what's going on here and fix it. Is hamcrest-core needed and used 
> or not? is hamcrest needed and used or not? Be consistent.
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to