我們可以在cmd 中通過(guò)一系列的 maven 命令來(lái)對(duì)我們的 maven-helloworld 工程進(jìn)行編譯弟胀、測(cè)試些侍、運(yùn)行渡贾、打包誓焦、安裝颠焦、部署。
1. compile
compile 是 maven 工程的編譯命令撰糠,作用是將 src/main/java 下的文件編譯為 class 文件輸出到 target目錄下饥悴。
cmd 進(jìn)入命令狀態(tài),執(zhí)行mvn compile烤镐,如下圖提示成功:
2. test
test 是 maven 工程的測(cè)試命令 mvn test蛋济,會(huì)執(zhí)行src/test/java下的單元測(cè)試類。
cmd 執(zhí)行 mvn test 執(zhí)行 src/test/java 下單元測(cè)試類炮叶,下圖為測(cè)試結(jié)果碗旅,運(yùn)行 1 個(gè)測(cè)試用例,全部成功镜悉。
3. clean
clean 是 maven 工程的清理命令祟辟,執(zhí)行 clean 會(huì)刪除 target 目錄及內(nèi)容。
4. package
package 是 maven 工程的打包命令侣肄,對(duì)于 java 工程執(zhí)行 package 打成 jar 包旧困,對(duì)于web 工程打成war包。
5. install
install 是 maven 工程的安裝命令稼锅,執(zhí)行 install 將 maven 打成 jar 包或 war 包發(fā)布到本地倉(cāng)庫(kù)吼具。
當(dāng)后面的命令執(zhí)行時(shí),前面的操作過(guò)程也都會(huì)自動(dòng)執(zhí)行
Maven 指令的生命周期
maven 對(duì)項(xiàng)目構(gòu)建過(guò)程分為三套相互獨(dú)立的生命周期矩距,請(qǐng)注意這里說(shuō)的是“三套”拗盒,而且“相互獨(dú)立”,
這三套生命周期分別是:
Clean Lifecycle 在進(jìn)行真正的構(gòu)建之前進(jìn)行一些清理工作锥债。
Default Lifecycle 構(gòu)建的核心部分陡蝇,編譯,測(cè)試哮肚,打包登夫,部署等等。
Site Lifecycle 生成項(xiàng)目報(bào)告允趟,站點(diǎn)悼嫉,發(fā)布站點(diǎn)。
maven的概念模型
Maven 包含了一個(gè)項(xiàng)目對(duì)象模型 (Project Object Model)拼窥,一組標(biāo)準(zhǔn)集合戏蔑,一個(gè)項(xiàng)目生命周期(Project Lifecycle),一個(gè)依賴管理系統(tǒng)(Dependency Management System)鲁纠,和用來(lái)運(yùn)行定義在生命周期階段(phase)中插件(plugin)目標(biāo)(goal)的邏輯总棵。
- 項(xiàng)目對(duì)象模型 (Project Object Model)
一個(gè) maven 工程都有一個(gè) pom.xml 文件,通過(guò) pom.xml 文件定義項(xiàng)目的坐標(biāo)改含、項(xiàng)目依賴情龄、項(xiàng)目信息、插件目標(biāo)等。 - 依賴管理系統(tǒng)(Dependency Management System)
通過(guò) maven 的依賴管理對(duì)項(xiàng)目所依賴的 jar 包進(jìn)行統(tǒng)一管理骤视。
比如:項(xiàng)目依賴 junit4.9鞍爱,通過(guò)在 pom.xml 中定義 junit4.9 的依賴即使用 junit4.9,如下所示是 junit4.9的依賴定義:
<!-- 依賴關(guān)系 -->
<dependencies>
<!-- 此項(xiàng)目運(yùn)行使用 junit专酗,所以此項(xiàng)目依賴 junit -->
<dependency>
<!-- junit 的項(xiàng)目名稱 -->
<groupId>junit</groupId>
<!-- junit 的模塊名稱 -->
<artifactId>junit</artifactId>
<!-- junit 版本 -->
<version>4.9</version>
<!-- 依賴范圍:?jiǎn)卧獪y(cè)試時(shí)使用 junit -->
<scope>test</scope>
</dependency>
</dependencies>
-
一個(gè)項(xiàng)目生命周期(Project Lifecycle)
使用 maven 完成項(xiàng)目的構(gòu)建睹逃,項(xiàng)目構(gòu)建包括:清理、編譯祷肯、測(cè)試沉填、部署等過(guò)程,maven 將這些過(guò)程規(guī)范為一個(gè)生命周期佑笋,如下所示是生命周期的各各階段:
maven 通過(guò)執(zhí)行一些簡(jiǎn)單命令即可實(shí)現(xiàn)上邊生命周期的各各過(guò)程翼闹,比如執(zhí)行 mvn compile 執(zhí)行編譯、執(zhí)行 mvn clean 執(zhí)行清理蒋纬。
一組標(biāo)準(zhǔn)集合
maven將整個(gè)項(xiàng)目管理過(guò)程定義一組標(biāo)準(zhǔn)猎荠,比如:通過(guò) maven 構(gòu)建工程有標(biāo)準(zhǔn)的目錄結(jié)構(gòu),有標(biāo)準(zhǔn)的生命周期階段蜀备、依賴管理有標(biāo)準(zhǔn)的坐標(biāo)定義等关摇。插件(plugin)目標(biāo)(goal)
maven 管理項(xiàng)目生命周期過(guò)程都是基于插件完成的。
IntelliJ IDEA開(kāi)發(fā)maven項(xiàng)目
File-->Settings配置maven
-DarchetypeCatalog=internal
創(chuàng)個(gè)建一個(gè)maven的web工程
選擇提供好的maven 的web工程模板
填寫項(xiàng)目信息
創(chuàng)建一個(gè) Servlet
有錯(cuò)誤琼掠,因?yàn)槲覀儧](méi)有導(dǎo)入servlet的依賴坐標(biāo)
package com.neuedu.servlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
request.getRequestDispatcher("/hello.jsp").forward(request, response);
}
}
在pom.xml 文件添加坐標(biāo):
添加 jar 包的坐標(biāo)時(shí),還可以指定這個(gè) jar 包將來(lái)的作用范圍停撞。
每個(gè) maven 工程都需要定義本工程的坐標(biāo)瓷蛙,坐標(biāo)是 maven 對(duì) jar 包的身份定義。
例如:
<!--項(xiàng)目名稱戈毒,定義為組織名+項(xiàng)目名艰猬,類似包名-->
<groupId>com.neuedu</groupId>
<!-- 模塊名稱 -->
<artifactId>hello_maven</artifactId>
<!-- 當(dāng)前項(xiàng)目版本號(hào),snapshot 為快照版本即非正式版本埋市,release為正式發(fā)布版本 -->
<version>1.0-SNAPSHOT</version>
<!--打包類型
jar:執(zhí)行 package 會(huì)打成 jar 包
war:執(zhí)行 package 會(huì)打成 war 包-->
<packaging>war</packaging>
<!--放置的都是項(xiàng)目運(yùn)行所依賴的jar包-->
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<!--作用域 provided編譯時(shí)起作用冠桃,運(yùn)行時(shí)不起作用-->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
坐標(biāo)的來(lái)源方式
依賴范圍
A 依賴 B,需要在 A 的 pom.xml 文件中添加 B 的坐標(biāo)道宅,添加坐標(biāo)時(shí)需要指定依賴范圍食听,依賴范圍包括:
- compile:編譯范圍,指 A在編譯時(shí)依賴 B污茵,此范圍為默認(rèn)依賴范圍樱报。編譯范圍的依賴會(huì)用在編譯、測(cè)試泞当、運(yùn)行迹蛤,由于運(yùn)行時(shí)需要所以編譯范圍的依賴會(huì)被打包。
- provided:provided 依賴只有在當(dāng) JDK 或者一個(gè)容器已提供該依賴之后才使用, provided 依賴在編譯和測(cè)試時(shí)需要盗飒,在運(yùn)行時(shí)不需要嚷量,比如:servlet api 被 tomcat 容器提供。
- runtime:runtime 依賴在運(yùn)行和測(cè)試系統(tǒng)的時(shí)候需要逆趣,但在編譯的時(shí)候不需要蝶溶。比如:jdbc的驅(qū)動(dòng)包。由于運(yùn)行時(shí)需要所以 runtime 范圍的依賴會(huì)被打包汗贫。
- test:test 范圍依賴 在編譯和運(yùn)行時(shí)都不需要身坐,它們只有在測(cè)試編譯和測(cè)試運(yùn)行階段可用,比如:junit落包。由于運(yùn)行時(shí)不需要所以test范圍依賴不會(huì)被打包部蛇。
-
system:system 范圍依賴與 provided 類似,但是你必須顯式的提供一個(gè)對(duì)于本地系統(tǒng)中 JAR文件的路徑咐蝇,需要指定 systemPath 磁盤路徑涯鲁,system依賴不推薦使用。
在 maven-web 工程中測(cè)試各各 scop有序。
測(cè)試總結(jié):
- 默認(rèn)引入 的 jar 包 ------- compile 【默認(rèn)范圍 可以不寫】(編譯抹腿、測(cè)試、運(yùn)行 都有效 )
- servlet-api 旭寿、jsp-api ------- provided (編譯警绩、測(cè)試 有效, 運(yùn)行時(shí)無(wú)效 防止和 tomcat 下 jar 沖突)
- jdbc 驅(qū)動(dòng) jar 包 ---- runtime (測(cè)試盅称、運(yùn)行 有效 )
- junit ----- test (測(cè)試有效)
依賴范圍由強(qiáng)到弱的順序是:compile>provided>runtime>test
項(xiàng)目中添加的坐標(biāo):
1肩祥、設(shè)置jdk編譯版本
使用 jdk1.8,需要設(shè)置編譯版本為 1.8缩膝,這里需要使用 maven 的插件來(lái)設(shè)置:在 pom.xml 中加入:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
jdk全局修改
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
創(chuàng)建普通Java工程
pom基本配置
pom.xml 是 Maven 項(xiàng)目的核心配置文件混狠,位于每個(gè)工程的根目錄,基本配置如下:
<project > :文件的根節(jié)點(diǎn) .
<modelversion > : pom.xml 使用的對(duì)象模型版本
<groupId > :項(xiàng)目名稱疾层,一般寫項(xiàng)目的域名
<artifactId > :模塊名稱将饺,子項(xiàng)目名或模塊名稱
<version > :產(chǎn)品的版本號(hào) .
<packaging > :打包類型,一般有 jar痛黎、war予弧、pom 等
<name > :項(xiàng)目的顯示名,常用于 Maven 生成的文檔湖饱。
<description > :項(xiàng)目描述桌肴,常用于 Maven 生成的文檔
<dependencies> :項(xiàng)目依賴構(gòu)件配置,配置項(xiàng)目依賴構(gòu)件的坐標(biāo)
<build> :項(xiàng)目構(gòu)建配置琉历,配置編譯坠七、運(yùn)行插件等水醋。