Sure. I can document this. I have already written the code that accounts for the circularity problem. Instead of getting the stack overflow or out of memory error it will throw a ProjectBuildingException and identify both the failing artifact and the parent. However, I have to retest this since some changes have been recently been made to DefaultMavenProjectBuilder. I also have not tested this with trunk.

The larger question is with regards to trunk. It was requested that <scope>import</scope> not be used there and that importing just be the defined behavior of specifying a pom in a dependencyManagement section. I haven't questioned this because for the life of me I can't figure out what the use case is that would put a pom as a dependency there and expect something useful to happen. It also isn't at all clear to me why the child pom even declares that it inherits from its parent. Maybe that is simply because in the test case you sent me the child pom wasn't doing anything? Can you describe what they are actually trying to do?

Ralph

John Casey wrote:
Hi all,

I wanted to bring up some interesting effects I've come across having to do with the new import scope. In what I'd call conventional cases, this feature seems to work just fine. These cases have been covered in the core integration-tests for mng-3220. Basically, as long as the referenced POM is outside the current reactor and reachable through the repository system, its dependencyManagement section is merged with the referencing POM's section. If the POM referenced in a project's dependencyManagement section's scope != import, the pom will be included just as it always has been. This means the dependencyManagement entries in this referenced pom will not be available to the referencing project.

However, there are some scenarios where things break pretty drastically. Basically, it hinges on a three critical references between two POMs in order produce these errors:

1. a project that specifies a dependencyManagement reference with scope == import and type == pom 2. a module reference to the same project, loaded as a result of the modules in the project from #1 3. the module project must also have a <parent/> reference pointing to the POM from #1 and #2.

When these three conditions are present, one of the following will happen:

1. the referenced and referencing POMs are siblings, with the referenced POM being built first by sheer chance: in these cases, the build should proceed normally, since the referenced project instance will be cached by the time it's required for dependencyManagement merging.

2. the referenced POM is not in the local repository, and is loaded after the referencing POM in the reactor: in these cases, the referenced POM instance has not been built by the time it's required for dependencyManagement merging. Nothing is yet known about the location of the referenced POM, and the build fails with an ArtifactNotFoundException because of the referenced POM that hasn't been instantiated yet.

3. the referenced POM is both among the modules of the current build and in the local repository: in these cases, a truly evil scenario plays out. The referencing POM triggers the loading of the referenced POM out of the local repository, NOT the project filesystem. This is because nothing is yet known about the contents of module POMs, so there is no way for Maven to know that the referenced POM will be loaded as part of the reactor. When the referenced POM is loaded, it must first build its ancestry in order to compute inheritance. The referenced POM's parent (or some ancestor) is the same project that triggered the referenced POM to be built from the local repository. This produced a circular reference where the functional parts of the cycle looks like this:

A [dependencyManagement -> B] -> B [parent -> A] -> A [dependencyManagement -> B]

or something similar.

The tests for these problems are (or will be; I'm not sure how far I'll get tonight) included in the integration-tests for mng-3391.

At a minimum, I think we need to document the cases where import scope can cause big problems. The good news is, the problems only occur when a build [mis]uses new functionality only available in 2.0.9+, so we should be able to present this functionality as alpha-grade with the aforementioned warnings.

Ralph, I think I have this stated as precisely as I can...would you mind writing up the feature documentation for the website, including the above and anything I may have missed? I'm not sure I have a solid enough understanding of the purpose of the import scope, or the cases where it should and should not be used.

Thanks,

-john

---
John Casey
Committer and PMC Member, Apache Maven
mail: jdcasey at commonjava dot org
blog: http://www.ejlife.net/blogs/john
rss: http://feeds.feedburner.com/ejlife/john




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

Reply via email to