[
https://jira.codehaus.org/browse/MNG-3092?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=313516#comment-313516
]
Sergei Ivanov commented on MNG-3092:
------------------------------------
For me the major annoyance in the current resolution mechanism is that [1.1.0,
1.2.0) appears to include 1.2.0-SNAPSHOT, but exclude 1.1.0-SNAPSHOT, which
looks completely counter-intuitive to me. In order to make sure that
1.2.0-SNAPSHOT is never resolved to, one needs to change all range
specifications to an equivalent of [1.1.0, 1.1.999] in the above case. This
does not solve the problem of not resolving to the initial snapshot in the
range (1.1.0-SNAPSHOT in our case). When one starts development of a 1.1.x
line, they are forced to change range specifications in dependencies to a fixed
1.1.0-SNAPSHOT version until the time 1.1.0 is released.
Another major annoyance is that whenever there is a snapshot in the local repo
and that snapshot is resolved from a version range, the release build of a
dependent project is doomed to fail. There is no way to force Maven release
execution to disregard snapshots and resolve to released versions only. In fact
this is almost a blocker, unless one uses a workaround as described below.
We have a very fluid project consisting of lots of applications and lots of
internally developed libraries, and we have to use version ranges for internal
dependencies, because otherwise keeping tens of projects in sync with their
upstream dependencies becomes a living hell. However, because of this very
MNG-3092, we had to make special arrangements in our CI environment in order to
make our builds stable and predictable.
In our CI environment, we have two completely Maven settings.xml configurations:
a) configuration for snapshot builds, which resolves from both release and
snapshot remote repositories and has its own separate local repository;
b) configuration for release builds, which does only resolve from remote
release repositories, and has its own separate local repository.
We use configuration (a) for CI jobs that either run "snapshot vs. snapshot"
builds, or nightly code analysis builds. We use configuration (b) for CI jobs
that run "snapshot vs. release" builds and for releasing new versions of
artifacts (effectively "release vs. release"). Only by separating local
repositories and by making sure that snapshots never make their way into local
release repository we can make sure that our release builds are stable.
Considering the current issue from a wider perspective, I am curious if there's
generally a strong use case for fine-grained control on snapshot resolution (on
a dependency declaration level), or whether the snapshot resolution strategy
must apply to the entire build execution.
Personally I am leaning towards an execution-level control via e.g. a command
line option. This way,
a) one could easily switch between "snapshot vs. snapshot" and "snapshot vs.
release" configurations in the same build, without having to set up separate
environments. This could especially be useful for IDE integration.
b) maven-release-plugin could automatically suppress resolution of version
ranges to snapshots in forked maven executions.
c) no additional changes are required for POM model.
To summarise, here's what I believe the desired behaviour would be, with the
option turned on or off respectively:
1. mvn --use-snapshots-in-ranges=false
This includes forked Maven executions from maven-release-plugin.
[1.1.0, 1.2.0] resolves to 1.1.0, 1.1.1, ..., 1.2.0
[1.1.0, 1.2.0) resolves to 1.1.0, 1.1.1, ..., 1.1.99999999999
(1.1.0, 1.2.0) resolves to 1.1.1, 1.1.2, ..., 1.1.99999999999
(1.1.0, 1.2.0] resolves to 1.1.1, 1.1.2, ..., 1.2.0
2. mvn --use-snapshots-in-ranges=true
[1.1.0, 1.2.0] resolves to 1.1.0-SNAPSHOT, 1.1.0, 1.1.1-SNAPSHOT, 1.1.1, ...,
1.2.0-SNAPSHOT, 1.2.0
[1.1.0, 1.2.0) resolves to 1.1.0-SNAPSHOT, 1.1.0, 1.1.1-SNAPSHOT, 1.1.1, ...,
1.1.99999999999-SNAPSHOT, 1.1.99999999999
(1.1.0, 1.2.0) resolves to 1.1.1-SNAPSHOT, 1.1.1, 1.1.2-SNAPSHOT, 1.1.2, ...,
1.1.99999999999-SNAPSHOT, 1.1.99999999999
(1.1.0, 1.2.0] resolves to 1.1.1-SNAPSHOT, 1.1.1, 1.1.2-SNAPSHOT, 1.1.2, ...,
1.2.0-SNAPSHOT, 1.2.0
How does that feel?
> Version ranges with non-snapshot bounds can contain snapshot versions
> ---------------------------------------------------------------------
>
> Key: MNG-3092
> URL: https://jira.codehaus.org/browse/MNG-3092
> Project: Maven 2 & 3
> Issue Type: Bug
> Components: Dependencies
> Reporter: Mark Hobson
> Fix For: 3.1.0
>
> Attachments: MNG-3092.patch
>
>
> Contrary to the 2.0 design docs:
> "Resolution of dependency ranges should not resolve to a snapshot
> (development version) unless it is included as an explicit boundary."
> -- from
> http://docs.codehaus.org/display/MAVEN/Dependency+Mediation+and+Conflict+Resolution#DependencyMediationandConflictResolution-Incorporating%7B%7BSNAPSHOT%7D%7Dversionsintothespecification
> The following is equates to true:
> VersionRange.createFromVersionSpec( "[1.0,1.1]" ).containsVersion( new
> DefaultArtifactVersion( "1.1-SNAPSHOT" ) )
> The attached patch only allows snapshot versions to be contained in a range
> if they are equal to one of the boundaries. Note that this is a strict
> equality, so [1.0,1.2-SNAPSHOT] will not contain 1.1-SNAPSHOT.
--
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