[
https://issues.apache.org/jira/browse/MDEP-557?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17692064#comment-17692064
]
Stanislav Spiridonov commented on MDEP-557:
-------------------------------------------
Maybe use some custom analyzer? The idea is to recognize such dependencies and
treat all transitive dependencies of it as explicitly defined in the project
POM.
> In dependency analysis, support Spring Boot style intentional transitive
> compile-time dependencies
> --------------------------------------------------------------------------------------------------
>
> Key: MDEP-557
> URL: https://issues.apache.org/jira/browse/MDEP-557
> Project: Maven Dependency Plugin
> Issue Type: New Feature
> Components: analyze
> Reporter: M. Justin
> Priority: Minor
> Labels: S2
>
> h1. Request
> It would be useful if using Spring Boot "starter" dependencies as intended
> didn't cause warnings with dependency:analyze (and related goals).
> h1. Background
> Spring Boot has a notion of "starter" dependencies. One of the primary
> purposes of starter dependencies is to transitively bring in numerous other
> dependencies to be used at both runtime and compile time. Per [Spring Boot's
> documentation|http://docs.spring.io/spring-boot/docs/1.5.1.RELEASE/reference/htmlsingle/#using-boot-starter]:
> {quote}
> Starters are a set of convenient dependency descriptors that you can include
> in your application. You get a one-stop-shop for all the Spring and related
> technology that you need, without having to hunt through sample code and copy
> paste loads of dependency descriptors. For example, if you want to get
> started using Spring and JPA for database access, just include the
> spring-boot-starter-data-jpa dependency in your project, and you are good to
> go.
> The starters contain a lot of the dependencies that you need to get a project
> up and running quickly and with a consistent, supported set of managed
> transitive dependencies.
> {quote}
> However, this is at odds with the analysis done by
> [dependency:analyze|https://maven.apache.org/plugins/maven-dependency-plugin/analyze-mojo.html]
> (and similar goals in the dependency plugin). The analyze goals will warn
> that the starter projects are "unused declared dependencies" and any
> compile-time dependencies that are transitively brought in this way will
> produce "used undeclared dependencies" warnings. Note that this warning
> behavior is consistent with the [Maven dependency
> documentation|http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope]
> where it states that it is intended that all compile dependencies be
> explicitly listed, rather than transitively used at compile time:
> {quote}it is intended that \[transitive compile dependencies\] should be
> runtime scope instead, so that all compile dependencies must be explicitly
> listed - however, there is the case where the library you depend on extends a
> class from another library, forcing you to have available at compile time.
> For this reason, compile time dependencies remain as compile scope even when
> they are transitive.{quote}
> As a concrete example, here are the warnings generated by {{mvn
> dependency:analyze}} on Spring Boot's own "[Getting
> Started|https://spring.io/guides/gs/spring-boot/]" example:
> {code}Used undeclared dependencies found:
> org.springframework:spring-web:jar:4.3.6.RELEASE:compile
> org.springframework.boot:spring-boot-test:jar:1.5.1.RELEASE:test
>
> org.springframework.boot:spring-boot-test-autoconfigure:jar:1.5.1.RELEASE:test
> org.springframework:spring-test:jar:4.3.6.RELEASE:test
> org.springframework.boot:spring-boot:jar:1.5.1.RELEASE:compile
> org.hamcrest:hamcrest-library:jar:1.3:test
> org.springframework:spring-context:jar:4.3.6.RELEASE:compile
> junit:junit:jar:4.12:test
>
> org.springframework.boot:spring-boot-autoconfigure:jar:1.5.1.RELEASE:compile
> org.springframework:spring-beans:jar:4.3.6.RELEASE:compile
> Unused declared dependencies found:
> org.springframework.boot:spring-boot-starter-web:jar:1.5.1.RELEASE:compile
> org.springframework.boot:spring-boot-starter-test:jar:1.5.1.RELEASE:test
>
> org.springframework.boot:spring-boot-starter-actuator:jar:1.5.1.RELEASE:compile{code}
> My initial thought was that perhaps Spring Boot was misuing the Maven
> dependency mechanism through their approach, however that is not their
> interpretation (see the discussion at
> [spring-boot#8341|https://github.com/spring-projects/spring-boot/issues/8341]).
> So, assuming I'm interpreting things correctly, it seems like the thought is
> that Spring Boot's usage of dependencies is A-OK. Given this, and the impact
> of Spring Boot in the Java ecosystem, it seems like it would be good for
> there to be support for this pattern within Maven's dependency analysis. I'm
> not sure what the most appropriate mechanism for this would be, however (and
> whether the dependency plugin is the primary place it should be supported).
> Is this just something that should be configurable within the
> dependency:analyze plugin itself? Are the starter dependencies a new class
> of dependency that should be called out within Maven? Is this something
> where the starter dependency should be able to declare that its compile-time
> dependencies are meant to be exported and directly used?
> h1. Workaround
> The obvious workaround is to mark the starter dependencies as
> ignoreNonCompile, and explicitly list all transitively used compile-time
> dependencies. However, this gets rid of one of the primary stated benefits
> of using the starter dependencies. It still provides the benefit of IDE
> auto-completion, at which point the dependencies can be manually added to the
> POM as used.
> The other option would be to not do anything, but then it's impossible to
> tell the difference between used undeclared dependencies that are OK because
> they are transitively provided, and those that are in the list because they
> are inadvertantly depended on.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)