Re: depMgt (mng-1577 again....)

2007-06-17 Thread Jörg Schaible
Kenney Westerhof wrote:

[snip]

>>> The meaning of depMgt is different, applied to either local deps or
>>> transitive deps, and it's not consistent.
>>>
>>> This somewhat describes the situation:
>>> - depMgt for artifact X is used to provide defaults for direct
>>> dependencies of artifact X,
>>>   and for overrides of transitive dependencies on X,
>>>   unless there's also a direct dependency on X in which case the direct
>>>   dependency is used.
>>>
>>>
>>> I'm sure this is not intended, so what should the intended behaviour be?
>> 
>> No, this was *exacltly* the intended behaviour! Do you know, how often we
>> have to add direct deps simply because depMgmt did not override the
>> transitive deps?
> 
> Ok, so you wanna be able to override transitive deps, that's fine; a good
> usecase.
> 
> [snip]
> 
>> Everytime a third-party dep is upgraded, you have to check all its
>> dependencies again. You never know in your EJB if the local deps are
>> there to override transitive one or if they are really necessary.
> 
> You have to do that too now, for your modules. If one module defines a
> dependency with a version different from your depMgt, you won't get the
> version specified in depMgt. You're shifting the problem with this
> solution..

Yes, but did I tell ya already, that we don't define the versions in our
direct deps? ;-)

[snip]

>>> Either we keep the 'child overrides' that's globally present in all of
>>> maven, so that dependencies can override depMgt, as is the case now, and
>>> also apply that to transitive deps, OR we let depMgt override both local
>>> and transitive deps.
>>>
>>> Or, is this the intended behaviour after all?
>> 
>> Yes, it is. Definitely for me and I reported 1577. Thanks again for those
>> guys who implemented it.
> 
> I'm ok with the fact that depMgt overrides versions. I just expected it to
> do just that, and not be a 'default' or 'override' depending on how many
> resolution nodes away a dependency was.
> Say project A extends P where P declares depmgt for B 1.0,
> and A needs B 2.0. Since dependency versions are 'hints' anyway, they
> shouldn't be used to override something that's designed to override; just
> use the override mechanism already there - the depMgt. Inheritance will
> make sure that any depMgt section in A overrides depMgt sections in P, so
> you still can have what you want.

I don't grok your description here fully, therefore I reference the example
you gave Brian.

Just imaging A, B, C, D are EJBs and X is an EAR. You realize you're in
trouble now? You cannot build a valid X.ear at all, all EJBs refer a
different version of E in their manifest. Therefore none of the EJBs should
declare a direct dep with a version.

You may argue that B may now no longer compile or run, since it has to use
an old version of E, but that's exactly what I want ... get a hint very
early in the process, that you have a severe version conflict and you have
to do something in your code!

> If I see a depMgt section now, I have no clue what the intent was -
> defaults or overrides? I'd have to scan the entire module tree to find
> out; and even then, it could be that for a subset of modules it was meant
> as an override, and for another subset as defaults. The project as a whole
> will have problems since there are 2 versions for a given artifact, and
> depending on the depth, one of them will be chosen. This is very bad imho.

What is the distinction between default and override really good for? In the
end my EAR will contain exactly *one* version of the artifact and I really
prefer that the unit tests for all my submodules and (EJBs as well as JARs)
already use that one ... for obvious reasons. Bitten before!

- Jörg


-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: depMgt (mng-1577 again....)

2007-06-16 Thread Kenney Westerhof



Ralph Goers wrote:

Kenney Westerhof wrote:


This somewhat describes the situation:
- depMgt for artifact X is used to provide defaults for direct 
dependencies of artifact X,

 and for overrides of transitive dependencies on X,
 unless there's also a direct dependency on X in which case the direct 
dependency is used.



