List of active profiles defined in ~/.m2/settings.xml gets lost when parsing 
dependency POMs
--------------------------------------------------------------------------------------------

                 Key: MNG-4930
                 URL: http://jira.codehaus.org/browse/MNG-4930
             Project: Maven 2 & 3
          Issue Type: Bug
          Components: Dependencies, Profiles, Reactor and workspace, Settings
    Affects Versions: 3.0.1, 3.0, 2.2.1, 3.0.2
         Environment: Windows, Mac OS X, quite possibly all others
            Reporter: Tibor Varga
         Attachments: maven-bug.patch, root.zip, settings.xml

Scenario:

* {{root}} project with two sub projects, {{test-api}} and {{test-impl}}
* {{~/.m2/settings.xml}} defines a property in a profile, {{xxx}}.
* {{root/pom.xml}} defines a property, {{yyy}}, and a profile that defines 
another property, {{zzz}}.
* {{test-impl}} depends on {{test-api}}
* {{test-api}} declares a dependency that uses {{xxx}} as the {{groupId}}, 
{{yyy}} as the {{artifactId}} and {{zzz}} as the {{type}}.
* Compile the {{root}} project with Maven ({{mvn compile}}), making sure the 
profiles are active, one way or another.

When {{test-api}} is compiled, all goes well. When {{test-impl}} is compiled, 
Maven warns of the following:

{noformat}
[WARNING] The POM for test:test-api:jar:1.0-SNAPSHOT is invalid, transitive 
dependencies (if any) will not be available,
enable debug logging for more details
{noformat}

Turning on debuggig ({{mvn -X compile}}) prints:
{noformat}
[WARNING] The POM for test:test-api:jar:1.0-SNAPSHOT is invalid, transitive 
dependencies (if any) will not be available:
1 problem was encountered while building the effective model for 
test:test-api:1.0-SNAPSHOT
[ERROR] 'dependencies.dependency.groupId' for ${xxx}:junit:jar with value 
'${xxx}' does not match a valid id pattern. @ 
{noformat}

Apparently, property interpolation failed for {{xxx}} but not for {{yyy}} or 
{{zzz}}, and {{xxx}} fails only when it is referenced in a _dependency_ of the 
current project. When it is referenced in the current project, it gets properly 
interpolated.

What actually happens is that the list of active profiles defined outside the 
reactor gets lost when resolving dependencies of the current project. They are 
available when the current project's POM is parsed but not when parsing the POM 
of the current project's dependencies.

Now, although this is just a warning in my sample scenario, the consequences in 
real life are more serious: "no transitive dependencies" means, e.g., modules 
not compiling that should, or JAR artifacts missing from a WAR artifact, etc., 
unless the user manually duplicates all the transitive dependencies missed by 
Maven, in the project that did not compile, or missed a few JAR files from its 
WAR artifact.

Attached is a sample multi-module project as described above, a 
{{settings.xml}} file required for the project to compile and a patch that 
shows how the problem _could_ be eliminated on the maven-3 trunk 
({{http://svn.apache.org/repos/asf/maven/maven-3/trunk}}).

The attached sample will give no warning prior to Maven 3.0 but if 
{{test-impl}} were to actually require {{test-api}}'s dependencies to compile, 
the problem would surface also with Maven 2.2.1 and possibly earlier.

I don't think the attached patch is an elegant solution but it has the quality 
of touching very few files and having little or no side effect other than 
fixing the problem outlined above. In short, please, make a better fix.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to