I have a requirement to create jar files with Maven, but they need to be installed to the repository with a "foobar" extension , and it would be nice if they could have their own packaging type so we can identify those artifacts by the packaging.
Can I set up a new packaging type to do this?
Maven offers many default packaging types that include a jar, war, ear, pom, rar, ejb, and maven-plugin. Each packaging type follows a build lifecycle that consists of phases.
“pom” packaging is nothing but the container, which contains other packages/modules like jar, war, and ear. if you perform any operation on outer package/container like mvn clean compile install. then inner packages/modules also get clean compile install. no need to perform a separate operation for each package/module.
To do as you described, create a Maven project with packaging jar (as stated here, as there won't be mojo definitions). In the src/main/resources/META-INF/plexus sub-folder create a components.xml with the following contents (assuming you want the packaging type to be "my-custom-type", change it to "foobar" if you wish).
<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>
Then in a pom that is to have the custom packaging, declare the required type in the packaging element, and ensure you have specified the plugin so the custom packaging can be contributed. Declaring <extensions>true</extensions> tells Maven that the plugin contributes packaging and/or type handlers to 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>
When the project is packaged, it will be a jar, with a .jar extension, however when it is installed/deployed, Maven will deliver the file to the repository with the ".foobar" extension as specified in components.xml
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With