2009-09-15 20 views
26

Tengo un requerimiento para crear archivos jar con Maven, pero necesitan ser instalados en el repositorio con una extensión "foobar", y sería bueno si tuvieran su propio tipo de empaquetado para que podamos identificar esos artefactos por el embalaje.¿Cómo creo un nuevo tipo de empaque para Maven?

¿Puedo configurar un nuevo tipo de embalaje para hacer esto?

Respuesta

39

para hacer lo que usted ha descrito, cree un proyecto Maven con el empaquetado frasco (como se indica here, ya que no habrá definiciones mojo). En la subcarpeta src/main/resources/META-INF/plexus, cree un components.xml con los siguientes contenidos (suponiendo que desea que el tipo de paquete sea "my-custom-type", cámbielo a "foobar" si deseo).

<component-set> 
    <components> 
    <component> 
     <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role> 
     <role-hint>my-custom-type</role-hint> 
     <implementation> 
     org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping 
     </implementation> 
     <configuration> 
    <phases> 
     <!--use the basic jar lifecycle bindings, add additional 
      executions in here if you want anything extra to be run-->   
     <process-resources> 
     org.apache.maven.plugins:maven-resources-plugin:resources 
     </process-resources> 
     <package> 
     org.apache.maven.plugins:maven-jar-plugin:jar 
     </package> 
     <install> 
     org.apache.maven.plugins:maven-install-plugin:install 
     </install> 
     <deploy> 
     org.apache.maven.plugins:maven-deploy-plugin:deploy 
     </deploy> 
    </phases> 
     </configuration> 
    </component> 
    <component> 
     <role>org.apache.maven.artifact.handler.ArtifactHandler</role> 
     <role-hint>my-custom-type</role-hint> 
     <implementation> 
     org.apache.maven.artifact.handler.DefaultArtifactHandler 
     </implementation> 
     <configuration> 
     <!--the extension used by Maven in the repository--> 
     <extension>foobar</extension> 
     <!--the type used when specifying dependencies etc.--> 
     <type>my-custom-type</type> 
     <!--the packaging used when declaring an implementation of 
      the packaging--> 
     <packaging>my-custom-type</packaging> 
     </configuration> 
    </component> 
    </components> 
</component-set> 

Luego, en un pom que es tener el empaque a la medida, declarar el tipo requerido en el elemento de embalaje, y asegúrese de que ha especificado el plugin por lo que el envase personalizado se puede contribuir. Al declarar <extensiones> true </extensiones >, le informa a Maven que el complemento proporciona controladores de tipo de embalaje y/o tipo a Maven.

<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
          http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>name.seller.rich</groupId> 
    <artifactId>test</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>my-custom-type</packaging> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>name.seller.rich.maven.plugins</groupId> 
     <artifactId>maven-foobar-plugin</artifactId> 
     <version>0.0.1</version> 
     <!--declare that this plugin contributes the component extensions--> 
     <extensions>true</extensions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Cuando se empaqueta el proyecto, será un frasco, con una extensión .jar, sin embargo cuando se instala/desplegado, Maven entregará el archivo al repositorio con la extensión ".foobar" como se especifica en components.xml

+1

¿hay alguna manera de tener el archivo creado en el proyecto con la extensión foobar? –

+1

y te refieres a MET-INF o META-INF? –

+0

Creo que para hacer eso tendrías que reemplazar el archivador jar con una implementación personalizada o, alternativamente, utilizar un lifecycle.xml para vincular una invocación de plugin de ensamblaje a una fase (según tu otra pregunta: http: // stackoverflow. com/questions/1427740/how-do-i-execute-a-set-of-goals-before-my-maven-plugin-runs/1427783 # 1427783) –

3

el seguimiento de respuesta original de Rich vendedor:

Si mientras se le recomienda que utilice un tipo de embalaje jar lo más probable en el proyecto, donde se hace referencia a su plugin recibirá:

[INFO] ------------------------------------------------------------------------ 
[ERROR] FATAL ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] The plugin descriptor for the plugin Plugin [com.ocado.mvn.packaging:Jar-Gem] was not found. Please verify that the plugin JAR /home/ndb/.m2/repository/com/ocado/mvn/packaging/Jar-Gem/1.0.0/Jar-Gem-1.0.0.jar is intact. 

Esto se debe a que no existe un descriptor de complemento en el JAR que ha generado.

Puede utilizar el siguiente para evitar el error No mojo definitions.. menciona:

<packaging>maven-plugin</packaging> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-plugin-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Esta configuración se encuentra en el plugin de documentos here ejemplo.

El ciclo de vida del tipo de embalaje maven-plugin tiene el objetivo plugin:descriptor obligado a la fase generate-resources. Esto se especifica en Sonatype's official documentation.

+1

El uso del paquete' jar' en este caso es correcto. Debido a que no tiene mojos, lo que estás creando es una extensión, no un plugin. Por lo tanto, debe cargarlo a través de [''] (http://maven.apache.org/pom.ht ml # Extensiones) sección del POM en lugar de la sección [''] (http://maven.apache.org/pom.html#Plugins). Al hacerlo, se evitará el error "descriptor de plugin no encontrado". –

+0

@SamHanes Gracias por esta corrección. Eliminé el mensaje relevante "..debería usar JAR .." de mi publicación. – KomodoDave

Cuestiones relacionadas