1.概述
打包类型是任何Maven项目的重要方面。它指定了项目产生的工件的类型。通常,构建会生成jar
, war
, pom
或其他可执行文件。
Maven提供了许多默认包装类型,并且还提供了定义自定义包装类型的灵活性。
在本教程中,我们将深入探讨Maven的包装类型。首先,我们来看一下Maven中的构建生命周期。然后,我们将讨论每种包装类型,它们代表什么以及它们对项目生命周期的影响。最后,我们将看到如何定义自定义包装类型。
2.默认包装类型
Maven提供了许多默认包装类型,包括jar
, war
, ear
, pom
, rar
, ejb
和maven-plugin
。每种包装类型都遵循由阶段组成的构建生命周期。通常,每个阶段都是一系列目标,并执行特定任务。
在特定阶段,不同的包装类型可能有不同的目标。例如,在jar
包装类型的包装阶段,将执行maven-jar-plugin
的jar目标。相反,对于war
项目, maven-war-plugin
的战争目标是在同一阶段执行的。
2.1。 jar
Java归档文件(或jar
)是最受欢迎的打包类型之一。具有这种打包类型的项目会生成一个扩展名为.jar
它可能包括纯Java类,接口,资源和元数据文件。
jar
一些默认的目标到构建阶段绑定:
- 资源:
resources
- 编译器:
compile
- 资源:
testResources
- 编译器:
testCompile
- surefire:
test
- 罐子:
jar
- 安装:
install
- 部署:
deploy
毫不拖延地,让我们定义一个jar
项目的包装类型:
<packaging>jar</packaging>
如果未指定任何内容,则Maven假定包装类型为jar.
2.2。 war
简而言之,Web应用程序归档文件(或war
文件)包含与Web应用程序相关的所有文件。它可能包括Java Servlet,JSP,HTML页面,部署描述符和相关资源。总体而言, war
jar
相同的目标绑定,但有一个例外- war
的打包阶段具有不同的目标,即war
。
毫无疑问, jar
和war
是Java社区中最流行的包装类型。两者之间的详细区别可能是一个有趣的阅读。
让我们定义Web应用程序的打包类型:
<packaging>war</packaging>
其他包装类型ejb
, par
和rar
也具有相似的生命周期,但是每种包装都有不同的包装目标。
ejb: ejb or par: par or rar: rar
2.3。 ear
企业应用程序归档文件(即ear
)是包含J2EE应用程序的压缩文件。它由一个或多个模块组成,这些模块可以是Web模块(打包为war
文件)或EJB模块(打包为jar
文件),也可以是这两个模块。
ear
jars
和wars
的超集,需要应用程序服务器来运行该应用程序,而war
只需要一个Web容器或webserver即可对其进行部署。对于Java开发人员而言,将Web服务器与应用程序服务器区分开的方面以及那些流行的服务器在Java中是什么是重要的概念。
ear
的默认目标绑定:
- 耳朵:
generate-application-xml
- 资源:
resources
- 耳朵:
ear
- 安装:
install
- 部署:
deploy
这是我们如何定义此类项目的包装类型的方法:
<packaging>ear</packaging>
2.4。 pom
在所有包装类型中, pom
是最简单的一种。它有助于创建聚合器和父项目。
聚合器或多模块项目将组装来自不同来源的子模块。这些子模块是常规的Maven项目,并遵循其自己的构建生命周期。 modules
元素下具有子模块的所有引用。
父项目允许您定义POM之间的继承关系。父POM共享某些配置,插件和依赖项以及它们的版本。来自父级的大多数元素均由其子级继承-例外包括artifactId
, name
和prerequisites
。
因为没有要处理的资源,也没有要编译或测试的代码。因此,pom项目的工件会自行生成,而不是生成任何可执行文件。
让我们定义一个多模块项目的打包类型:
<packaging>pom</packaging>
这样的项目具有最简单的生命周期,该生命周期仅包括两个步骤: install
和deploy
。
2.5。 maven-plugin
Maven提供了各种有用的插件。但是,可能会出现默认插件不够用的情况。在这种情况下,该工具可根据项目需求灵活地创建Maven插件。
要创建插件,请设置项目的打包类型:
<packaging>maven-plugin</packaging>
maven-plugin
的生命周期类似于jar
的生命周期,但有两个例外:
- 插件:
descriptor
绑定到generate-resources阶段 - 插件:
addPluginArtifactMetadata
已添加到打包阶段
对于此类项目,需要maven-plugin-api
依赖项。
2.6。 ejb
企业Java Bean(或ejb
)有助于创建可扩展的分布式服务器端应用程序。 EJB通常提供应用程序的业务逻辑。典型的EJB体系结构由三个组件组成:企业Java Bean(EJB),EJB容器和应用程序服务器。
现在,让我们定义EJB项目的打包类型:
<packaging>ejb</packaging>
ejb
包装类型也具有与jar
包装类似的生命周期,但包装目标不同。此类项目的打包目标是ejb: ejb
。
ejb
打包类型的项目maven-ejb-plugin
来执行生命周期目标。 Maven提供对EJB 2和3的支持。如果未指定版本,则使用默认版本2。
2.7。 rar
资源适配器(或rar
)是一个存档文件,用作将资源适配器部署到应用程序服务器的有效格式。基本上,它是将Java应用程序连接到企业信息系统(EIS)的系统级驱动程序。
这是资源适配器的包装类型的声明:
<packaging>rar</packaging>
每个资源适配器档案均由两部分组成:一个包含源代码jar
文件和一个用作部署描述符ra.xml
同样,生命周期阶段是相同的一个jar
或war
的包装有一个例外:在**package**
阶段执行rar
,它由一个目标**maven-rar-plugin**
打包存档**。**
3.其他包装类型
到目前为止,我们已经研究了Maven默认提供的各种包装类型。现在,让我们想象一下,我们希望我们的项目产生一个扩展名为.zip
在这种情况下,默认包装类型无济于事。
Maven还通过插件提供了更多包装类型。借助这些插件,我们可以定义自定义包装类型及其构建生命周期。其中一些类型是:
-
msi
-
rpm
-
tar
-
tar.bz2
-
tar.gz
-
tbz
-
zip
要定义自定义类型,我们必须定义其packaging
type
和生命周期中的phases
.
为此,请在src/main/resources/META-INF/plexus
目录components.xml
<component>
<role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
<role-hint>zip</role-hint>
<implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
<configuration>
<phases>
<process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
<package>com.baeldung.maven.plugins:maven-zip-plugin:zip</package>
<install>org.apache.maven.plugins:maven-install-plugin:install</install>
<deploy>org.apache.maven.plugins:maven-deploy-plugin:deploy</deploy>
</phases>
</configuration>
</component>
到目前为止,Maven对我们的新包装类型及其生命周期一无所知。为了使其可见,让我们在项目pom
extensions
设置为true
:
<plugins>
<plugin>
<groupId>com.baeldung.maven.plugins</groupId>
<artifactId>maven-zip-plugin</artifactId>
<extensions>true</extensions>
</plugin>
</plugins>
现在,该项目将可用于扫描,并且系统还将搜索plugins
和compnenets.xml
文件。
除了所有这些类型之外,Maven还通过外部项目和插件提供了许多其他包装类型。例如, nar
(本机存档), swf
和swc
是产生Adobe Flash和Flex内容的项目的打包类型。对于此类项目,我们需要一个定义自定义包装的插件和一个包含该插件的存储库。
4。结论
在本文中,我们研究了Maven中可用的各种包装类型。另外,我们熟悉了这些类型代表什么以及它们在生命周期中的不同之处。最后,我们还学习了如何定义自定义包装类型和自定义默认构建生命周期。
0 评论