Maven
  1. Maven
  2. MNG-2110

ArtifactRepositoryLayout isn't extensible

    Details

    • Complexity:
      Intermediate
    • Number of attachments :
      0

      Description

      I'm writing a plugin that (among other tasks) provides a new ArtifactRepositoryLayout suitable for Eclipse repositories. In my META-INF/plexus/components.xml, I have:

      <component>
      <role>org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout</role>
      <role-hint>eclipse</role-hint>
      <implementation>org.apache.maven.artifact.repository.layout.EclipseArtifactRepositoryLayout</implementation>
      </component>

      This plugin is listed in the POM with <extensions>true</extensions>. I would expect that a <repository/> with <layout>eclipse</eclipse> would discover and load this layout provider. Instead, it simply results in an exception. Note that this same components.xml file also defines some lifecycle mappings, which work perfectly.

      [INFO] Trace
      org.apache.maven.reactor.MavenExecutionException: Cannot find layout implementation corresponding to: 'eclipse' for remote repository with id: 'Eclipse Update Site'.
      at org.apache.maven.DefaultMaven.getProjects(DefaultMaven.java:365)
      ...
      Caused by: org.codehaus.plexus.component.repository.exception.ComponentLookupException: Component descriptor cannot be found in the component repository: org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayouteclipse.
      at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:323)

        Issue Links

          Activity

          Hide
          Matthew Beermann added a comment -

          Hm, it won't let me change the name of the issue, but a better summary line might be: "Only certain components are extensible from a plugin". Lifecycles and packaging yes, but repository layouts no? It seems arbitrary.

          I can make it work if I put the code directly into MAVEN_HOME\lib, but there's no (obvious) reason it shouldn't work from a <plugin/> with <extensions>true</extensions>.

          Show
          Matthew Beermann added a comment - Hm, it won't let me change the name of the issue, but a better summary line might be: "Only certain components are extensible from a plugin". Lifecycles and packaging yes, but repository layouts no? It seems arbitrary. I can make it work if I put the code directly into MAVEN_HOME\lib, but there's no (obvious) reason it shouldn't work from a <plugin/> with <extensions>true</extensions>.
          Hide
          Brett Porter added a comment -

          it depends on the way the components are instantiated. Those that are looked up from the container explicitly on the fly work, those that are instantiated once when first used don't. The first is a lot uglier to code and is only used for special cases.

          A future version of plexus will support dynamic component maps that will facilitate making all of these work on the fly, without having to do the ugly lookup mechanism.

          Show
          Brett Porter added a comment - it depends on the way the components are instantiated. Those that are looked up from the container explicitly on the fly work, those that are instantiated once when first used don't. The first is a lot uglier to code and is only used for special cases. A future version of plexus will support dynamic component maps that will facilitate making all of these work on the fly, without having to do the ugly lookup mechanism.
          Hide
          Matthew Beermann added a comment -

          Can you dupe this (or at least provide a link) so I can keep an eye on it?

          Show
          Matthew Beermann added a comment - Can you dupe this (or at least provide a link) so I can keep an eye on it?
          Hide
          Jason van Zyl added a comment -

          The system is now full extensible. We use this support in M2Eclipse to override core components using plugins.

          Show
          Jason van Zyl added a comment - The system is now full extensible. We use this support in M2Eclipse to override core components using plugins.

            People

            • Assignee:
              Unassigned
              Reporter:
              Matthew Beermann
            • Votes:
              1 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: