Java 如何为 Maven 创建新的打包类型?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1427722/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I create a new packaging type for Maven?
提问by talk to frank
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.
我需要使用 Maven 创建 jar 文件,但是它们需要安装到带有“foobar”扩展名的存储库中,如果它们可以有自己的打包类型,这样我们就可以通过打包来识别这些工件,那就太好了。
Can I set up a new packaging type to do this?
我可以设置新的包装类型来执行此操作吗?
采纳答案by Rich Seller
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).
要做到像你描述,创建包装Maven项目罐子(如说在这里,因为不会有魔力的定义)。在 src/main/resources/META-INF/plexus 子文件夹中创建一个包含以下内容的 components.xml(假设您希望打包类型为“my-custom-type”,如果您希望将其更改为“foobar”希望)。
<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.
然后在具有自定义包装的 pom 中,在包装元素中声明所需的类型,并确保您已指定插件,以便可以贡献自定义包装。声明 <extensions>true</extensions> 告诉 Maven 插件向 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
当项目打包时,它将是一个带有 .jar 扩展名的 jar,但是当它被安装/部署时,Maven 会将文件交付到带有在 components.xml 中指定的“.foobar”扩展名的存储库
回答by KomodoDave
Following up on Rich Seller's original answer:
跟进 Rich Seller 的原始回答:
If as he recommends you use a packaging type jar
then most likely in the project where you reference your plugin you'll receive:
如果他建议您使用打包类型,jar
那么很可能在您引用插件的项目中,您将收到:
[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.
This is because no plugin descriptor exists in the JAR you generated.
这是因为您生成的 JAR 中不存在插件描述符。
You can use the following to bypass the No mojo definitions..
error he mentions:
您可以使用以下方法绕过No mojo definitions..
他提到的错误:
<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>
This configuration was found in plugin docs example here.
此配置可在插件文档示例here 中找到。
The maven-plugin
packaging type lifecycle has the plugin:descriptor
goal bound to generate-resources
phase. This is specified in Sonatype's official documentation.
该maven-plugin
包装类型的生命周期有plugin:descriptor
必然的目标generate-resources
阶段。这在Sonatype 的官方文档中有详细说明。