成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Maven 管理項目文件周期5個技巧

開發 項目管理
文章不單介紹 Maven 的 構建特性,也介紹了管理項目生命周期的基本工具,交付了 5 個可以提高生產效率的技巧,使您在 Maven 中管理您的應用程序更為容易。

  Maven 是為 Java™ 開發人員提供的一個極為優秀的構建工具,您也可以使用它來管理您的項目生命周期。作為一個生命周期管理工具,Maven 是基于階段操作的,而不像 Ant 是基于 “任務” 構建的。Maven 完成項目生命周期的所有階段,包括驗證、代碼生成、編譯、測試、打包、集成測試、安裝、部署、以及項目網站創建和部署。

  為了更好地理解 Maven 和傳統構建工具的不同,我們來看看構建一個 JAR 文件和一個 EAR 文件的過程。使用 Ant,您可能需要定義專有任務來組裝每個工件。另一方面,Maven 可以為您完成大部分工作:您只需要告訴它是一個 JAR 文件還是一個 EAR 文件,然后指示它來完成 “打包” 過程。Maven 將會找到所需的資源,然后構建文件。

  本文的 5 個技巧目的是幫助您解決即將出現的一些問題:使用 Maven 管理您的應用程序的生命周期時,將會出現的編程場景。

  1. 技巧可執行的 JAR 文件

  使用 Maven 構建一個 JAR 文件比較容易:只要定義項目包裝為 “jar”,然后執行包裝生命周期階段即可。但是定義一個可執行 JAR 文件卻比較麻煩。采取以下步驟可以更高效:

  在您定義可執行類的 JAR 的 MANIFEST.MF 文件中定義一個 main 類。(MANIFEST.MF 是包裝您的應用程序時 Maven 生成的。)

  找到您項目依賴的所有庫。

  在您的 MANIFEST.MF 文件中包含那些庫,便于您的應用程序找到它們。

  您可以手工進行這些操作,或者要想更高效,您可以使用兩個 Maven 插件幫助您完成:maven-jar-plugin 和 maven-dependency-plugin。

maven-jar-plugin

  maven-jar-plugin 可以做很多事情,但在這里,我們只對使用它來修改默認 MANIFEST.MF 文件的內容感興趣。在您的 POM 文件的插件部分添加清單 1 所示代碼:

  清單 1. 使用 maven-jar-plugin 修改 MANIFEST.MF

  1. <plugin> 
  2.     <groupId>org.apache.maven.pluginsgroupId> 
  3.     <artifactId>maven-jar-pluginartifactId> 
  4.     <configuration> 
  5.         <archive> 
  6.             <manifest> 
  7.                 <addClasspath>trueaddClasspath> 
  8.                 <classpathPrefix>lib/classpathPrefix> 
  9.                 <mainClass>com.mypackage.MyClassmainClass> 
  10.             manifest> 
  11.         archive> 
  12.     configuration> 
  13. plugin> 

  所有 Maven 插件通過一個 元素公布了其配置,在本例中,maven-jar-plugin 修改它的 archive 屬性,特別是存檔文件的 manifest 屬性,它控制 MANIFEST.MF 文件的內容。包括 3 個元素:

  • addClassPath:將該元素設置為 true 告知 maven-jar-plugin 添加一個 Class-Path 元素到 MANIFEST.MF 文件,以及在 Class-Path 元素中包括所有依賴項。
  • classpathPrefix:如果您計劃在同一目錄下包含有您的所有依賴項,作為您將構建的 JAR,那么您可以忽略它;否則使用 classpathPrefix 來指定所有依賴 JAR 文件的前綴。在清單 1 中,classpathPrefix 指出,相對存檔文件,所有的依賴項應該位于 “lib” 文件夾。
  • mainClass:當用戶使用 lib 命令執行 JAR 文件時,使用該元素定義將要執行的類名。

  maven-dependency-plugin

  當您使用這 3 個元素配置好了 MANIFEST.MF 文件之后,下一步是將所有的依賴項復制到 lib 文件夾。為此,使用 maven-dependency-plugin,如清單 2 所示:

  清單 2. 使用 maven-dependency-plugin 將依賴項復制到庫

  1. <plugin> 
  2.     <groupId>org.apache.maven.pluginsgroupId> 
  3.     <artifactId>maven-dependency-pluginartifactId> 
  4.     <executions> 
  5.         <execution> 
  6.             <id>copyid> 
  7.             <phase>installphase> 
  8.             <goals> 
  9.                 <goal>copy-dependenciesgoal> 
  10.             goals> 
  11.             <configuration> 
  12.                 <outputDirectory> 
  13.                   ${project.build.directory}/lib  
  14.                 outputDirectory> 
  15.             configuration> 
  16.         execution> 
  17.     executions> 
  18. plugin> 

  maven-dependency-plugin 有一個 copy-dependencies,目標是將您的依賴項復制到您所選擇的目錄。本例中,我將依賴項復制到 build 目錄下的 lib 目錄(project-home/target/lib)。

  將您的依賴項和修改的 MANIFEST.MF 放在適當的位置后,您就可以用一個簡單的命令啟動應用程序:

  1. java -jar jarfilename.jar  

