maven簡介
Maven全稱是Apache Maven Project–Apache的優(yōu)秀開源項目,Maven是java項目的構(gòu)建和管理工具。Maven這個詞翻譯為“專家”或者“內(nèi)行”,是跨平臺的項目管理工具。Maven主要服務(wù)于Java平臺的項目構(gòu)建,依賴管理,項目信息管理等。
接下來是項目構(gòu)建的過程,通常項目構(gòu)建的過程分為這六個步驟:
理想的項目構(gòu)建是高度自動化、跨平臺,可重用、的組件,使用Maven就可以幫助我們完成上述項目構(gòu)建的完整過程。
再有就是依賴管理。所謂的依賴管理其實就是使用Maven來管理項目中所使用到的jar包,Maven管理的方式就是“自動下載項目所需要的jar包,統(tǒng)一管理jar包之間的依賴關(guān)系”。
注意Maven的使用依賴于Java,因此需要提前安裝Java。
Maven的安裝
Maven的用途很大,這里簡單說一下:
1、用Maven可以方便的創(chuàng)建項目,基于archetype可以創(chuàng)建多種類型的java項目;
2、Maven倉庫對jar包(artifact)進(jìn)行統(tǒng)一管理,避免jar文件的重復(fù)拷貝和版本沖突;
3、團(tuán)隊開發(fā),Maven管理項目的release(正式版本)和snapshot(開發(fā)版本)版本,方便多模塊(module)項目的各個模塊之間的快速集成
點(diǎn)擊這里使用鏡像下載Maven:maven下載
選擇所需要的的版本后,接著選擇binaries這個文件夾,再選擇以.zip結(jié)尾的文件就可以了,然后進(jìn)行下載,解壓。接下來介紹Maven解壓后的目錄結(jié)構(gòu),如下圖所示:
bin:含有mvn運(yùn)行的腳本;
boot:含有plexus-classwords類加載器框架;
conf:含有setting.xml配置文件;
lib:含有Maven運(yùn)行時所需要的java類庫;
后面的3個txt文件主要針對Maven版本,第三方軟件進(jìn)行簡單介紹。
接下來進(jìn)行Maven環(huán)境變量的配置:我的電腦–>屬性–>高級系統(tǒng)設(shè)置–>環(huán)境變量–>系統(tǒng)變量–>新建:變量名:M2_HOME;變量值:G:ApplicationMavenapache-maven-3.6.0(也就是Maven解壓后的目錄),接著找到Path在環(huán)境變量值尾部加入;%M2_HOME%bin; 注意前面的分號 !
最后檢查Maven是否安裝成功: 打開dos窗口運(yùn)行命令mvn -version,出現(xiàn)如下圖所示的信息說明安裝成功:
修改Maven本地倉庫位置
通常Maven會將下載的類庫(jar包)放置到本地的一個目錄下(默認(rèn)情況是C:我的文檔中.m2.repository),如果想重新定義這個目錄就需要修改Maven本地倉庫的配置,這個過程也很簡單,只需要四步:
第一步:在自己指定的位置處創(chuàng)建一個文件夾repo(名稱隨意),本人創(chuàng)建的位置是:G:ApplicationMavenrepo;
第二步:在Maven文件夾下找到conf文件夾,并找到其中的settings.xml文件,然后復(fù)制settings.xml文件放于G:ApplicationMaven,其實就是直接放在與你新建的repo文件夾同一目錄:
第三步:修改這個settings.xml及前面conf文件里的settings.xml(也就是兩個settings.xml文件),找到55行,修改Maven默認(rèn)的倉庫位置,如下圖所示:
第四步:測試效果,打開dos窗口運(yùn)行命令mvn help:system,出現(xiàn)如下圖所示的信息說明配置成功(這個過程需要一定時間):
接下來介紹Maven項目的目錄結(jié)構(gòu):
創(chuàng)建一個Maven項目
此處使用IDEA創(chuàng)建一個Maven項目,先在IDEA里面進(jìn)行Maven的配置:
點(diǎn)擊上面的新建圖片的首頁,點(diǎn)擊Configure–>Settings:
注意這里maven的解壓路徑,還有如果你的maven是默認(rèn)安裝,那么使用默認(rèn)配置即可。由于我在前面修改了Maven的配置,因此那個Maven home directory就需要設(shè)置為Maven的解壓路徑。注意一下這里的USer settings file,你可以使用conf目錄下的settings.xml,也可以使用repo同級下的settings.xml。最后的Loacl resposity設(shè)置為你repo文件所在路徑即可。按照圖上所示進(jìn)行配置,然后單擊ok就好。
接下來正式開始創(chuàng)建一個Maven空白項目:
然后一直next就可以了,然后系統(tǒng)會自動創(chuàng)建項目。(GroupId是項目名稱,ArtifactId是項目中某一模塊的名稱,Version是版本號)創(chuàng)建完成如圖所示:(第一次使用maven可能會花一點(diǎn)時間,因為maven的中央倉庫里面還沒有文件,你需要去下載)
如果在此過程中出現(xiàn)c:/users/Administor/AppData/Local/Temp/archetype,請參考這篇文章:解決辦法
打開里的pom.xml文件,它的作用就是配置一些jar包的引用地址:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com</groupId> <artifactId>mavendemo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>mavendemo Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>mavendemo</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build></project>
這里面有很多,目前先關(guān)注這個:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies>
這個就是jar包的依賴配置,這里是配置了junit這個jar包,關(guān)于包的查找可以點(diǎn)這里:maven官方倉庫,你需要什么就去這個網(wǎng)站進(jìn)行搜索,然后復(fù)制dependency標(biāo)簽即可。groupId是倉庫中生成包的路徑,artifactId當(dāng)前存放包的最終一個目錄,version就是版本號。
下面是一些常用的maven命令:
清除命令:mvn clean(刪除target,不會刪除本地倉庫)
編譯命令: mvn compile
編譯、運(yùn)行、發(fā)布命令:mvn install
編譯、運(yùn)行、不負(fù)責(zé)發(fā)布命令:mvn package
編譯、如果test包下有Java代碼也會編譯和運(yùn)行,但也一樣不會發(fā)布到本地倉庫:mvn test
跳過單元測試:mvn clean package -Dmaven.test.skip=true
mvn package與mvn install的區(qū)別:主要區(qū)別就是package命令不會將target內(nèi)容發(fā)布到本地倉庫。(因此建議一般使用mvn install)
但是我們一般不會直接去使用這些命令,因為IDEA里面已經(jīng)集成了這些命令。點(diǎn)擊IDEA右側(cè)的Maven Projects:
Lifecycle是Maven項目的生命周期,而Plugins則是針對第三方依賴包的管理。詳細(xì)參看這篇文章:maven lifecycle 與 plugin
clean:用于清除之前構(gòu)建生成的所有文件,其中具體為清除Target目錄中的所有文件,包括該目錄。
validate:用于驗證項目是否真確,并且其說有必要信息是否都可用。
compile:編譯項目的源代碼,主要是java文件,一般是編譯scr/main/java或是scr/test/java里面的文件。
test:用合適的測試框架來進(jìn)行測試,測試compile中編譯出來的代碼,測試的東西一般不加包和部署。
package:獲取compile中編譯好的代碼并將其打包成可分類的格式,如jar。
vertify:這步是用來驗證test,檢查test的結(jié)果是否滿足標(biāo)準(zhǔn)。
install:將軟件包安裝到本地存儲庫中,確保本地其他項目可能需要使用它,也就是說某個項目被打包成jar包,必須先install才能被引入使用。(例如,裝了core才能用oms)。
一般都是先clean,后complie,再package,接著install,最后deploy。
演示編譯
接下來演示如何將一個項目打包為jar,在前面的app同級目錄新建一個util包,在里面新建一個StringUtil.java文件:
public class StringUtil { /** * 判斷字符串為空,空則返回true,反之則返回false * **/ public static boolean isEmpty(String string){ return null==string || "".equals(string); } /** * 判斷字符串是不為空,空則返回false,反之則返回true * **/ public static boolean isNotEmpty(String string){ return !isEmpty(string); }}
注意此處僅僅是演示,所以不再新增其他的業(yè)務(wù)邏輯。然后點(diǎn)擊右側(cè)的Maven Projects,按照順序依次運(yùn)行相應(yīng)命令:
然后你會發(fā)現(xiàn)項目結(jié)構(gòu)發(fā)生了變化,左側(cè)多了一個target文件及一個demo.jar包:
接下來新建一個Web項目,然后引入剛才的jar:
然后一直next就可以了,然后系統(tǒng)會自動創(chuàng)建項目,創(chuàng)建完成如圖所示:(第一次使用maven可能會花一點(diǎn)時間,因為maven的中央倉庫里面還沒有文件,你需要去下載)
然后配置tomcat訪問(注意使用war exploded,具體可參考IDEA中的war和war exploded的區(qū)別,說白了war是打包啟動,war xxx是熱啟動。通俗點(diǎn)就是當(dāng)你資源發(fā)生修改時,后者可以跟著重新啟動修改,而前者需要手動啟動)。
接下來便是項目文件和測試文件目錄的創(chuàng)建:在 main 文件下面創(chuàng)建一個java文件夾 ,然后按照如下操作:光標(biāo)移到j(luò)ava文件夾上面,然后右鍵拉到底部,找到Make Directory AS ,再單擊出現(xiàn)的Sources Root即可,會發(fā)現(xiàn)該文件變成了藍(lán)色。
緊接著在src文件下,創(chuàng)建mian文件的測試文件夾,名稱為test,然后再在test文件夾下面新建java文件夾 ,然后按照如下操作:光標(biāo)移到j(luò)ava文件夾上面,然后右鍵拉到底部,找到Make Directory AS ,再單擊出現(xiàn)的Test Sources Root即可,會發(fā)現(xiàn)該文件變成了綠色。
接下來開始引入jar包,打開之前那個mavendemo項目的pom.xml文件,找到關(guān)于這個項目的描述信息:
<groupId>com.test.app</groupId> <artifactId>demo</artifactId> <version>1.0-SNAPSHOT</version>
也就是這個:
然后回到helloweb項目,打開它的pom.xml文件,找到<dependencies></dependencies>標(biāo)簽,新建一個<dependency></dependency>標(biāo)簽,將之前那三行代碼放進(jìn)去,然后你會發(fā)現(xiàn)Maven會自動導(dǎo)入這個文件:
你可以嘗試將前面那個<dependency></dependency>標(biāo)簽刪除,發(fā)現(xiàn)這jar包又沒了。
然后在mian文件下的java包中新建一個Test.java,來嘗試測試一下:
public class Test { public static void main(String[] args){ String a = ""; System.out.println(StringUtil.isEmpty(a)); }}
運(yùn)行結(jié)果:true。說明測試通過,我們成功的引入了jar包。
如何引入本地的jar包
前面修改過Maven的本地倉庫地址為:G:ApplicationMavenrepo,因此請注意你所有在pom.xml文件中配置的依賴其實已經(jīng)下載到了這個文件夾下面,例如里面的的junit的配置:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency>
因此通過這個可以推斷出這個juint文件的位置為:G:ApplicationMavenrepo junitjunit4.11,不信的話去看一下本地的目錄結(jié)構(gòu):
確實如此,所以當(dāng)你知道某個文件在哪里,那么你也可以配置依賴。
按照這種方式配置servlet的依賴:G:ApplicationMavenrepojavaxservletservlet-api2.5,那么您在pom.xml中的依賴配置為:
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency>
注意到?jīng)],我們在<groupId>中導(dǎo)入的是javax.servlet而不是javax,因為那樣可以避免依賴層級過多,降低可讀性。
登錄系統(tǒng)演示
接下來通過Servlet來編寫一個登錄系統(tǒng),這樣能體驗完整的Maven功能。
在java包下面新建一個com.test.servlet包,接著新建一個LoginServlet.java文件,讓它繼承HttpServlet類,并重寫doGet和doPost方法(忽略導(dǎo)包代碼)
public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletrequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設(shè)置頁碼的字符編碼集 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); //獲取用戶提交信息 String username = request.getParameter("username"); String password = request.getParameter("password"); if(StringUtil.isNotEmpty(username) && StringUtil.isNotEmpty(password)){ request.getRequestDispatcher("/success.jsp").forward(request,response); }else{ request.getRequestDispatcher("/fail.jsp").forward(request,response); } }}
然后去web.xml文件中配置訪問路由:
<web-app> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.test.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/LoginServlet</url-pattern> </servlet-mapping></web-app>
接著修改index.jsp頁面信息為:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %><!doctype html><html lang="zh"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>用戶登錄</title></head><body><h2 align="left">登錄</h2><form action="/LoginServlet" method="post"> <div> <label for="username">用戶名</label> <input type="text" id="username" name="username" placeholder="請輸入用戶名"> </div> <div> <label for="password">密碼</label> <input type="password" id="password" name="password" placeholder="請輸入密碼"> </div> <div> <input type="submit" value="登錄"> </div></form></body></html>
繼續(xù)新建一個fail.jsp頁面,里面的代碼為:
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>失敗</title></head><body><h2 align="center" style="color: red">對不起,登錄失?。?lt;/h2></body></html>
同樣也需要新建一個success.jsp頁面,里面的代碼為:
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>登錄成功</title></head><body><h2 align="center" style="color: green">恭喜,登錄成功!</h2></body></html>
然后運(yùn)行項目,在瀏覽器地址欄中輸入地址:http://localhost:8080/,發(fā)現(xiàn)項目測試通過。
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。