Maven打包類型
- Maven
- java
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中可用的各種包裝類型。另外,我們熟悉了這些類型代表什麼以及它們在生命週期中的不同之處。最後,我們還學習瞭如何定義自定義包裝類型和自定義默認構建生命週期。