As the project manager and the one responsible for dealing with the phone calls from irate client managers when the SaaS crashes or does bad things to a bunch of their busy users, I want the developers to test with the version that they built with and run with the version that they tested.

In an SaaS environment, you don't have time to evaluate which one of your dozens of dependencies is crashing one or more of your modules. You have customers who are down until you either fix the problem with your new version or roll-back and explain to the customers how they are going to fix or replace the transactions that are incorrect.

Haphazard selection of versions does not reduce risk.


Ron


On 29/09/2012 4:01 PM, Jason van Zyl wrote:
On Sep 29, 2012, at 12:31 PM, Stephen Connolly 
<stephen.alan.conno...@gmail.com> wrote:

The issue I see is that there is a difference with ranges between build
time and run time.

Bingo. And this is what confuses a lot of people especially if they come from 
OSGi where the target platform against which they compile is really a runtime 
notion. But I believe this is a completely flawed approach. Igor and I have had 
so many conversations about this.

In general at build time you want the lowest version in the range (assuming
the api is versions correctly) to ensure you are compatible with the
smallest set of api method signatures.
At build time you build against _one_ version. You may want it to be the 
lowest, or some other criterion, but you build against a very specific version. 
No in their right might is going to let the system just resolve any 
implementation from any source. Never, ever going to happen and the conflation 
of these things specifically in Maven was just an oversight in what we actually 
allow. I think Ralph got it mostly right in how dependencyManagement works 
because in practice most of the time you want to severely limit what gets 
chosen. Where the current system breaks down is the combination of many 
subsystems but that's another story and if you're dealing with one application 
all the time it works great. You compile against something very specific. At 
runtime however you may let the system roam somewhat in order to update without 
rebuilding the whole system for performance problems, security fixes or what 
have you.

Allowing ranges in the POM for compilation I believe is a mistake for the most 
part. Maven conflates the compile time and runtime where compile time is king, 
and OSGi conflates compile time and runtime where runtime is king. Both have 
problems. A QA person cannot validate a range in practice, they can however 
validate a concrete set of components and given proper retention policies on 
repositories, proper management of configurations of the various systems the 
result is reproducible. This things was built, I tested this thing and it runs 
as expected so I'm shipping this thing which consists of a known set of 
artifacts. On top of that you can reason about what might be acceptable 
changes. But again in practice who is going to let a runtime system just go 
grab some shit and update itself. Probably no one. Really you find you need to 
make a change, you introduce a new artifact and test it again. I really don't 
think anyone really allows a runtime to update itself without strict 
constraints.

There are distinct cases as well. If you're a SaaS you likely don't give a crap 
and you just rebuild everything and deploy it again, or you take a diff of the 
artifacts of one build to the next and send instructions to a node and change 
it to mirror the new version, or use a git repo and just update it. The case of 
Eclipse is different in that you want people to be able to update to newer 
versions. But we build m2e with very specific versions of bundles and then use 
ranges so that people with existing installations and use new things. But the 
Eclipse repository for a release is extremely constrained from version to 
version. Everyone builds against the same thing building up to a release and we 
put ranges in manifests so people can update, but compile time is for the most 
part very specific.

At any rate, I believe the specification of what you compile with versus what 
you may potentially want to run with should be separated. Maven and OSGi get 
this wrong from my perspective. And it seems to me in the wild more people do 
OSGi with Maven so this muddies the water even further (the maven-bundle-plugin 
is the most used plugin outside of the core maven plugins).

At run time you want the highest as it has the most big fixes in theory.
Right, in theory you would like to leave the runtime intact for as long as 
possible absorbing changes without rebuilding if possible. But I'm not sure 
this is really done. At the most advanced development shops I've been in there 
are radical simplifications like just rebuild and redeploy the whole thing 
because Maven, along with everything else can result in problems primarily from 
configuration differences, retention policies on repositories but it's enough 
to cause problems that prevent predictable re-deploys. So they rebuild and 
redeploy the whole thing.

At test time you ideally want every version. But that matrixes out to an
impossible combinatorial.
I think you create them when necessary and they are specific and you test that 
and validate it. No one in practice tests all combinations as it's likely many 
of them are not used so why expend the resources to try them.

On Saturday, 29 September 2012, Hervé BOUTEMY wrote:

Le samedi 29 septembre 2012 09:46:28 Mark Struberg a écrit :
I thought about mathematical ranges as well, and the outcome for me
personally that a strict mathematical time vector interpretation makes no
sense for maven.