I'm sure this is not intended, so what should the intended behaviour be?
Actually, from the discussions that occurred while this was being 
developed what you are describing is exactly what was intended.


  1. Before the fix depMgt only provided defaults for direct artifacts
 and had no impact on transitive dependencies.
  2. The first version of my path overrode both direct and transitive
 dependencies. Objections were raised to it doing that so it was
 modified to its current behavior.
  3. This is OK because you have control over your depMgt and your
 direct dependencies. You can choose (or not) to specify versions
 in the dependencies. You have no such control over transitive
 dependencies.



Either we keep the 'child overrides' that's globally present in all of 
maven, so that dependencies
can override depMgt, as is the case now, and also apply that to 
transitive deps,
This doesn't work. It was essentially how things worked in 2.0.6. You 
will never have a clue what you are going to get as you have no way to 
control what transitive dependencies bring in, except by artificially 
declaring them in projects that don't really need them.

OR we let depMgt override both local and transitive deps.

See above.


I think you're misreading (or I am). What's the problem with depMgt ALWAYS 
overriding?
At least that's consistent.

-- Kenney



Or, is this the intended behaviour after all?

Yes

Ralph

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: depMgt (mng-1577 again....)

2007-06-16 Thread Kenney Westerhof



Jörg Schaible wrote:

Kenney Westerhof wrote:


Hi,

Just did some test wrt MNG-2340 (using maven 2.0.7 and 2.0.6), and this is
what I found:

P with dependencyManagement for lucene 1.3
|
+ my-dep with dependency on lucene 1.4.3
+ my-app with dependency on my-dep

(I modified the attached project locally; rename my-app to my-dep and add
my-app with a dep on my-dep).

When building my-dep, after installing P, I get lucene 1.4.3, so depMgt is
used for DEFAULTS for direct dependencies.

When building my-app, after installing P and my-dep, I get lucene 1.3. So
depMgt is used as OVERRIDE for transitive dependencies.


Yes.
 

When I add a dep on lucene without a version in my-app, I get 1.3 aswell.

When I add a dep on lucene 1.4.2 in my-app I get lucene 1.4.2.

(luckily this also happens when building from the reactor).


This is one of the many possible implementations I described in


http://docs.codehaus.org/display/MAVEN/Maven+2.1+Artifact+Resolution+Specification,

and it's one that I don't think we should support.

The meaning of depMgt is different, applied to either local deps or
transitive deps, and it's not consistent.

This somewhat describes the situation:
- depMgt for artifact X is used to provide defaults for direct
dependencies of artifact X,
  and for overrides of transitive dependencies on X,
  unless there's also a direct dependency on X in which case the direct
  dependency is used.


I'm sure this is not intended, so what should the intended behaviour be?


No, this was *exacltly* the intended behaviour! Do you know, how often we
have to add direct deps simply because depMgmt did not override the
transitive deps? 


Ok, so you wanna be able to override transitive deps, that's fine; a good 
usecase.

[snip]


Everytime a third-party dep is upgraded, you have to check all its
dependencies again. You never know in your EJB if the local deps are there
to override transitive one or if they are really necessary.


You have to do that too now, for your modules. If one module defines a 
dependency
with a version different from your depMgt, you won't get the version specified 
in depMgt.
You're shifting the problem with this solution..


Even worse, the transitive deps can change simply by adding a complete
unrelated dep in your component. All because the sequence the deps are
processed seems to be an iterator over a hash map. We had cases, were
adding a *unrelated* dep caused the compilation of an project to fail,
since suddenly a transitive dep was resolved in a different version.


Yeah, that's fixed since 2.0.5; when 2 deps at the same depth have different 
versions,
a 'random' one is chosen, depending on the hash or set implementation of your 
JRE.


Either we keep the 'child overrides' that's globally present in all of
maven, so that dependencies can override depMgt, as is the case now, and
also apply that to transitive deps, OR we let depMgt override both local
and transitive deps.

Or, is this the intended behaviour after all?


Yes, it is. Definitely for me and I reported 1577. Thanks again for those
guys who implemented it.


I'm ok with the fact that depMgt overrides versions. I just expected it to do 
just that,
and not be a 'default' or 'override' depending on how many resolution nodes 
away a dependency
was. 
Say project A extends P where P declares depmgt for B 1.0,

