Maven打包類型

1.概述

打包類型是任何Maven項目的重要方面。它指定了項目產生的工件的類型。通常,構建會生成jarwarpom或其他可執行文件。

Maven提供了許多默認包裝類型,並且還提供了定義自定義包裝類型的靈活性。

在本教程中,我們將深入探討Maven的包裝類型。首先,我們來看一下Maven中的構建生命週期。然後,我們將討論每種包裝類型,它們代表什麼以及它們對項目生命週期的影響。最後,我們將看到如何定義自定義包裝類型。

2.默認包裝類型

Maven提供了許多默認包裝類型,包括jarwarearpomrarejbmaven-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

毫無疑問, jarwar是Java社區中最流行的包裝類型。兩者之間的詳細區別可能是一個有趣的閱讀。

讓我們定義Web應用程序的打包類型:

<packaging>war</packaging>

其他包裝類型ejbparrar也具有相似的生命週期,但是每種包裝都有不同的包裝目標。

ejb: ejb or par: par or rar: rar

2.3。 ear

企業應用程序歸檔文件(即ear )是包含J2EE應用程序的壓縮文件。它由一個或多個模塊組成,這些模塊可以是Web模塊(打包為war文件)或EJB模塊(打包為jar文件),也可以是這兩個模塊。

ear jarswars的超集,需要應用程序服務器來運行該應用程序,而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共享某些配置,插件和依賴項以及它們的版本。來自父級的大多數元素均由其子級繼承-例外包括artifactIdnameprerequisites

因為沒有要處理的資源,也沒有要編譯或測試的代碼。因此,pom項目的工件會自行生成,而不是生成任何可執行文件。

讓我們定義一個多模塊項目的打包類型:

<packaging>pom</packaging>

這樣的項目具有最簡單的生命週期,該生命週期僅包括兩個步驟: installdeploy

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

同樣,生命週期階段是相同的一個jarwar的包裝有一個例外:**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>

現在,該項目將可用於掃描,並且系統還將搜索pluginscompnenets.xml文件。

除了所有這些類型之外,Maven還通過外部項目和插件提供了許多其他包裝類型。例如, nar (本機存檔), swfswc是產生Adobe Flash和Flex內容的項目的打包類型。對於此類項目,我們需要一個定義自定義包裝的插件和一個包含該插件的存儲庫。

4。結論

在本文中,我們研究了Maven中可用的各種包裝類型。另外,我們熟悉了這些類型代表什麼以及它們在生命週期中的不同之處。最後,我們還學習瞭如何定義自定義包裝類型和自定義默認構建生命週期。