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