摘要:清理上一次執行創建的文件處理資源文件編譯代碼執行單元測試文件創建拷貝到本地的倉庫下面發布生成文檔將工程所有文檔生成網站,生成的網站界面默認和的項目站點類似,但是其文檔用格式寫的,目前不支持,需要用其他插件配合才能支持。
前言
本文可以幫助你加深對Maven的整體認識,不是一篇基礎文章。如果你現在還沒有用 Maven 跑過 HelloWorld,那么本文可能不適合你。
一、Maven簡介Maven 官網:https://maven.apache.org
Maven 3.3.9版本文檔:http://maven.apache.org/ref/3...
Maven是一個項目管理工具,它包含了一個項目對象模型 (Project Object Model),一組標準集合,一個項目生命周期(Project Lifecycle),一個依賴管理系統(Dependency Management System),和用來運行定義在生命周期階段(phase)中插件(plugin)目標(goal)的邏輯。
版本:maven有自己的版本定義和規則
構建:可以完成編譯,打包,部署等。
依賴管理:方便引入所需依賴 Jar 包,不需手動下載
文檔生成:maven的site命令支持各種文檔信息的發布,包括構建過程的各種輸出,javadoc,產品文檔等。
項目關系:一個大型的項目通常有幾個小項目或者模塊組成,用maven可以很方便地管理
二、Maven生命周期maven把項目的構建劃分為不同的生命周期(lifecycle)。粗略一點的話,它這個過程(phase)包括:
驗證(validate):驗證項目是否正確
編譯(compile): 編譯項目的源代碼
測試(test):使用合適的單元測試框架測試編譯的源代碼。這些測試不應該要求代碼被打包或部署
打包(package)
驗證(verify)
安裝(install)
部署(deploy)
maven中所有的執行動作(goal)都需要指明自己在這個過程中的執行位置,然后maven執行的時候,就依照過程的發展依次調用這些goal進行各種處理。
這個也是maven的一個基本調度機制。一般來說,位置稍后的過程都會依賴于之前的過程。當然,maven同樣提供了配置文件,可以依照用戶要求,跳過某些階段。
三、Maven 版本規范maven使用如下幾個要素來唯一定位某一個輸出物: groupId:artifactId:packaging:version 。比如org.springframework:spring:2.5 。每個部分的解釋如下:
groupId 公司,團體等。如Apache Software的項目有以org.apache開頭的groupId。
artifactId 項目的唯一標識符。比如一個helloworld項目就叫helloworld。
packaging 項目打包輸出的類型,默認是jar。類型為war的項目產生一個web應用。
version 一個項目的特定版本。發布的項目有一個固定的版本標識來指向該項目的某一個特定的版本。而正在開發中的項目可以用一個特殊的標識,這種標識給版本加上一個"SNAPSHOT"的標記。
maven有自己的版本規范,一般是如下定義
maven在版本管理時候可以使用幾個特殊的字符串 SNAPSHOT ,LATEST ,RELEASE 。比如"1.0-SNAPSHOT"。各個部分的含義和處理邏輯如下說明:
SNAPSHOT 如果一個版本包含字符串"SNAPSHOT",Maven就會在安裝或發布這個組件的時候將該符號展開為一個日期和時間值,轉換為UTC時間。例如,"1.0-SNAPSHOT"會在2010年5月5日下午2點10分發布時候變成1.0-20100505-141000-1。這個詞只能用于開發過程中,因為一般來說,項目組都會頻繁發布一些版本,最后實際發布的時候,會在這些snapshot版本中尋找一個穩定的,用于正式發布,比如1.4版本發布之前,就會有一系列的1.4-SNAPSHOT,而實際發布的1.4,也是從中拿出來的一個穩定版。
LATEST 指某個特定構件的最新發布,這個發布可能是一個發布版,也可能是一個snapshot版,具體看哪個時間最后。
RELEASE 指最后一個發布版。
四、Maven 項目依賴 1. 多模塊依賴和繼承項目結構圖:
parent ├─childA(model層) │ └─pom.xml(jar) ├─childB(web層) │ └─pom.xml(war) └─pom.xml(pom)
parent中執行mvn install就能將 childA和childB 一起編譯
parent的pom.xml做如下配置:
com.song parent 1.0-SNAPSHOT pom childA childB
childA和childB的pom.xml都需要配置parent,防止引入的包沖突(如果不加parent,會分別去編譯他們引入的依賴,會重復引入包):
parent com.song 1.0-SNAPSHOT 4.0.0 childA jar parent com.song 1.0-SNAPSHOT 4.0.0 childB war
子pom間存在引用關系,比如childB引用到了childA的jar包
2. 子項目繼承父項目的依賴com.module childA 1.0-SNAPSHOT
parent中加上
3. 依賴范圍javax.servlet servlet-api 2.5
如果不顯示執行
scope 屬性包括:
compile(編譯范圍):編譯范圍的
provided(已提供范圍):表示部署的環境當中有某容器已經提供了該jar包,只在編譯classpath(不是運行時)可用。它們不是傳遞性的,也不會被打包。例如,如果你開發了一個web應用,你可能在編譯classpath中需要可用的Servlet API來編譯一個servlet,但是你不會想要在打包好的WAR中包含這個Servlet API;這個Servlet API JAR由你的servlet容器(Tomcat)提供。
runtime(運行時范圍):只在運行和測試系統的時候需要,但在編譯的時候不需要。
test(測試范圍):在一般的 編譯和運行時都不需要,它們只有在測試編譯和測試運行階段可用。
system (系統范圍):該范圍不推薦使用(你應該一直盡量去從公共或定制的Maven倉庫中引用依賴)
詳細可參考:https://maven.apache.org/guid...4. 可選依賴(Optional Dependencies)和依賴排除(Dependency Exclusions)
maven的依賴關系是有傳遞性的。如:A-->B,B-->C。但有時候,項目A可能不是必需依賴C,因此需要在項目A中排除對A的依賴。在maven的依賴管理中,有兩種方式可以對依賴關系進行,分別是可選依賴(Optional Dependencies)以及依賴排除(Dependency Exclusions)。
4.1 可選依賴 optional當一個項目A依賴另一個項目B時,項目A可能很少一部分功能用到了項目B,此時就可以在A中配置對B的可選依賴。舉例來說,一個類似hibernate的項目,它支持對mysql、oracle等各種數據庫的支持,但是在引用這個項目時,我們可能只用到其對mysql的支持,此時就可以在這個項目中配置可選依賴。
配置可選依賴的原因:1、節約磁盤、內存等空間;2、避免license許可問題;3、避免類路徑問題,等等。
sample.ProjectB Project-B 1.0 compile true
假設以上配置是項目A的配置,即:Project-A --> Project-B。在編譯項目A時,是可以正常通過的。
如果有一個新的項目X依賴A,即:Project-X -> Project-A。此時項目X就不會依賴項目B了。如果項目X用到了涉及項目B的功能,那么就需要在pom.xml中重新配置對項目B的依賴。
4.2 依賴排除 exclusions當一個項目A依賴項目B,而項目B同時依賴項目C,如果項目A中因為各種原因不想引用項目C,在配置項目B的依賴時,可以排除對C的依賴。
示例(假設配置的是A的pom.xml,依賴關系為:A --> B; B --> C):
sample.ProjectB Project-B 1.0 compile sample.ProjectC Project-C
當然,對于多重依賴,配置也很簡單,參考如下示例:
Project-A -> Project-B -> Project-D -> Project-E -> Project-F -> Project C
A對于E相當于有多重依賴,我們在排除對E的依賴時,只需要在配置B的依賴中進行即可:
五、Maven插件機制 1. Maven默認插件sample.ProjectB Project-B 1.0-SNAPSHOT sample.ProjectE Project-E
不配置Plugin時,Maven默認會使用以下插件。如果針對各個 plugin 有特殊配置的話,需要顯示指定 plugin 和 屬性配置。
plugin | function | life cycle phase |
---|---|---|
maven-clean-plugin | 清理上一次執行創建的target文件 | clean |
maven-resources-plugin | 處理資源文件 | resources,testResources |
maven-compiler-plugin | 編譯Java代碼 | compile、testCompile |
maven-surefire-plugin | 執行單元測試文件 | test |
maven-jar-plugin | 創建 jar | package |
maven-install-plugin | 拷貝jar到本地的maven倉庫 .m2/repository 下面 | install |
maven-deploy-plugin | 發布 jar | deploy |
maven-site-plugin | 生成文檔 | site |
maven-site-plugin:將工程所有文檔生成網站,生成的網站界面默認和apache的項目站點類似,但是其文檔用doxia格式寫的,目前不支持docbook,需要用其他插件配合才能支持。需要指出的是,在maven 2.x系列中和maven3.x的site命令處理是不同的,在舊版本中,用 mvn site 命令可以生成reporting節點中的所有報表,但是在maven3中,reporting過時了,要把這些內容作為 maven-site-plugin的configuration的內容才行。詳細內容可以參考http://www.wakaleo.com/blog/2...
2. Maven常用插件 2.0 spring-boot-maven-pluginsrc/main/java true **/*.xml src/main/resources true **/*.properties *.xml *.dic *.txt src/main/resources false *.p12 maven-compiler-plugin 3.1 1.8 UTF-8 org.apache.maven.plugins maven-resources-plugin 2.6 UTF-8
當使用SpringBoot開發項目的時候,會使用到spring-boot-maven-plugin插件
官方文檔:https://docs.spring.io/spring...
Spring Boot Maven plugin有5個Goals:
命令 | 說明 |
---|---|
spring-boot:repackage | 默認goal。在mvn package之后,再次打包可執行的jar/war, 并將mvn package生成的軟件包重命名為*.original |
spring-boot:run | 運行Spring Boot應用 |
spring-boot:start | 在mvn integration-test階段,進行Spring Boot應用生命周期的管理 |
spring-boot:stop | 在mvn integration-test階段,進行Spring Boot應用生命周期的管理 |
spring-boot:build-info | 生成Actuator使用的構建信息文件build-info.properties |
其中比較重要的命令是:
mvn package spring-boot:repackage
執行后會看到生成的兩個jar文件,一個是*.jar,另一個是*.jar.original。
這是由于在執行上述命令的過程中,Maven首先在package階段打包生成*.jar文件;然后執行spring-boot:repackage重新打包
我們也可以跳過repackage階段:
clean deploy -D spring-boot.repackage.skip=true
加上-D spring-boot.repackage.skip=true參數即可,此時只會生成一個普通的jar包
2.1 maven-source-pluginmaven-source-plugin提供項目自動將源碼打包并發布的功能,在需要發布源碼項目的pom.xml文件中添加如下代碼即可:
org.apache.maven.plugins maven-source-plugin attach-sources jar
執行 mvn install,maven會自動將source install到repository 。
執行 mvn deploy,maven會自動將source deploy到remote-repository 。
執行 mvn source:jar,多帶帶打包源碼。
注意:在多項目構建中,將source-plugin置于頂層或parent的pom中并不會發揮作用,必須置于具體項目的pom中。2.2 Tomcat插件
tomcat插件有兩種:tomcat-maven-plugin 和 tomcat7-maven-plugin,使用方式基本相同。
tomcat-maven-plugin 插件是org.codehaus.mojo組織提供的,里面的tomcat是6.0.29版本,沒有更新了。
tomcat7-maven-plugin 插件是apache提供的,官網:http://tomcat.apache.org/mave...
tomcat7-maven-plugin 插件使用
org.apache.tomcat.maven tomcat7-maven-plugin 2.2 / 8080 UTF-8 tomcat7 package run
命令:
tomcat7:deploy --部署一個web war包 tomcat7:reload --重新加載web war包 tomcat7:start --啟動tomcat tomcat7:stop --停止tomcat tomcat7:undeploy --停止一個war包 tomcat7:run --啟動嵌入式tomcat ,并運行當前項目
tomcat-maven-plugin 插件使用
org.codehaus.mojo tomcat-maven-plugin 1.1 /helloworld 8080 UTF-8 http://localhost:8080/manager/html tomcat6 -Xms256m -Xmx512m -XX:MaxPermSize=512m
命令:
tomcat:deploy --部署一個web war包 tomcat:reload --重新加載web war包 tomcat:start --啟動tomcat tomcat:stop --停止tomcat tomcat:undeploy --停止一個war包 tomcat:run --啟動嵌入式tomcat ,并運行當前項目
配置參數:
path:是訪問應用的路徑
port:是tomcat 的端口號
uriEncoding:URL按UTF-8進行編碼,這樣就解決了中文參數亂碼。
Server:指定tomcat名稱。
自動部署包含三個步驟:
編譯打包、上傳到服務器、在服務器上執行linux命令
Maven項目可使用 mvn install 指令打包,打包完成后包位于target目錄下,要想在遠程服務器上部署,首先要將包上傳到服務器。
首先在本地的setting.xml中配置server的信息,包括id,用戶名,密碼。(當然也可以在pom.xml里面配置)
linux_server user password
pom.xml
org.apache.maven.wagon wagon-ssh 2.8 org.codehaus.mojo wagon-maven-plugin 1.0 linux_server target/test.war scp://user:password@192.168.20.128/home/tomcat7/webapps
命令:
# 對項目進行打包和上傳操作 mvn clean install wagon:upload-single
如果覺的wagon命令太長,可以設置 excutions 來配置phase和goals來簡化命令。
2.3.2 在服務器上執行linux命令org.apache.maven.wagon wagon-ssh 2.8 org.codehaus.mojo wagon-maven-plugin 1.0 target/test.jar scp://user:password@192.168.20.128/home/java/exe pkill -f /home/java/exe/test.jar nohup java -jar /home/java/exe/test.jar > /home/java/exe/$(date +%Y%m%d-%H%M%S).log & true
命令
mvn clean install wagon:upload-single wagon:sshexec
org.apache.maven.wagon wagon-ssh 2.8 org.codehaus.mojo wagon-maven-plugin 1.0 target/javawebdeploy.war scp://user:password@192.168.20.128/home/tomcat7/webapps sh /home/tomcat7/bin/shutdown.sh rm -rf /home/tomcat7/webapps/test sh /home/tomcat7/bin/startup.sh true
命令
mvn clean install wagon:upload-single wagon:sshexec2.3.3 配置execution
如果覺得 mvn clean package wagon:upload-single wagon:sshexec 命令太長了不好記,那么可以配置execution,在運行deploy的同時運行upload-single和sshexec。
org.apache.maven.wagon wagon-ssh 2.8 org.codehaus.mojo wagon-maven-plugin 1.0 upload-deploy deploy upload-single sshexec target/test.war scp://user:password@192.168.20.128/home/tomcat7/webapps sh /home/tomcat7/bin/shutdown.sh rm -rf /coder/tomcat7/webapps/test sh /coder/tomcat7/bin/startup.sh true
部署命令
mvn clean deploy -D maven.deploy.skip=true2.3.4. 完整示例配置
首先在本地的setting.xml中配置server的信息,包括id,用戶名,密碼。(當然也可以在pom.xml里面配置)
linux_server user password
pom.xml
org.apache.maven.wagon wagon-ssh 2.8 org.codehaus.mojo wagon-maven-plugin 1.0 linux_server scp://192.168.20.128/home/tomcat7/webapps true upload-war-to-server deploy upload-single sshexec target/test.war datefilename=$(date +%Y%m%d-%H%M%S);cp /home/tomcat7/webapps/test.war /home/tomcat7/webapps/test.war.$datefilename ps -ef | grep /home/tomcat7/ | grep -v grep | awk {"print $2"} | sed -e "s/^/kill -9 /g" | sh rm -rf /home/tomcat7/webapps/test export JAVA_HOME=/home/jdk/jdk1.8.0_91;sh /home/tomcat7/bin/startup.sh
部署命令
# 必須加 -D maven.deploy.skip=true ,表示跳過maven自身的deploy使用wagon的deploy。否則報錯“-DaltDeploymentRepository=id::layout::url parameter” mvn clean deploy -D maven.deploy.skip=true2.4 maven-war-plugin
Maven打包時可以對web.xml中的spring.profiles.active值進行替換。
先web.xml中配置一個占位符${profiles.active}:
spring.profiles.active ${profiles.active}
在pom.xml配置maven-war-plugin:
maven-war-plugin 3.2.2 true dev dev dev release release
以上配置完成后,再通過mvn package -Pdev或mvn package -Preelase打包后,${profiles.active}<占位符就被替換為dev或release
六、Maven控制測試環境和正式環境 6.1 Maven profiles切換測試環境和正式環境dev dev true release release beta beta helloworld src/main/resources config/ src/main/resources/config/${profiles.active} .
id代表這個環境的唯一標識,在 mvn install -Pdev 來指定。
此properties定義了三個環境,分別是dev(開發環境)、beta(測試環境)、release(發布環境)
activeByDefault=true代表如果不指定某個固定id的profile,那么就使用這個環境
使用 mvn install -Pdev會將 id 為 dev 的 profile 中的
如果想要整合Maven profile和Spring Framework profile,Maven打包時可以對web.xml中的spring.profiles.active值進行替換。
先web.xml中配置一個占位符${profiles.active}:
spring.profiles.active ${profiles.active}
在pom.xml配置maven-war-plugin:
maven-war-plugin 3.2.2 true dev dev dev release release
以上配置完成后,再通過mvn package -Pdev或mvn package -Preelase打包后,${profiles.active}<占位符就被替換為dev或release
七、Maven 變量 1. 內置屬性${basedir} represents the directory containing pom.xml
**${version}** equivalent to ${project.version } or ${pom.version }
2. Pom/Project properties所有pom中的元素都可以用 project. 前綴進行引用,以下是部分常用的
**${project.build.directory}** results in the path to your "target" dir, this is the same as ${pom.project.build.directory}
${project.build.outputDirectory} results in the path to your "target/classes" dir
${project.name} refers to the name of the project.
${project.version} refers to the version of the project.
${project.build.finalName} refers to the final name of the file created when the built project is packaged
3. 本地用戶設定所有用的的 settings.xml 中的設定都可以通過 settings. 前綴進行引用
${settings.localRepository} refers to the path of the user"s local repository.
${maven.repo.local} also works for backward compatibility with maven1
4. 環境變量系統的環境變量通過 env. 前綴引用
${env.M2_HOME} returns the Maven2 installation path.
**${java.home}** specifies the path to the current JRE_HOME environment use with relative paths to get for example:
所有JVM中定義的java系統屬性.
6. pom.xml自定義變量... ... hellowolrld
則引用 ${project.build.finalName} 就會得到值 hellowolrld
7. parent 工程的變量parent工程的pom.xml中的變量用前綴 ${project.parent} 引用. 上級工程的版本也可以這樣引用: ${parent.version }.
參考文章:
https://blog.csdn.net/wwbmyos...
https://blog.csdn.net/j080624...
http://xxgblog.com/2015/10/23...
https://blog.csdn.net/java_an...
https://blog.csdn.net/xiao__g...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69566.html
摘要:說明目前互聯網公司,大部分項目都是基于分布式,一個項目被拆分成幾個小項目,這些小項目會分別部署在不同的計算機上面,這個叫做微服務。當一臺計算機的程序需要調用另一臺計算機代碼的時候,就涉及遠程調用。此時就粉末登場了。 showImg(https://s2.ax1x.com/2019/07/05/ZaELxe.jpg); 說明 目前互聯網公司,大部分項目都是基于分布式,一個項目被拆分成幾個...
摘要:今天就介紹一款常用的緩存框架。設置緩存中對象是否為永久的,如果是,超時設置將被忽略,對象從不過期。內存不足時,是否啟用磁盤緩存。磁盤失效線程運行時間間隔,默認是秒。 在當今大數據爆發時代,數據量每天都呈爆炸式增長,頻繁的數據庫訪問無疑給數據庫帶來的極大負載,除了增大物理服務器的數量,我們也可以將一些常用的、公共的資源以cache形式放在客戶端或者靠近客戶端的服務器上,從而減少了服務器的...
摘要:最近在用開發窗體程序,并且以后打算把所有的窗體軟件切換到上面,并且還想用的各種好處,集成了就可以愉快的用各種服務了。最重要的是打包工具。由于我是,一般用和,執行命令會看到打包成了和兩種類型的安裝包。由于沒有計算機,所以還不知道打包成的狀態。 最近在用 JavaFx 開發窗體程序,并且以后打算把所有的窗體軟件切換到 JavaFx 上面,并且還想用 springboot 的__各種好處,集...
摘要:接下來我們繼續看如果達成包,在加入如下配置然后通過打包,最后通過命令啟動這樣,最簡單的就完成了,但是對于一個大型項目,這是遠遠不夠的,的詳細操作可以參照官網。以上實例只是最簡單的項目入門實例,后面會深入研究。 什么是Spring Boot Spring Boot是由Pivotal團隊提供的基于Spring的全新框架,其設計目的是為了簡化Spring應用的搭建和開發過程。該框架遵循約定大...
閱讀 1876·2021-09-24 09:48
閱讀 3220·2021-08-26 14:14
閱讀 1674·2021-08-20 09:36
閱讀 1461·2019-08-30 15:55
閱讀 3628·2019-08-26 17:15
閱讀 1425·2019-08-26 12:09
閱讀 606·2019-08-26 11:59
閱讀 3323·2019-08-26 11:57