and A needs B 2.0. Since dependency versions are 'hints' anyway, they shouldn't 
be used to override
something that's designed to override; just use the override mechanism already 
there - the depMgt.
Inheritance will make sure that any depMgt section in A overrides depMgt 
sections in P, so you
still can have what you want.


If I see a depMgt section now, I have no clue what the intent was - defaults or 
overrides?
I'd have to scan the entire module tree to find out; and even then, it could be 
that for a subset
of modules it was meant as an override, and for another subset as defaults.
The project as a whole will have problems since there are 2 versions for a 
given artifact, and
depending on the depth, one of them will be chosen. This is very bad imho.

-- Kenney



- Jörg


-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: depMgt (mng-1577 again....)

2007-06-16 Thread Kenney Westerhof



Brian E. Fox wrote:

I think you're questioning if you have this:


 
  
   foo
   com
   1
  
 



  
   foo
   com
   2
  
 

Should you get 1 or 2? Without the direct dependency, you should get 1 if pulled in transitively. 
With the direct dependency as shown, you should get 2. I think you always need to maintain the 
ability to override at a child level if needed. 


No i'm not questioning that. With maven 2.0.5 and before you'd get 1, with 
2.0.6 and later you get 2.

I'm questioning the dubious meaning of depMgt. you cannot tell wheter it was 
created to declare overrides
for transitive deps, or wheter it was meant as defaults for direct deps. Either 
way, as soon
as a direct dep is added resp. removed in any child module at any depth, the 
meaning changes and you get a
different version. It's inconsistent, and you cannot tell what a 
dependencyManagement section does (which version
of the dep you're goanna get) without looking at the entire module tree.


This has some consequences if the depMgt was inherited and sibling dependencies 
are used since they
would ignore the declared direct dependency in some cases.
Is that why you think the behavior is wrong?


Exactly; they'd honor the direct dep, but if it's absent and there's a 
transitive one, that one may win,
depending on how far the dep is away from a module.

P depMgt for E at 1.0
|
+ A dep on B, dep on C
+ B dep on C, dep on E 3.0
+ C dep on E version 2.0
+ D dep on E, no version
+ X dep on A, B, C, D

D would get E 1.0
C would get E 2.0
B would get E 3.0
A would get either 3.0 or 2.0
( A -> B -> E 3.0
 A -> C -> E 2.0 )

X would get:
X -> A -> B -> E 3.0
X -> A -> C -> E 2.0
X -> B -> E 3.0
X -> B -> C -> E 2.0
X -> C -> E 2.0
X -> D -> E 1.0

Shortest paths are through B, C and D, so can get either 1.0, 2.0 or 3.0. Which is it? 
According to my tests on 3 simple projects, since E is not a direct dep from X, the depMgt overrides

kick in and I should get E 1.0 on X, right?

It's way to confusing this way and totally not straightforward. An element can 
change semantics
by something far away; that's not descriptive or deterministic or repeatable.

If we need 2 different ways to handle versions:
1) declare defaults for direct dependencies
2) declare overrides for transitive ones
we need a new element, like 'transitiveDependencyManagement'.

This is something I hope we won't support in 2.1...

-- Kenney



