[ 
https://issues.apache.org/jira/browse/MNG-4731?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16818416#comment-16818416
 ] 

Dale King commented on MNG-4731:
--------------------------------

Re-reported as: https://issues.apache.org/jira/browse/MNG-6641

> NPE from AttachedArtifact.getVersion rather than meaningful error
> -----------------------------------------------------------------
>
>                 Key: MNG-4731
>                 URL: https://issues.apache.org/jira/browse/MNG-4731
>             Project: Maven
>          Issue Type: Bug
>          Components: Errors
>    Affects Versions: 2.2.1
>         Environment: Ubuntu Lucid, JDK 6u21
>            Reporter: Jesse Glick
>            Priority: Major
>         Attachments: validateIdentity.diff
>
>
> I am working on a problem with {{nbm:populate-repository}} (from 
> {{org.codehaus.mojo:nbm-maven-plugin}}). Maven 2.2.1, when run under certain 
> circumstances, fails when running this goal with the following unhelpful 
> message:
> {noformat}
> ...
> [ERROR] FATAL ERROR
> [INFO] 
> ------------------------------------------------------------------------
> [INFO] null
> [INFO] 
> ------------------------------------------------------------------------
> [INFO] Trace
> java.lang.NullPointerException
>       at 
> org.apache.maven.project.artifact.AttachedArtifact.getVersion(AttachedArtifact.java:122)
>       at 
> org.apache.maven.artifact.DefaultArtifact.validateIdentity(DefaultArtifact.java:141)
>       at 
> org.apache.maven.artifact.DefaultArtifact.<init>(DefaultArtifact.java:122)
>       at 
> org.apache.maven.project.artifact.AttachedArtifact.<init>(AttachedArtifact.java:42)
>       at 
> org.codehaus.mojo.nbm.PopulateRepositoryMojo.createAttachedArtifact(PopulateRepositoryMojo.java:617)
>       at 
> org.codehaus.mojo.nbm.PopulateRepositoryMojo.execute(PopulateRepositoryMojo.java:424)
> ...
> {noformat}
> Inspection of the code reveals the immediate cause of the NPE: in 
> {{getVersion}}, the {{parent}} field is null. Even though this is a final 
> field set in the constructor to a non-null value, it has not yet been set 
> when the super constructor is called. This is because {{DefaultArtifact}} 
> uses the antipattern of calling an overridable method ({{getVersion}}) from 
> its constructor (indirectly via {{validateIdentity}}). The NPE then prevents 
> the details of the problem from being reported to the user.
> Ideally this antipattern would be solved, by making {{validateIdentity}} 
> public and requiring all creators of a {{DefaultArtifact}} to call it after 
> construction. Since this cannot now be done compatibly (e.g. 
> {{PopulateRepositoryMojo}} above would need to be modified), the next best 
> thing is to assume that {{AttachedArtifact}} is the only subclass, and ensure 
> that {{validateIdentity}} is called only once the object has been fully 
> constructed. With that change (patch against {{2.2.2-SNAPSHOT}} attached), 
> the error message is informative (specifics of this run have been elided) and 
> points toward possible problems in the plugin:
> {noformat}
> ...
> [ERROR] FATAL ERROR
> [INFO] 
> ------------------------------------------------------------------------
> [INFO] An invalid artifact was detected.
> This artifact might be in your project's POM, or it might have been included 
> transitively
> during the resolution process. Here is the information we do have for this 
> artifact:
>     o GroupID:     ...
>     o ArtifactID:  ...
>     o Version:     ...
>     o Type:        <<< MISSING >>>
> [INFO] 
> ------------------------------------------------------------------------
> [INFO] Trace
> org.apache.maven.artifact.InvalidArtifactRTException: For artifact 
> {...:...:...:null}: The type cannot be empty.
>       at 
> org.apache.maven.artifact.DefaultArtifact.validateIdentity(DefaultArtifact.java:141)
>       at 
> org.apache.maven.project.artifact.AttachedArtifact.validateIdentity(AttachedArtifact.java:63)
>       at 
> org.apache.maven.project.artifact.AttachedArtifact.<init>(AttachedArtifact.java:53)
>       at 
> org.codehaus.mojo.nbm.PopulateRepositoryMojo.createAttachedArtifact(PopulateRepositoryMojo.java:617)
>       at 
> org.codehaus.mojo.nbm.PopulateRepositoryMojo.execute(PopulateRepositoryMojo.java:424)
> ...
> {noformat}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to