#p#

技巧2. 定制 MANIFEST.MF

  雖然 maven-jar-plugin 允許您修改 MANIFEST.MF 文件的共有部分,但有時候您需要一個更個性化的 MANIFEST.MF。解決方案是雙重的:

  在一個 “模板” MANIFEST.MF 文件中定義您的所有定制配置。

  配置 maven-jar-plugin 來使用您的 MANIFEST.MF 文件,然后使用一些 Maven 配置增強。

  例如,考慮一個包含 Java 代理的 JAR 文件。要運行一個 Java 代理,需要定義 Premain-Class 和設置許可。清單 3 展示了這樣一個 MANIFEST.MF 文件的內容:

  清單 3. 在一個定制的 MANIFEST.MF 文件中定義 Premain-Class

  1. Manifest-Version: 1.0  
  2. Premain-Class: com.geekcap.openapm.jvm.agent.Agent  
  3. Can-Redefine-Classes: true  
  4. Can-Retransform-Classes: true  
  5. Can-Set-Native-Method-Prefix: true   

  在 清單 3 中,我已指定 Premain-Class - com.geekcap.openapm.jvm.agent.Agent 被授權許可來對類進行重定義和再轉換。接下來,我更新 maven-jar-plugin 代碼來包含 MANIFEST.MF 文件。如清單 4 所示:

清單 4. 包含 Premain-Class

  1. <plugin> 
  2.     <groupId>org.apache.maven.pluginsgroupId> 
  3.     <artifactId>maven-jar-pluginartifactId> 
  4.     <configuration> 
  5.         <archive> 
  6.             <manifestFile> 
  7.               src/main/resources/META-INF/MANIFEST.MF  
  8.             manifestFile> 
  9.             <manifest> 
  10.                 <addClasspath>trueaddClasspath> 
  11.                 <classpathPrefix>lib/classpathPrefix> 
  12.                 <mainClass> 
  13.                   com.geekcap.openapm.ui.PerformanceAnalyzer  
  14.                 mainClass> 
  15.             manifest> 
  16.         archive> 
  17.     configuration> 
  18. plugin> 

  Maven 3Maven 2 已確立了它作為一種最流行和最易使用的開源 Java 生命周期管理工具的地位。Maven 3,2010 年 9 月升級為 alpha 5,帶來一些期待已久的改進。在 參考資料 部分尋找 Maven 的新功能。

  這是一個很有趣的示例,因為它既定義了一個 Premain-Class — 允許 JAR 文件作為一個 Java 代理運行,也有一個 mainClass — 允許它作為一個可執行的 JAR 文件運行。在這個特殊的例子中,我使用 OpenAPM(我已構建的一個代碼跟蹤工具)來定義將被 Java 代理和一個用戶界面記錄的代碼跟蹤。簡而言之,這個示例展示一個顯式清單文件與動態修改相結合的力量。