-Original Message-
From: Kenney Westerhof [mailto:[EMAIL PROTECTED] 
Sent: Saturday, June 16, 2007 7:06 AM

To: Maven Developers List
Subject: depMgt (mng-1577 again)

Hi,

Just did some test wrt MNG-2340 (using maven 2.0.7 and 2.0.6), and this is what 
I found:

P with dependencyManagement for lucene 1.3
|
+ my-dep with dependency on lucene 1.4.3
+ my-app with dependency on my-dep

(I modified the attached project locally; rename my-app to my-dep and add 
my-app with a dep on my-dep).

When building my-dep, after installing P, I get lucene 1.4.3, so depMgt is used 
for DEFAULTS for direct dependencies.

When building my-app, after installing P and my-dep, I get lucene 1.3. So 
depMgt is used as OVERRIDE
for transitive dependencies.

When I add a dep on lucene without a version in my-app, I get 1.3 aswell.

When I add a dep on lucene 1.4.2 in my-app I get lucene 1.4.2.

(luckily this also happens when building from the reactor).


This is one of the many possible implementations I described in 
http://docs.codehaus.org/display/MAVEN/Maven+2.1+Artifact+Resolution+Specification,

and it's one that I don't think we should support.

The meaning of depMgt is different, applied to either local deps or transitive 
deps,
and it's not consistent.

This somewhat describes the situation:
- depMgt for artifact X is used to provide defaults for direct dependencies of 
artifact X,
  and for overrides of transitive dependencies on X,
  unless there's also a direct dependency on X in which case the direct 
dependency is used.


I'm sure this is not intended, so what should the intended behaviour be?

Either we keep the 'child overrides' that's globally present in all of maven, 
so that dependencies
can override depMgt, as is the case now, and also apply that to transitive deps,
OR we let depMgt override both local and transitive deps.

Or, is this the intended behaviour after all?

-- Kenney


-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: depMgt (mng-1577 again....)

2007-06-16 Thread Ralph Goers

Kenney Westerhof wrote:


This somewhat describes the situation:
- depMgt for artifact X is used to provide defaults for direct 
dependencies of artifact X,

 and for overrides of transitive dependencies on X,
 unless there's also a direct dependency on X in which case the direct 
dependency is used.



I'm sure this is not intended, so what should the intended behaviour be?
Actually, from the discussions that occurred while this was being 
developed what you are describing is exactly what was intended.


  1. Before the fix depMgt only provided defaults for direct artifacts
 and had no impact on transitive dependencies.
  2. The first version of my path overrode both direct and transitive
 dependencies. Objections were raised to it doing that so it was
 modified to its current behavior.
  3. This is OK because you have control over your depMgt and your
 direct dependencies. You can choose (or not) to specify versions
 in the dependencies. You have no such control over transitive
 dependencies.



Either we keep the 'child overrides' that's globally present in all of 
maven, so that dependencies
can override depMgt, as is the case now, and also apply that to 
transitive deps,
This doesn't work. It was essentially how things worked in 2.0.6. You 
will never have a clue what you are going to get as you have no way to 
control what transitive dependencies bring in, except by artificially 
declaring them in projects that don't really need them.

OR we let depMgt override both local and transitive deps.

See above.


Or, is this the intended behaviour after all?

Yes

Ralph

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: depMgt (mng-1577 again....)

2007-06-16 Thread Jörg Schaible
Kenney Westerhof wrote:

> Hi,
> 
> Just did some test wrt MNG-2340 (using maven 2.0.7 and 2.0.6), and this is
> what I found:
> 
> P with dependencyManagement for lucene 1.3
> |
> + my-dep with dependency on lucene 1.4.3
> + my-app with dependency on my-dep
> 
> (I modified the attached project locally; rename my-app to my-dep and add
> my-app with a dep on my-dep).
> 
> When building my-dep, after installing P, I get lucene 1.4.3, so depMgt is
> used for DEFAULTS for direct dependencies.
> 
> When building my-app, after installing P and my-dep, I get lucene 1.3. So
> depMgt is used as OVERRIDE for transitive dependencies.

Yes.
 
> When I add a dep on lucene without a version in my-app, I get 1.3 aswell.
> 
> When I add a dep on lucene 1.4.2 in my-app I get lucene 1.4.2.
> 
> (luckily this also happens when building from the reactor).
> 
> 
> This is one of the many possible implementations I described in
>
http://docs.codehaus.org/display/MAVEN/Maven+2.1+Artifact+Resolution+Specification,
> and it's one that I don't think we should support.
> 
> The meaning of depMgt is different, applied to either local deps or
> transitive deps, and it's not consistent.
> 
> This somewhat describes the situation:
> - depMgt for artifact X is used to provide defaults for direct
> dependencies of artifact X,
>   and for overrides of transitive dependencies on X,
>   unless there's also a direct dependency on X in which case the direct
>   dependency is used.
> 
> 
> I'm sure this is not intended, so what should the intended behaviour be?

No, this was *exacltly* the intended behaviour! Do you know, how often we
have to add direct deps simply because depMgmt did not override the
transitive deps? Every EJB has all its deps (transitive or direct) in the
manifest as classpath entry. Now try to build an EAR that consists of ~10
EJBs ... this is a whole nightmare, if you cannot override the transitive
deps. And the EJB will simply fail if the EAR is deployed and not all of
those EJBs use the deps in the same version.

Everytime a third-party dep is upgraded, you have to check all its
dependencies again. You never know in your EJB if the local deps are there
to override transitive one or if they are really necessary.

Even worse, the transitive deps can change simply by adding a complete
unrelated dep in your component. All because the sequence the deps are
processed seems to be an iterator over a hash map. We had cases, were
adding a *unrelated* dep caused the compilation of an project to fail,
since suddenly a transitive dep was resolved in a different version.

> Either we keep the 'child overrides' that's globally present in all of
> maven, so that dependencies can override depMgt, as is the case now, and
> also apply that to transitive deps, OR we let depMgt override both local
> and transitive deps.
> 
> Or, is this the intended behaviour after all?

Yes, it is. Definitely for me and I reported 1577. Thanks again for those
guys who implemented it.

- Jörg


-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



RE: depMgt (mng-1577 again....)

2007-06-16 Thread Brian E. Fox
I think you're questioning if you have this:


 
  
   foo
   com
   1
  
 



  
   foo
   com
   2
  
 

Should you get 1 or 2? Without the direct dependency, you should get 1 if 
pulled in transitively. With the direct dependency as shown, you should get 2. 
I think you always need to maintain the ability to override at a child level if 
needed. 

This has some consequences if the depMgt was inherited and sibling dependencies 
are used since they would ignore the declared direct dependency in some cases. 
Is that why you think the behavior is wrong?

-Original Message-
From: Kenney Westerhof [mailto:[EMAIL PROTECTED] 
Sent: Saturday, June 16, 2007 7:06 AM
To: Maven Developers List
Subject: depMgt (mng-1577 again)

Hi,

Just did some test wrt MNG-2340 (using maven 2.0.7 and 2.0.6), and this is what 
I found:

P with dependencyManagement for lucene 1.3
|
+ my-dep with dependency on lucene 1.4.3
+ my-app with dependency on my-dep

(I modified the attached project locally; rename my-app to my-dep and add 
my-app with a dep on my-dep).

When building my-dep, after installing P, I get lucene 1.4.3, so depMgt is used 
for DEFAULTS for direct dependencies.

When building my-app, after installing P and my-dep, I get lucene 1.3. So 
depMgt is used as OVERRIDE
for transitive dependencies.

When I add a dep on lucene without a version in my-app, I get 1.3 aswell.

When I add a dep on lucene 1.4.2 in my-app I get lucene 1.4.2.

(luckily this also happens when building from the reactor).


This is one of the many possible implementations I described in 
http://docs.codehaus.org/display/MAVEN/Maven+2.1+Artifact+Resolution+Specification,
and it's one that I don't think we should support.

The meaning of depMgt is different, applied to either local deps or transitive 
deps,
and it's not consistent.

This somewhat describes the situation:
- depMgt for artifact X is used to provide defaults for direct dependencies of 
artifact X,
  and for overrides of transitive dependencies on X,
  unless there's also a direct dependency on X in which case the direct 
dependency is used.


I'm sure this is not intended, so what should the intended behaviour be?

Either we keep the 'child overrides' that's globally present in all of maven, 
so that dependencies
can override depMgt, as is the case now, and also apply that to transitive deps,
OR we let depMgt override both local and transitive deps.

Or, is this the intended behaviour after all?

-- Kenney


-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]