1.簡(jiǎn)介
之前的maven項(xiàng)目打包類(lèi)型都為pom或者POM,今天講一下用maven構(gòu)建web應(yīng)用,web應(yīng)用的打包類(lèi)型為war。
2.Web項(xiàng)目的目錄結(jié)構(gòu)
- java的web應(yīng)用施无,其標(biāo)準(zhǔn)打包方式是war巢寡, war和jar類(lèi)似风纠,只不過(guò)它包含更多內(nèi)容淆院,如jsp文件、servlet文件昔搂、java類(lèi)玲销、web.xml配置,依賴(lài)包摘符、靜態(tài)web資源(html css js文件)等贤斜。
war文件目錄結(jié)構(gòu)如下:
jar文件目錄結(jié)構(gòu)如下:
-jar/
+META-INF/
+packagename
|+ java.class
|+ ...
- 一個(gè)WAR包至少包含兩個(gè)子目錄:META-INF和WEB-INF。
- META-INF:包含一些打包元數(shù)據(jù)逛裤,打包時(shí)會(huì)涉及到瘩绒。
- WEB-INF:必須包含web資源描述文件web.xml。classes包含所有該web項(xiàng)目的類(lèi)带族,而lib則包含所有web項(xiàng)目依賴(lài)的JAR包锁荔,classes和lib目錄都會(huì)在運(yùn)行的時(shí)候被加入到Classpath中。
- war包中的還包含了其他web資源炉菲,如html或者jsp堕战,js坤溃,css等拍霜。
2.1Maven對(duì)web項(xiàng)目的布局約定
- maven對(duì)不同類(lèi)型項(xiàng)目的布局結(jié)構(gòu)要求不一樣嘱丢,對(duì)于web項(xiàng)目有一個(gè)通用的約定,不過(guò)用戶(hù)必須顯示制定web項(xiàng)目的打包類(lèi)型為war才會(huì)按照正確的方式打包web項(xiàng)目祠饺。
- web項(xiàng)目的類(lèi)及資源文件同一般的JAR項(xiàng)目一樣越驻,默認(rèn)位置:src/main/java和src/main/resources。測(cè)試及測(cè)試資源文件默認(rèn)位置:src/test/java和src/test/resources道偷。Web項(xiàng)目比較特殊的地方在于:他有一個(gè)web資源目錄缀旁,默認(rèn)位置:src/main/webapp/
- 在src/main/webapp目錄下除了html、jsp勺鸦、css等必須包含子目錄WEB-INF,且子目錄必須包含web.xml文件并巍。
- 在使用Maven創(chuàng)建Web項(xiàng)目之前必須理解Maven結(jié)構(gòu)和WAR包結(jié)構(gòu)的對(duì)應(yīng)關(guān)系.
- 注意:WAR包中有一個(gè)lib目錄包含所有依賴(lài)JAR包,但Maven項(xiàng)目結(jié)構(gòu)中沒(méi)有這樣一個(gè)目錄换途,這是因?yàn)橐蕾?lài)都配置在POM中懊渡,Maven在使用WAR方式打包的時(shí)候會(huì)根據(jù)POM的配置從本地倉(cāng)庫(kù)復(fù)制相應(yīng)的JAR文件畦幢。
- 而對(duì)于JAR方式打包的時(shí)候不會(huì)把依賴(lài)打包進(jìn)去词顾,但是會(huì)在META-INF文件中包含pom.xml文件信息用于表明該jar包的依賴(lài)情況。maven---3手寫(xiě)一個(gè)helloWord----》6.補(bǔ)充:Maven打包的JAR文件目錄內(nèi)容
3.編寫(xiě)web項(xiàng)目
4.使用jetty-maven-plugin進(jìn)行測(cè)試
4.1需求背景
- 進(jìn)行web開(kāi)發(fā)時(shí)需要測(cè)試雅任,而測(cè)試內(nèi)容可以分為和頁(yè)面相關(guān)和頁(yè)面無(wú)關(guān)的測(cè)試懈息。
- 和頁(yè)面無(wú)關(guān)的測(cè)試有:數(shù)據(jù)訪問(wèn)肾档,業(yè)務(wù)邏輯等,這一類(lèi)測(cè)試使用單元測(cè)試(junit或testNG就可以完成)辫继。這一類(lèi)測(cè)試不要通過(guò)瀏覽器來(lái)測(cè)試了怒见,也不要濫用下面的方法來(lái)測(cè)試這些內(nèi)容。
- 和頁(yè)面有關(guān)的:如驗(yàn)證程序功能姑宽、驗(yàn)證頁(yè)面布局遣耍、jsp、js低千、css修改等與頁(yè)面相關(guān)的特性配阵,都需要手動(dòng)部署到web容器在打開(kāi)瀏覽器進(jìn)行測(cè)試。而傳統(tǒng)的web頁(yè)面測(cè)試需要手動(dòng)編譯示血、測(cè)試棋傍、打包及部署,往往消耗10幾秒甚至更長(zhǎng)难审。(jetty-maven-plugin要解決的事)
- jetty-maven-plugin能夠幫助我們節(jié)省時(shí)間瘫拣,它會(huì)周期性地檢查項(xiàng)目?jī)?nèi)容,發(fā)現(xiàn)項(xiàng)目變更后(包括src中webapp中內(nèi)容)自動(dòng)更新到內(nèi)置的jetty Web容器中告喊。然后就可以直接測(cè)試web頁(yè)面了麸拄。
- 注意:jetty-maven-plugin主要通過(guò)將項(xiàng)目自動(dòng)部署到j(luò)etty中從而方便測(cè)試派昧,所以在生產(chǎn)環(huán)境中不應(yīng)該使用該方式,因?yàn)樯森h(huán)境中我們的項(xiàng)目有可能部署到其它web容器中tomcat拢切、jboss,jetty等蒂萎,所以它主要用來(lái)幫助日常快速開(kāi)發(fā)和測(cè)試
4.2實(shí)踐
4.2.1配置插件
使用org.eclipse.jetty淮椰,該插件要求maven3.3+級(jí)以上版本五慈。org.eclipse.jetty
- pom.xml配置
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.14.v20161028</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webApp>
<contextPath>/test</contextPath>
</webApp>
<httpConnector>
<port>8168</port>
<host>localhost</host>
</httpConnector>
</configuration>
</plugin>
scanIntervalSeconds 表示該插件掃描項(xiàng)目變更的時(shí)間間隔,如配置默認(rèn)0主穗,表示不掃描泻拦。
contextPath:表示項(xiàng)目部署后的context path『雒剑可以通過(guò)http://hostname:port/test訪問(wèn)該應(yīng)用争拐。
port端口,默認(rèn)8080
host配置主機(jī)名,默認(rèn)localhost
settings.xml配置
默認(rèn)情況下晦雨,只有org.apache.maven.plugins和org.codehaus.mojo兩個(gè)groupId下的插件才支持簡(jiǎn)化的命令調(diào)用架曹,即mvn help:system,是可以的,因?yàn)閙aven-help-plugin的groupid是org.apache.maven.plugins金赦。而mvn jetty:run就不行音瓷,因?yàn)閖etty-maven-plugin的groupId是org.eclipse.jetty。更多原因請(qǐng)看 maven---7生命周期和插件--->8.4插件前綴
為了在命令行直接運(yùn)行mvn jetty:run夹抗,用戶(hù)需要配置settings.xml如下:
<pluginGroups>
<!-- pluginGroup
| Specifies a further group identifier to use for plugin lookup.
<pluginGroup>com.your.plugins</pluginGroup>
-->
<pluginGroup>org.eclipse.jetty</pluginGroup>
....
</pluginGroups>
4.2.2啟動(dòng)jetty
現(xiàn)在運(yùn)行如下命令啟動(dòng)jetty-maven-plugin:
mvn jetty:run
默認(rèn)端口8080,希望使用其他端口通過(guò)jetty.http.port參數(shù)绳慎,如
mvn jetty:run -Djetty.http.port=9999
啟動(dòng)jetty之后,用戶(hù)修改類(lèi)漠烧、jsp杏愤、html等都會(huì)被插件掃描到并重新自動(dòng)部署。
4.2.3jetty-maven-plugin的其它配置
上面是jetty-maven-plugin的最核心配置已脓,如果有需要可以自定義web.xml位置珊楼,項(xiàng)目class文件位置,web資源目錄位置等度液。還能以war包方式部署項(xiàng)目厕宗,甚至在maven生命周期嵌入jetty-maven-plugin等,具體看官網(wǎng)介紹:org.eclipse.jetty堕担。
4.3其它jetty-maven-plugin插件
除了上面的配置jetty的插件外已慢,還有其它的,可以選擇使用霹购。網(wǎng)址org.mortbay.jetty佑惠,其配置我測(cè)試過(guò)了,也可以使用。同樣也需要在settings.xml中配置pluginGroup膜楷。
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.5</version>
<configuration>
<webAppSourceDirectory>src/main/webapp</webAppSourceDirectory>
<scanIntervalSeconds>5</scanIntervalSeconds> 每隔10秒查看項(xiàng)目是否有變化旭咽,有變化重新編譯
<contextPath>/iqasweb</contextPath>
<connectors>
org.mortbay.jetty.nio.SelectChannelConnector
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>8088</port> 服務(wù)器監(jiān)聽(tīng)端口
</connector>
</connectors>
</configuration>
</plugin>
運(yùn)行命令:jetty:run
5.使用Cargo實(shí)現(xiàn)自動(dòng)化部署
- Cargo是一組幫助用戶(hù)操作web容器的工具,它支持計(jì)劃所有web容器(tomcat赌厅、jboss穷绵、jetty、glassfish等)察蹲,Cargo通過(guò)cargo-maven2-plugin提供Maven集成请垛,Maven使用該插件將Web項(xiàng)目部署到Web容器中催训。
- cargo-maven2-plugin和jetty-maven-plugin的功能相似洽议,但目的不同。
- jetty-maven-plugin:幫助日常開(kāi)發(fā)人員的快速開(kāi)發(fā)和測(cè)試漫拭。
- cargo-maven2-plugin:服務(wù)于自動(dòng)化部署亚兄。
插件官網(wǎng):Cargo
5.1需求
- 專(zhuān)門(mén)的測(cè)試人員希望一條簡(jiǎn)單的Maven命令就可以構(gòu)建項(xiàng)目并部署到Web容器中,然后進(jìn)行功能測(cè)試采驻。
- 以tomcat8為例审胚,介紹如何自動(dòng)化地將web應(yīng)用部署至本地和遠(yuǎn)程web容器中。
5.2部署至本地Web容器
- Cargo支持兩種本地部署方式:standalone模式和existing模式礼旅。
- standalone模式:Cargo會(huì)從Web容器的安裝目錄復(fù)制一份配置到用戶(hù)指定的目錄膳叨,然后在此基礎(chǔ)上部署應(yīng)用,每次重新構(gòu)建的時(shí)候痘系,這個(gè)目錄都會(huì)被清空菲嘴,所有配置被重新生成。
- existing模式:用戶(hù)需要指定現(xiàn)有的Web容器配置的目錄汰翠,然后Cargo會(huì)直接使用這些配置并將應(yīng)用部署到其對(duì)應(yīng)的位置龄坪。
5.2.1standalone模式
官網(wǎng)standalone模式
<!-- 配置cargo-maven2-plugin插件實(shí)現(xiàn)自動(dòng)部署,命令cargo:start -->
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.5.1</version>
<configuration>
<container>
<containerId>tomcat8x</containerId>
<home>D:\Soft\tomcat\tomcat8.0.32</home>
</container>
<configuration>
<type>standalone</type>
<home>${project.build.directory}/tomcat8x</home>
<properties>
<cargo.servlet.port>8083</cargo.servlet.port>
</properties>
</configuration>
</configuration>
</plugin>
- 解釋 配置了configuration和container
- configuration:type表示部署模式。home:表示復(fù)制容器配置到什么位置复唤,${project.build.directory}/tomcat8x表示構(gòu)建輸出目錄健田,即target/的tomcat8x子目錄。
cargo.servlet.port配置容器監(jiān)聽(tīng)端口佛纫,默認(rèn)8080 - container: containerId表示容器的類(lèi)型妓局,home元素表示容器的安裝目錄,基于該配置呈宇,Cargo會(huì)從D:\Soft\tomcat\tomcat8.0.32目錄下復(fù)制配置到當(dāng)前項(xiàng)目的target/tomcat8x下好爬。
5.2.2運(yùn)行
- 使用命令
mvn clean package cargo:run
當(dāng)然如果target已經(jīng)有構(gòu)建好的war可以直接cargo:run
- 然后進(jìn)入瀏覽器進(jìn)行訪問(wèn):http://hostname:port/項(xiàng)目打包的名稱(chēng)/
訪問(wèn)的項(xiàng)目打包名稱(chēng)不是你項(xiàng)目名稱(chēng),打包名稱(chēng)默認(rèn)是artifactId-version.packing攒盈〉志校可以通過(guò) finalName來(lái)配置友好的名稱(chēng)。project/build/finalName. - 同樣為了使用前綴簡(jiǎn)化命令調(diào)用cargo:run型豁。在settings.xml中配置pluginGroup
<pluginGroups>
...
<pluginGroup>org.codehaus.cargo</pluginGroup>
</pluginGroups>
不然出現(xiàn)以下錯(cuò)誤
[ERROR] No plugin found for prefix 'cargo' in the current project and in the plu
gin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repo
sitories [local (D:\Soft\maven\maven_jar\repository), nexus (http://172.19.201.1
55:8081/repository/maven-public/)] -> [Help 1]
5.2.3結(jié)束
命令:Ctr+C結(jié)束
5.2.4existing模式
要將應(yīng)用直接部署到現(xiàn)有的Web容器下僵蛛,使用該模式尚蝌。
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.5.1</version>
<configuration>
<container>
<containerId>tomcat8x</containerId>
<home>D:\Soft\tomcat\tomcat8.0.32</home>
</container>
<configuration>
<type>existing</type>
<home>D:\Soft\tomcat\tomcat8.0.32</home>
<properties>
<cargo.servlet.port>9996</cargo.servlet.port>
</properties>
</configuration>
</configuration>
</plugin>
和standalone不同的是configuration下的目錄表示現(xiàn)有Web容器目錄,運(yùn)行mvn cargo:start之后充尉,便能夠在tomcat的webapps子目錄看到被部署的Maven項(xiàng)目飘言。
5.3部署至遠(yuǎn)程web容器(吐血)
5.3.1配置
- 也可以讓Cargo部署應(yīng)用至遠(yuǎn)程的正在運(yùn)行的Web容器中。當(dāng)然驼侠,前提是擁有該容器的相應(yīng)管理員權(quán)限姿鸿。相關(guān)配置如下:
<!-- 配置cargo-maven2-plugin插件實(shí)現(xiàn)自動(dòng)部署,部署至遠(yuǎn)程Web容器,命令cargo:start -->
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.4.4</version>
<configuration>
<container>
<containerId>tomcat8x</containerId>
<type>remote</type>
</container>
<configuration>
<type>runtime</type>
<properties>
<cargo.remote.username>tomcat_script</cargo.remote.username>
<cargo.remote.password>tomcat_script</cargo.remote.password>
<cargo.remote.uri>http://localhost:8080/manager/text</cargo.remote.uri>
</properties>
</configuration>
</configuration>
</plugin>
- 解釋
- container的type值為remote,不然默認(rèn)installed倒源。
- configuration:的type為runtime苛预,表示既不使用獨(dú)立的容器配置,也不使用本地現(xiàn)有的容器配置笋熬,而是依賴(lài)一個(gè)已運(yùn)行的容器热某。
properties聲明一些容器熱部署相關(guān)的配置。這里是tomcat8的用戶(hù)名胳螟、密碼昔馋、管理地址。
注意:配置的tomcat用戶(hù)名要有manager-scripte權(quán)限糖耸。即在tomcat-users.xml配置
<user username="tomcat_script" password="tomcat_script" roles="manager-script"/>
對(duì)于的tomcat6及之前的版本秘遏,遠(yuǎn)程連接地址的寫(xiě)法和tomcat7、tomcat8不同嘉竟,如下邦危。
<cargo.remote.manager.url>http://localhost:8080/manager/html</cargo.remote.manager.url>
5.3.2運(yùn)行
- 先啟動(dòng)tomcat。
- 執(zhí)行mvn clean package cargo:redeploy
正常運(yùn)行周拐。
5.3.3沒(méi)弄懂的地方
上面部署的遠(yuǎn)程tomcat其實(shí)是在本地localhost铡俐,部署是成功的,當(dāng)我把項(xiàng)目部署到遠(yuǎn)程的tocmat上時(shí)即修改管理地址和遠(yuǎn)程tomcat的管理賬號(hào)時(shí)妥粟。
<cargo.remote.uri>http://192.19.106.168:8080/manager/text</cargo.remote.uri>
結(jié)果出錯(cuò):至今不知道問(wèn)題出在哪审丘,找了好久。勾给。滩报。。播急。脓钾。我在想是不是我的部署的項(xiàng)目太大了298M。但是部署到本地沒(méi)有問(wèn)題白可训??希望懂得可以幫我解答一下,出錯(cuò)提示如下握截,查了很久說(shuō)是權(quán)限飞崖,權(quán)限設(shè)置了manager-script,但是本地都可以,就是部署到遠(yuǎn)程不可以谨胞。固歪。。胯努。
[ERROR] Failed to execute goal org.codehaus.cargo:cargo-maven2-plugin:1.4.4:rede
ploy (default-cli) on project iqasweb: Execution default-cli of goal org.codehau
s.cargo:cargo-maven2-plugin:1.4.4:redeploy failed: Failed to redeploy [E:\Reposi
tory\iqasproject\iqasweb\target\iqasweb-remote.war]: The username you provided i
s not allowed to use the text-based Tomcat Manager (error 403): Server returned
HTTP response code: 403 for URL: http://172.19.201.155:8080/manager/text/list ->
留言
有什么不懂的一起探討一下吧牢裳,歡迎留下寶貴意見(jiàn),喜歡就點(diǎn)個(gè)贊吧(哈哈)叶沛,多謝鼓勵(lì)蒲讯。