#p#

  技巧3. 依賴項樹

  Maven 一個最有用的功能是它支持依賴項管理:您只需要定義您應用程序依賴的庫,Maven 找到它們、下載它們、然后使用它們編譯您的代碼。

  必要時,您需要知道具體依賴項的來源 — 這樣您就可以找到同一個 JAR 文件的不同版本的區別和矛盾。這種情況下,您將需要防止將一個版本的 JAR 文件包含在您的構建中,但是首先您需要定位保存 JAR 的依賴項。

  一旦您知道下列命令,那么定位依賴項往往是相當容易的:

  1. mvn dependency:tree 

  dependency:tree 參數顯示您的所有直接依賴項,然后顯示所有子依賴項(以及它們的子依賴項,等等)。例如,清單 5 節選自我的一個依賴項所需要的客戶端庫:

  清單 5. Maven 依賴項樹

  1. [INFO] ------------------------------------------------------------------------  
  2. [INFO] Building Client library for communicating with the LDE  
  3. [INFO]    task-segment: [dependency:tree]  
  4. [INFO] ------------------------------------------------------------------------  
  5. [INFO] [dependency:tree {execution: default-cli}]  
  6. [INFO] com.lmt.pos:sis-client:jar:2.1.14  
  7. [INFO] +- org.codehaus.woodstox:woodstox-core-lgpl:jar:4.0.7:compile  
  8. [INFO] |  \- org.codehaus.woodstox:stax2-api:jar:3.0.1:compile  
  9. [INFO] +- org.easymock:easymockclassextension:jar:2.5.2:test  
  10. [INFO] |  +- cglib:cglib-nodep:jar:2.2:test  
  11. [INFO] |  \- org.objenesis:objenesis:jar:1.2:test  

  在 清單 5 中您可以看到 sis-client 項目需要 woodstox-core-lgpl 和 easymockclassextension 庫。easymockclassextension 庫反過來需要 cglib-nodep 庫和 objenesis 庫。如果我的 objenesis 出了問題,比如出現兩個版本,1.2 和 1.3,那么這個依賴項樹可能會向我顯示,1.2 工件是直接由 easymockclassextension 庫導入的。

  dependency:tree 參數為我節省了很多調試時間,我希望對您也同樣有幫助。

#p#

  技巧4. 使用配置文件

  多數重大項目至少有一個核心環境,由開發相關的任務、質量保證(QA)、集成和生產組成。管理所有這些環境的挑戰是配置您的構建,這必須連接到正確的數據庫中,執行正確的腳本集、并為每個環境部署正確的工件。使用 Maven 配置文件讓您完成這些任務,而無需為每個環境分別建立明確指令。

  關鍵在于環境配置文件和面向任務的配置文件的合并。每個環境配置文件定義其特定的位置、腳本和服務器。因此,在我的 pox.xml 文件中,我將定義面向任務的配置文件 “deploywar”,如清單 6 所示:

  清單 6. 部署配置文件

  1. <profiles> 
  2.         <profile> 
  3.             <id>deploywarid> 
  4.             <build> 
  5.                 <plugins> 
  6.                     <plugin> 
  7.                         <groupId>net.fpicgroupId> 
  8.                         <artifactId>tomcat-deployer-pluginartifactId> 
  9.                         <version>1.0-SNAPSHOTversion> 
  10.                         <executions> 
  11.                             <execution> 
  12.                                 <id>posid> 
  13.                                 <phase>installphase> 
  14.                                 <goals> 
  15.                                     <goal>deploygoal> 
  16.                                 goals> 
  17.                                 <configuration> 
  18.                                     <host>${deploymentManagerRestHost}host> 
  19.                                     <port>${deploymentManagerRestPort}port> 
  20.                                     <username>${deploymentManagerRestUsername}username> 
  21.                                     <password>${deploymentManagerRestPassword}password> 
  22.                                     <artifactSource> 
  23.                                       address/target/addressservice.war  
  24.                                     artifactSource> 
  25.                                 configuration> 
  26.                             execution> 
  27.                         executions> 
  28.                     plugin> 
  29.                 plugins> 
  30.             build> 
  31.         profile> 
  32.     profiles> 

  這個配置文件(通過 ID “deploywar” 區別)執行 tomcat-deployer-plugin,被配置來連接一個特定主機和端口,以及指定用戶名和密碼證書。所有這些信息使用變量來定義,比如 ${deploymentmanagerRestHost}。這些變量在我的 profiles.xml 文件中定義,如清單 7 所示:

  清單 7. profiles.xml

  1.  
  2.       <profile> 
  3.           <id>devid> 
  4.           <activation> 
  5.               <property> 
  6.                   <name>envname> 
  7.                   <value>devvalue> 
  8.               property> 
  9.           activation> 
  10.           <properties> 
  11.               <deploymentManagerRestHost>10.50.50.52deploymentManagerRestHost> 
  12.               <deploymentManagerRestPort>58090deploymentManagerRestPort> 
  13.               <deploymentManagerRestUsername>myusernamedeploymentManagerRestUsername> 
  14.               <deploymentManagerRestPassword>mypassworddeploymentManagerRestPassword> 
  15.           properties> 
  16.       profile> 
  17.  
  18.        
  19.       <profile> 
  20.           <id>qaid> 
  21.           <activation> 
  22.               <property> 
  23.                   <name>envname> 
  24.                   <value>qavalue> 
  25.               property> 
  26.           activation> 
  27.           <properties> 
  28.               <deploymentManagerRestHost>10.50.50.50deploymentManagerRestHost> 
  29.               <deploymentManagerRestPort>58090deploymentManagerRestPort> 
  30.               <deploymentManagerRestUsername> 
  31.                 myotherusername  
  32.               deploymentManagerRestUsername> 
  33.               <deploymentManagerRestPassword> 
  34.                 myotherpassword  
  35.               deploymentManagerRestPassword> 
  36.           properties> 
  37.       profile> 

  部署 Maven 配置文件

  在 清單 7 的 profiles.xml 文件中,我定義了兩個配置文件,并根據 env (環境)屬性的值激活它們。如果 env 屬性被設置為 dev,則使用開發部署信息。如果 env 屬性被設置為 qa,那么將使用 QA 部署信息,等等。

  這是部署文件的命令:

  1. mvn -Pdeploywar -Denv=dev clean install 

  -Pdeploywar 標記通知要明確包含 deploywar 配置文件。-Denv=dev 語句創建一個名為 env 的系統屬性,并將其值設為 dev,這激活了開發配置。傳遞 -Denv=qa 將激活 QA 配置。