You have a library in version 1.7.0 which fits your project.

Somewhen in the development of 1.8.0-SNAPSHOT they introduce a binary
incompatible change.

But 1.7.2, 1.7.3 1.7.4, ... might wirk fine still.

Also: for most dependencies you only like to get released versions via
your
version range. But as I read here some use this internally as well and
like
to get SNAPSHOTS resolved.
a range tells about a constraint
then choosing a precise version between the multiple choices that match
constraints is not about the range but about what is usually called
"conflict
resolution"
This term is ok when it's about changing preferred version (ie when
versions
are not defined as range but as simple version, which means preferred
version)
but that term doesn't show that when it's about ranges, it's not about
conflict
but about choosing one version between the multiple valid choices: do you
prefer the most recent? even if it is a snapshot or an alpha? or if the
most
recent is an alpha, you prefer to stick with stable version?
IMHO, during development, you can want to test latest alpha SNAPSHOT, but
when
doing a release, you'll prefer stable versions

What about simply writing up what people like to have and then implement
a
new mechanism? I could even think about regexp based versioning...
sure, there is something to create here, but IMHO not into version ranges:
into conflict resolution specification and switch (with CLI or IDE)

LieGrue,
strub




----- Original Message -----

From: Hervé BOUTEMY <herve.bout...@free.fr>
To: Maven Users List <users@maven.apache.org>
Cc:
Sent: Saturday, September 29, 2012 5:06 AM
Subject: Re: Version ranges not working

yes, https://jira.codehaus.org/browse/MNG-3092 is still here

I'm not comfortable with the idea of excluding SNAPSHOT from ranges:
if we
do
so, it's not a *range* any more but a range + a filter
(1.7.1-SNAPSHOT is in [1.7,1.8] range,"in plain english")

and actual discussion helps me dig into other ideas that could be
useful:
IIUC, it can be useful to exclude SNAPSHOTs from ranges, yes, but
alphas
and beta too, no?
But I'm not sure about the use case (and "Guide to using version
ranges" still
needs to be written: https://jira.codehaus.org/browse/MNG-1368)
I understand that when a library is at 1.9 and someone needs old 1.8-,
he
implictely wants releases, not alpha nor SNAPSHOTS
But if 1.8 is still not out, and there is still work on 1.7.x, we need
to
accept *latest* 1.7.x whatever its maturity level is


Really , excluding version from a mathematical range is another
operation
that needs some specification and probably something more expressive
than
[min,max]

Regards,

Hervé

Le vendredi 28 septembre 2012 08:07:21 David Hoffer a écrit :
I find this topic interesting for a couple of reasons.  I was one of
the
original posters of this topic and created some of the relevant JIRA
issues
regarding it.

However one of the problems is that since this issue was never
fixed...and
sadly seems never will be...we had to abandon the use of version
ranges.  I
do not agree they are a bad idea.  I think they could have been a
very
useful feature if implemented as originally proposed.

  (The fundamental problem was that they did not exclude SNAPSHOTS as

originally intended/stated.)

Effectively we had to work around the lack of version ranges by just
building against SNAPSHOTS instead (I'm talking about internal code
here).

  So effectively the SNAPSHOT became our version range.  One of the
problems>>
of this approach is now I have to toggle between going
offline/online if
I
don't want to accept new updates since it will be changing on a
regular
basis.  Using version ranges would have been a more elegant solution
as
it
would give me more control over what versions I depend on during
development.

Because it wasn't fixed and we had to do the workaround I have not
been
close to this issue anymore...its been like 5 years or more.  But the
short
answer is it should be fixed and it can/could be useful as some have
indicated in this discussion.

-Dave

On Fri, Sep 28, 2012 at 6:42 AM, Ron Wheeler
<rwhee...@artifact-software.com

wrote:

On 28/09/2012 3:17 AM, Jesse Long wrote:
Without version ranges, how do I write a library that works with
SLF4J

Thanks,

Jason

----------------------------------------------------------
Jason van Zyl
Founder & CTO, Sonatype
Founder,  Apache Maven
http://twitter.com/jvanzyl
---------------------------------------------------------









--
Ron Wheeler
President
Artifact Software Inc
email: rwhee...@artifact-software.com
skype: ronaldmwheeler
phone: 866-970-2435, ext 102



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@maven.apache.org
For additional commands, e-mail: users-h...@maven.apache.org

Reply via email to