[
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)