#p#

技巧5. 定制 Maven 插件

  Maven 有十幾個預構建插件供您使用,但是有時候您只想找到自己需要的插件,構建一個定制的 Maven 插件比較容易:

  用 POM packaging 創建一個新項目,設置為 “maven-plugin”。

  包括一個 maven-plugin-plugin 調用,可以定義您的公布插件目標。

  創建一個 Maven 插件 “mojo” 類 (一個擴展 AbstractMojo 的類)。

  為類的 Javadoc 做注釋來定義目標,并為每個將被作為配置參數公布的變量做注解。

  實現一個 execute() 方法,該方法在調用您的插件是將被調用。

  例如,清單 8 顯示了一個定制插件(為了部署 Tomcat)的相關部分:

  清單 8. TomcatDeployerMojo.java

  1. package net.fpic.maven.plugins;  
  2.  
  3. import java.io.File;  
  4. import java.util.StringTokenizer;  
  5.  
  6. import net.fpic.tomcatservice64.TomcatDeploymentServerClient;  
  7.  
  8. import org.apache.maven.plugin.AbstractMojo;  
  9. import org.apache.maven.plugin.MojoExecutionException;  
  10.  
  11. import com.javasrc.server.embedded.CommandRequest;  
  12. import com.javasrc.server.embedded.CommandResponse;  
  13. import com.javasrc.server.embedded.credentials.Credentials;  
  14. import com.javasrc.server.embedded.credentials.UsernamePasswordCredentials;  
  15. import com.javasrc.util.FileUtils;  
  16.  
  17. /**  
  18.  * Goal that deploys a web application to Tomcat  
  19.  *  
  20.  * @goal deploy  
  21.  * @phase install  
  22.  */  
  23. public class TomcatDeployerMojo extends AbstractMojo  
  24. {  
  25.     /**  
  26.      * The host name or IP address of the deployment server  
  27.      *   
  28.      * @parameter alias="host" expression="${deploy.host}" @required  
  29.      */  
  30.     private String serverHost;  
  31.       
  32.     /**  
  33.      * The port of the deployment server  
  34.      *   
  35.      * @parameter alias="port" expression="${deploy.port}" default-value="58020" 
  36.      */  
  37.     private String serverPort;  
  38.  
  39.     /**  
  40.      * The username to connect to the deployment manager (if omitted then the plugin  
  41.      * attempts to deploy the application to the server without credentials)  
  42.      *   
  43.      * @parameter alias="username" expression="${deploy.username}" 
  44.      */  
  45.     private String username;  
  46.  
  47.     /**  
  48.      * The password for the specified username  
  49.      *   
  50.      * @parameter alias="password" expression="${deploy.password}" 
  51.      */  
  52.     private String password;  
  53.  
  54.     /**  
  55.      * The name of the source artifact to deploy, such as target/pos.war  
  56.      *   
  57.      * @parameter alias="artifactSource" expression=${deploy.artifactSource}"   
  58.      * @required  
  59.      */  
  60.     private String artifactSource;  
  61.       
  62.     /**  
  63.      * The destination name of the artifact to deploy, such as ROOT.war.   
  64.      * If not present then the  
  65.      * artifact source name is used (without pathing information)  
  66.      *   
  67.      * @parameter alias="artifactDestination"   
  68.      *   expression=${deploy.artifactDestination}"  
  69.      */  
  70.     private String artifactDestination;  
  71.       
  72.     public void execute() throws MojoExecutionException  
  73.     {  
  74.         getLog().info( "Server Host: " + serverHost +   
  75.                        ", Server Port: " + serverPort +   
  76.                        ", Artifact Source: " + artifactSource +   
  77.                        ", Artifact Destination: " + artifactDestination );  
  78.           
  79.         // Validate our fields  
  80.         if( serverHost == null )  
  81.         {  
  82.             throw new MojoExecutionException(   
  83.               "No deployment host specified, deployment is not possible" );  
  84.         }  
  85.         if( artifactSource == null )  
  86.         {  
  87.             throw new MojoExecutionException(   
  88.               "No source artifact is specified, deployment is not possible" );  
  89.         }  
  90.  
  91.         ...  
  92.    }  
  93. }  

  在這個類的頭部,@goal 注釋指定 MOJO 執行的目標,而 @phase 指出目標執行的階段。除了一個映射到一個有真實值的系統屬性的表達式之外,每個公布的屬性有一個 @phase 注釋,通過將被執行的參數指定別名。如果屬性有一個 @required 注釋,那么它是必須的。如果它有一個 default-value,那么如果沒有指定的話,將使用這個值。在 execute() 方法中,您可以調用 getLog() 來訪問 Maven 記錄器,根據記錄級別,它將輸出具體消息到標準輸出設備。如果插件發生故障,拋出一個 MojoExecutionException 將導致構建失敗。

  結束語

  您可以使用 Maven 只進行構建,但是最好的 Maven 是一個項目生命周期管理工具。本文介紹了 5 個大家很少了解的特性,可以幫助您更高效地使用 Maven。

【編輯推薦】

  1. Maven 實戰
  2. Apache Maven 2簡介
  3. Maven是什么?回顧Java社區的變革
  4. 2.7 了解應用程序生命周期
  5. 軟件項目生命周期管理工具平臺詳解
責任編輯:韓亞珊 來源: IBM developerWorks
相關推薦

2021-01-08 10:32:42

項目預算項目經理

2020-03-06 10:41:50

云計算混合云公共云

2024-06-04 12:37:18

2024-08-26 14:42:04

Python目錄管理

2011-11-10 09:53:52

項目管理

2020-08-14 10:57:49

開發技能代碼

2021-07-02 10:20:15

HTML前端技巧

2021-02-20 22:09:48

Web開發HTML

2009-05-04 09:11:28

GoogleChrome瀏覽器

2016-02-22 15:09:19

Android項目管理技巧

2012-10-29 11:01:17

2011-04-12 10:42:41

Oracle日志文件管理

2020-09-23 10:09:43

Dockerfile

2020-06-04 10:53:32

虛擬會議遠程工作

2024-07-26 00:35:33

2011-03-28 09:45:17

Hyper-V

2016-03-03 13:53:43

WiFi華為

2019-10-11 10:22:36

Linux命令

2020-12-07 10:36:17

首席信息官IT項目CIO

2020-03-30 17:38:02

云計算云遷移IT
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲成人一区二区 | 国产精品高潮呻吟久久av野狼 | 亚洲一区在线播放 | 精品久久久久久久久久久久 | 成人黄色av网址 | 亚洲人精品午夜 | 91直接看 | 国产在线播放一区二区三区 | 日韩精品一区二区三区高清免费 | 粉嫩国产精品一区二区在线观看 | 我要看黄色录像一级片 | 在线看一区二区三区 | 亚洲欧美另类在线观看 | 午夜影院在线免费观看视频 | 欧美精品在线免费 | 精品国产欧美日韩不卡在线观看 | 亚洲精品综合一区二区 | 色香婷婷 | 羞羞视频网站免费观看 | 在线视频一区二区 | 国产日韩一区二区三区 | 日韩在线免费 | 中文字幕一区二区三区四区 | 69亚洲精品 | 成人性生交a做片 | 毛片一区二区三区 | 伊人婷婷| 天天操精品视频 | 亚洲精品电影网在线观看 | 日韩国产中文字幕 | 久久av资源网 | 日韩一级黄色片 | av毛片| 欧美国产一区二区三区 | 欧美另类视频在线 | 久久国产精品一区二区三区 | 国产精品视频入口 | 精品国产aⅴ | 久久成人激情 | 亚洲精品欧美 | 国产视频中文字幕在线观看 |