[
https://jira.codehaus.org/browse/MNG-2205?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=305311#comment-305311
]
Ivan Bondarenko commented on MNG-2205:
--------------------------------------
I have voted for this.
Half-abstract and half-concrete example: A -> B(compile) ->
servlet-api(provided), A must have an access to servlet-api classes (or at
least have such possibility), because A must sit in web-container, so B has no
other choice. In some cases A don't need classes from servlet-api, but this is
not a problem, "compile" scope creates more problems in this case, because it
pulls unnecessary dependencies along into package.
I think the solution may be removing "optional" tag from dependency definition.
Instead the tag "transitivity" can be introduced, which may be flexible and has
different values:
1) 'transitive' - always transitive
2) 'optional' - as optional=true in current variant
3) 'detect' - transitive for cases when "The type <NAME> cannot be resolved. It
is indirectly referenced from required .class files" compile error appears
4) 'non-transitive' - always non-transitive
5) etc
For backward compatibility 'transitive' can be default for "compile" scope and
'non-transitive' for "provided"
> "provided" scope dependencies must be transitive
> ------------------------------------------------
>
> Key: MNG-2205
> URL: https://jira.codehaus.org/browse/MNG-2205
> Project: Maven 2 & 3
> Issue Type: Bug
> Components: Dependencies
> Reporter: David Boden
> Priority: Critical
> Fix For: 3.x / Backlog
>
> Attachments: transitivetest.zip
>
>
> A provided scope dependency can also be thought of as "compile-only".
> Project A requires Sybase JConnect on the runtime classpath. Project A
> declares a "provided" dependency on Sybase JConnect.
> Project B depends upon Project A. Project B declares a "compile" dependency
> on Project A.
> Project C depends upon Project B. Project C declares a "compile" dependency
> on Project B.
> C
> | - compile dependency
> B
> | - compile dependency
> A
> | - provided dependency
> Sybase JConnect
> So, does Project C transitively depend on Sybase JConnect. Yes, of course!
> The "provided" dependency needs to be transitive.
> Ultimately, when Project C gets deployed, Sybase JConnect needs to be
> somewhere on the runtime classpath in order for the application to function.
> It's valid for Project C to assume that Sybase JConnect is available and use
> JDBC all over the Project C code. Project C is safe to do this because it can
> happily deduce that Sybase JConnect will be there in the runtime environment
> because Project A NEEDS IT.
> I've got Use Cases all over my aggregated build which make it absolutely
> critical and common sense that provided scope dependencies are transitive.
> For the (very rare) odd case where you don't want to inherit provided
> dependencies, you can <exclude/> them.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://jira.codehaus.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira