[ http://jira.codehaus.org/browse/MNG-3086?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_120793 ]
germuska edited comment on MNG-3086 at 1/21/08 11:06 AM: ------------------------------------------------------------- Some more information, although I am still learning my way through M2 code. Egor, thanks for the idea of adding debug to a local build. For general information, the above workaround doesn't work with 2.0.9-SNAPSHOT code; the error doesn't get to that location (although I'm pretty sure it's ultimately the same error.) I was able to sneak in some debug in DefaultArtifact.setBaseVersionInternal to catch a null before it throws an NPE: if ( checkScopeUpdate( farthest, nearest, listeners ) ) { // if we need to update scope of nearest to use farthest scope, use the nearest version, but farthest scope nearest.disable(); if (nearest.getArtifact().getVersion() == null) { throw new NullPointerException("nearest artifact has null version so setVersion will error: nearest: " + nearest + "; farthest: " + farthest); } farthest.getArtifact().setVersion( nearest.getArtifact().getVersion() ); Because now in artifact.setVersion there's a regex Matcher that throws an NPE if the nearest artifact's version is null. This happens when the "nearest" artifact is a ranged-version dependency. In this case, the immediate work-around was to create an explicit dependency on the "farthest version" AT THE TOP of the <dependencies> list, so that it overrides the ranged dependency before a transitive dependency resolution runs into this problem. This should probably be either filed as a separate bug more directly implicating ranged transitive dependencies, or the name of this bug should be changed. If Maven developers need any more info I can try to provide some, but as much time as I've sunk into tracking this down, I'm short on time to file a test case at the moment. was (Author: germuska): Some more information, although I am still learning my way through M2 code. Egor, thanks for the idea of adding debug to a local build. For general information, the above workaround doesn't work with 2.0.9-SNAPSHOT code; the error doesn't get to that location (although I'm pretty sure it's ultimately the same error.) I was able to sneak in some debug in DefaultArtifact.setBaseVersionInternal to catch a null before it throws an NPE: if ( checkScopeUpdate( farthest, nearest, listeners ) ) { // if we need to update scope of nearest to use farthest scope, use the nearest version, but farthest scope nearest.disable(); if (nearest.getArtifact().getVersion() == null) { throw new NullPointerException("nearest artifact has null version so setVersion will error: nearest: " + nearest + "; farthest: " + farthest); } farthest.getArtifact().setVersion( nearest.getArtifact().getVersion() ); Because now in artifact.setVersion there's a regex Matcher that throws an NPE if the nearest artifact's version is null. This happens when the "nearest" artifact is a ranged-version dependency. In this case, the immediate work-around was to create an explicit dependency on the same version as "farthest" AT THE TOP of the <dependencies> list, so that it overrides the ranged dependency before a transitive dependency resolution runs into this problem. This should probably be either filed as a separate bug more directly implicating ranged transitive dependencies, or the name of this bug should be changed. If Maven developers need any more info I can try to provide some, but as much time as I've sunk into tracking this down, I'm short on time to file a test case at the moment. > NullPointerException in ResolutionNode.getTrail(ResolutionNode.java:136) > ------------------------------------------------------------------------ > > Key: MNG-3086 > URL: http://jira.codehaus.org/browse/MNG-3086 > Project: Maven 2 > Issue Type: Bug > Components: Errors > Affects Versions: 2.0.7 > Reporter: Thomas Leonard > Fix For: 2.0.x > > > After upgrading from 2.0.6 to 2.0.7, our build fails with: > [INFO] [resources:resources] > [INFO] Using default encoding to copy filtered resources. > [INFO] > ------------------------------------------------------------------------ > [ERROR] FATAL ERROR > [INFO] > ------------------------------------------------------------------------ > [INFO] null > [INFO] > ------------------------------------------------------------------------ > [INFO] Trace > java.lang.NullPointerException > at > org.apache.maven.artifact.resolver.ResolutionNode.getTrail(ResolutionNode.java:136) > at > org.apache.maven.artifact.resolver.ResolutionNode.filterTrail(ResolutionNode.java:211) > at > org.apache.maven.artifact.resolver.DefaultArtifactCollector.collect(DefaultArtifactCollector.java:89) > at > org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolveTransitively(DefaultArtifactResolver.java:284) > at > org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolveTransitively(DefaultArtifactResolver.java:272) > at > org.apache.maven.plugin.DefaultPluginManager.resolveTransitiveDependencies(DefaultPluginManager.java:1238) > at > org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:397) > at > org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:539) > at > org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:480) > at > org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:459) > at > org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:311) > at > org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:278) > at > org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:143) > at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:334) > at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:125) > at org.apache.maven.cli.MavenCli.main(MavenCli.java:280) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:585) > at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315) > at org.codehaus.classworlds.Launcher.launch(Launcher.java:255) > at > org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430) > at org.codehaus.classworlds.Launcher.main(Launcher.java:375) > Thanks, -- 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