Come posso creare un nuovo tipo di imballaggio per Maven?
-
07-07-2019 - |
Domanda
Ho un requisito per creare file jar con Maven, ma devono essere installati nel repository con un " foobar " estensione, e sarebbe bello se potessero avere il proprio tipo di imballo in modo da poter identificare quei manufatti dall'imballo.
Posso impostare un nuovo tipo di imballaggio per farlo?
Soluzione
Per fare come descritto, crea un progetto Maven con il packaging jar (come indicato qui , poiché non ci saranno definizioni mojo). Nella sottocartella src / main / resources / META-INF / plexus creare un componente.xml con i seguenti contenuti (supponendo che si desideri che il tipo di packaging sia & Quot; my-custom-type & Quot ;, cambiarlo in " foobar " se lo si desidera).
<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>
Quindi in un pom che deve avere l'imballaggio personalizzato, dichiarare il tipo richiesto nell'elemento di imballaggio e assicurarsi di aver specificato il plug-in in modo che l'imballaggio personalizzato possa essere fornito. Dichiarando & Lt; extensions & Gt; true & Lt; / extensions & Gt; dice a Maven che il plug-in contribuisce a creare pacchetti e / o gestori dei tipi 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>
Quando il progetto è impacchettato, sarà un jar, con estensione .jar, tuttavia quando viene installato / distribuito, Maven consegnerà il file al repository con il " .foobar " ; estensione come specificato in components.xml
Altri suggerimenti
Seguendo la risposta originale di Rich Seller:
Se come ti consiglia di utilizzare un tipo di imballaggio jar
, molto probabilmente nel progetto in cui fai riferimento al tuo plug-in riceverai:
[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.
Questo perché non esiste alcun descrittore di plugin nel JAR che hai generato.
È possibile utilizzare quanto segue per bypassare l'errore No mojo definitions..
che menziona:
<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>
Questa configurazione è stata trovata nell'esempio dei documenti del plug-in qui .
Il maven-plugin
ciclo di vita del tipo di imballaggio ha l'obiettivo plugin:descriptor
legato alla fase generate-resources
. Questo è specificato nella la documentazione ufficiale di Sonatype .