Maven
學習目標:
- 能夠了解Maven的作用
- 能夠理解Maven倉庫的作用
- 能夠理解Maven的座標概念
- 能夠掌握Maven的安裝
- 能夠掌握IDEA配置本地Maven
- 能夠使用IDEA創建javase的Maven工程
- 能夠使用IDEA創建javaweb的Maven工程
- 能夠自定義javeweb的Maven工程
- 能夠掌握依賴引入的配置方式
- 能夠了解依賴範圍的概念
第1章 Maven概述
1.1 Maven的概念
Maven是項目進行模型抽象,充分運用的面向對象的思想,Maven可以通過一小段描述信息來管理項目的構建,報告和文檔的軟件項目管理工具。Maven 除了以程序構建能力爲特色之外,還提供高級項目管理工具。由於 Maven 的缺省構建規則有較高的可重用性,所以常常用兩三行 Maven 構建腳本就可以構建簡單的項目。
1.2 Maven的作用
-
maven對項目的第三方構件(jar包)進行統一管理。向工程中加入jar包不要手工從其它地方拷貝,通過maven定義jar包的座標,自動從maven倉庫中去下載到工程中。
-
maven提供一套對項目生命週期管理的標準,開發人員、和測試人員統一使用maven進行項目構建。項目生命週期管理:編譯、測試、打包、部署、運行。
-
maven對工程分模塊構建,提高開發效率。
1.3 Maven的概念模型
- 項目對象模型 (Project Object Model)。POM對象模型,每個maven工程中都有一個pom.xml文件,定義工程所依賴的jar包、本工程的座標、打包運行方式。
- 依賴管理系統(基礎核心 )。maven通過座標對項目工程所依賴的jar包統一規範管理。
- maven 管理項目生命週期過程都是基於插件完成的,例如:開發中使用的tomcat插件。
1.4 Maven的倉庫
倉庫名稱 | 作用 |
---|---|
本地倉庫 | 相當於緩存,工程第一次會從遠程倉庫(互聯網)去下載jar 包,將jar包存在本地倉庫(在程序員的電腦上)。第二次不需要從遠程倉庫去下載。先從本地倉庫找,如果找不到纔會去遠程倉庫找。 |
中央倉庫 | 就是遠程倉庫,倉庫中jar由專業團隊(maven團隊)統一維護。中央倉庫的地址:http://repo1.maven.org/maven2/ |
遠程倉庫 | 在公司內部架設一臺私服,其它公司架設一臺倉庫,對外公開。 |
1.5 Maven的座標
Maven的一個核心的作用就是管理項目的依賴,引入我們所需的各種jar包等。爲了能自動化的解析任何一個Java構件,Maven必須將這些Jar包或者其他資源進行唯一標識,這是管理項目的依賴的基礎,也就是我們要說的座標。包括我們自己開發的項目,也是要通過座標進行唯一標識的,這樣才能才其它項目中進行依賴引用。座標的定義元素如下:
- groupId:定義當前Maven項目名稱
- artifactId:定義項目模塊
- version:定義當前項目的當前版本
例如:要引入junit的測試jar,只需要在pom.xml配置文件中配置引入junit的座標即可:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
第2章 Maven的安裝
2.1 下載Maven
下載之前看看你的idea默認支持的是哪個版本,然後下載對應版本,否則可能因爲版本問題不兼容,運行報錯
2.2 安裝Maven
將Maven壓縮包解壓,即安裝完畢
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-bPudjWst-1577977226865)(image\4.png)]
2.3 Maven目錄介紹
2.4 配置環境變量
2.5 配置本地倉庫
2.5.1 將軟件文件夾中的Repository解壓
2.5.2 配置本地倉庫
在maven的安裝目錄中conf/ settings.xml文件,在這裏配置本地倉庫
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>E:\Tomcat\apache-maven-3.3.9\repository</localRepository>
2.6 測試Maven安裝成功
打開cmd本地控制檯,輸入mvn -version
第3章 IDEA創建Maven工程
3.1 IDEA指定本地Maven
3.2 創建java工程 -DarchetypeCatalog=local
3.2.1 創建java工程
3.2.2 java工程目錄結構
3.2.3 編寫Hello World!
3.3 創建javaweb工程
3.3.1 創建javaweb工程
- 創建javaweb工程與創建javase工程類似,但在選擇Maven骨架時,選擇maven-archetype-webapp即可:
- 創建好的javaweb工程如下:
- 所以,要手動創建一個java目錄用於編寫java代碼:
- 還要將java目錄添加爲Source Root:
3.3.2 發佈javaweb工程
3.3.3 瀏覽器訪問效果
3.3.4 Maven創建javaweb工程的目錄結構
第4章 創建自定義JavaWeb工程
第3章中,在創建javaweb工程時,使用的是maven-archetype-webapp骨架,如果不使用骨架,怎樣創建一個javaweb工程呢,見下面的講解:
- 創建一個Maven工程,不選擇任何骨架
- 填寫座標信息
- 創建web工程信息
- 創建好的javaweb工程的目錄結構如下
第5章 Maven的常用命令
5.1 clean命令
清除編譯產生的target文件夾內容,可以配合相應命令一起使用,如mvn clean package, mvn clean test
5.2 complie命令
該命令可以對src/main/java目錄的下的代碼進行編譯
5.3 test命令
測試命令,或執行src/test/java/下junit的測試用例
- 在src/test/java下創建測試類DemoTest
- 執行test命令測試
- 控制檯顯示測試結果
5.4 package命令
mvn package,打包項目
打包後的項目會在target目錄下找到
5.5 install命令
mvn install,打包後將其安裝在本地倉庫
安裝完畢後,在本地倉庫中可以找到itheima_javase_demo的信息
第6章 依賴管理
6.1 Maven插件
Maven是一個核心引擎,提供了基本的項目處理能力和建設過程的管理,以及一系列的插件是用來執行實際建設任務。maven插件可以完成一些特定的功能。例如,集成jdk插件可以方便的修改項目的編譯環境;集成tomcat插件後,無需安裝tomcat服務器就可以運行tomcat進行項目的發佈與測試。在pom.xml中通過plugin標籤引入maven的功能插件。
6.1.1 JDK編譯版本的插件
<!-- jdk版本插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
6.1.2 Tomcat7服務端的插件
- 配置tomcat7插件
<!-- tomcat7插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8080</port>
<server>tomcat7</server>
</configuration>
</plugin>
- 運行tomcat7插件
-
tomcat插件注意問題
Maven的中央倉庫中只有Tomcat7.X版本的插件,而之前我們使用的是8.X的版本,如果想使用Tomcat8.X的插件可以去其他第三方倉庫進行尋找,或者使用IDEA集成外部Tomcat8極其以上版本,進行項目的發佈。
6.2 導入依賴
導入依賴座標,無需手動導入jar包就可以引入jar。在pom.xml中使用標籤引入依賴。
6.2.1 導入junit的依賴
- 導入junit座標依賴
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
- 進行單元測試
import org.junit.Test;
public class DemoTest {
@Test
public void test1(){
System.out.println("test running...");
}
}
6.2.2 導入servlet的依賴
- 創建Servlet,但是發現報錯,原因是沒有導入Servlet的座標依賴
- 導入Servlet的座標依賴
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
- 原有報錯的Servlet恢復正常
6.3 依賴範圍
-
compile 編譯、測試、運行,A在編譯時依賴B,並且在測試和運行時也依賴
例如:strus-core、spring-beans。打到war包或jar包
-
provided 編譯、和測試有效,A在編譯和測試時需要B
例如:servlet-api就是編譯和測試有用,在運行時不用(tomcat容器已提供)
不會打到war
-
runtime:測試、運行有效
例如:jdbc驅動包 ,在開發代碼中針對java的jdbc接口開發,編譯不用
在運行和測試時需要通過jdbc驅動包(mysql驅動)連接數據庫,需要的
會打到war
-
test:只是測試有效,只在單元測試類中用
例如:junit
不會打到war
-
按照依賴強度,由強到弱來排序:(理解)
compile> provided> runtime> test
第7章 Maven案例:使用Maven搭建Servlet+JSP+jdbcTemplate
項目
7.1 需求分析
完成添加客戶信息的操作
7.2 創建數據表
7.3 創建Maven項目
7.4 導入座標
7.4.1 導入所需的依賴(jar包)和插件
- mysql驅動程序
- jdbctemplate
- servlet-api (Servlet的API)
- jsp-api (可以是EL表達式)
7.4.2 maven座標
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.itcat</groupId>
<artifactId>maven_test</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>maven_test Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<!--mysql驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
<!--druid連接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<!--servlet的api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp的api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- jstl的依賴-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- beanUtils工具類 -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
<!-- jdbctemplate-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
</dependencies>
<!-- 配置插件 -->
<build>
<plugins>
<!-- jdk版本插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
7.4.3 編寫代碼
7.4.3.1 頁面編寫
- 表單頁面
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="ctx" value="${pageContext.request.contextPath}"></c:set>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>客戶錄入頁面</title>
</head>
<body>
<form action="${ctx}/add" method="post">
客戶名稱:<input type="text" name="custName"/><br/>
客戶來源:<input type="text" name="custSource"/><br/>
客戶級別:<input type="text" name="custLevel"/><br/>
客戶行業:<input type="text" name="custIndustry"/><br/>
客戶地址:<input type="text" name="custAddress"/><br/>
客戶電話:<input type="text" name="custPhone"/><br/>
<input type="submit" value="保存"/><br/>
</form>
</body>
</html>
- 添加成功頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>save success!!!</h1>
</body>
</html>
7.4.3.2 編寫實體類
package com.itheima.maven.domain;
import java.io.Serializable;
public class Customer implements Serializable {
private Long custId;
private String custName;
private String custSource;
private String custLevel;
private String custIndustry;
private String custAddress;
private String custPhone;
public Long getCustId() {
return custId;
}
public void setCustId(Long custId) {
this.custId = custId;
}
public String getCustName() {
return custName;
}
public void setCustName(String custName) {
this.custName = custName;
}
public String getCustSource() {
return custSource;
}
public void setCustSource(String custSource) {
this.custSource = custSource;
}
public String getCustLevel() {
return custLevel;
}
public void setCustLevel(String custLevel) {
this.custLevel = custLevel;
}
public String getCustIndustry() {
return custIndustry;
}
public void setCustIndustry(String custIndustry) {
this.custIndustry = custIndustry;
}
public String getCustAddress() {
return custAddress;
}
public void setCustAddress(String custAddress) {
this.custAddress = custAddress;
}
public String getCustPhone() {
return custPhone;
}
public void setCustPhone(String custPhone) {
this.custPhone = custPhone;
}
}
7.4.3.3 Servlet編寫
package com.itheima.maven.web;
import com.itheima.maven.domain.Customer;
import com.itheima.maven.service.CustomerService;
import com.itheima.maven.service.impl.CustomerServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/SaveCustomer")
public class SaveCustomerServlet extends HttpServlet {
private CustomerService customerService = new CustomerServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收參數
req.setCharacterEncoding("utf-8");
String custName = req.getParameter("custName");
String custSource = req.getParameter("custSource");
String custLevel = req.getParameter("custLevel");
String custIndustry = req.getParameter("custIndustry");
String custPhone = req.getParameter("custPhone");
//封裝數據
Customer customer = new Customer();
customer.setCustName(custName);
customer.setCustIndustry(custIndustry);
customer.setCustPhone(custPhone);
customer.setCustLevel(custLevel);
customer.setCustSource(custSource);
//調用業務
customerService.save(customer);
//重定向
resp.sendRedirect(req.getContextPath()+"/success.jsp");
}
}
7.4.3.4 Service編寫
- 接口編寫
package com.itheima.maven.service;
import com.itheima.maven.domain.Customer;
public interface CustomerService {
public void save(Customer customer);
}
- 實現編寫
package com.itheima.maven.service.impl;
import com.itheima.maven.dao.CustomerDao;
import com.itheima.maven.dao.impl.CustomerDaoImpl;
import com.itheima.maven.domain.Customer;
import com.itheima.maven.service.CustomerService;
public class CustomerServiceImpl implements CustomerService{
private CustomerDao customerDao = new CustomerDaoImpl();
@Override
public void save(Customer customer) {
customerDao.save(customer);
}
}
7.4.3.5 Dao編寫
- 接口編寫
package com.itheima.maven.dao;
import com.itheima.maven.domain.Customer;
public interface CustomerDao {
void save(Customer customer);
}
- 實現編寫
package com.itheima.maven.dao.impl;
import com.itheima.maven.dao.CustomerDao;
import com.itheima.maven.domain.Customer;
import com.itheima.maven.utils.JdbcUtils;
import org.springframework.jdbc.core.JdbcTemplate;
public class CustomerDaoImpl implements CustomerDao {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JdbcUtils.getDataSource());
@Override
public void save(Customer customer) {
String sql = "insert into cst_customer(cust_name,cust_source,cust_industry,cust_level,cust_phone) " +
"values(?,?,?,?,?)";
//執行查詢操作
jdbcTemplate.update(
sql,
customer.getCustName(),
customer.getCustSource(),
customer.getCustIndustry(),
customer.getCustLevel(),
customer.getCustPhone());
}
}
- JdbcUtils工具
package com.itheima.maven.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/*
1. 聲明靜態數據源成員變量
2. 創建連接池對象
3. 定義公有的得到數據源的方法
4. 定義得到連接對象的方法
5. 定義關閉資源的方法
*/
public class JdbcUtils {
// 1. 聲明靜態數據源成員變量
private static DataSource ds;
// 2. 創建連接池對象
static {
// 加載配置文件中的數據
InputStream is = JdbcUtils.class.getResourceAsStream("/druid.properties");
Properties pp = new Properties();
try {
pp.load(is);
// 創建連接池,使用配置文件中的參數
ds = DruidDataSourceFactory.createDataSource(pp);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// 3. 定義公有的得到數據源的方法
public static DataSource getDataSource() {
return ds;
}
// 4. 定義得到連接對象的方法
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
// 5.定義關閉資源的方法
public static void close(Connection conn, Statement stmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {}
}
}
// 6.重載關閉方法
public static void close(Connection conn, Statement stmt) {
close(conn, stmt, null);
}
}
- druid.properties配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/maven
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000
maxIdle=6
minIdle=3
7.5 啓動IDEA集成的Tomcat 測試
第八章 自定義骨架
-
archetype:create-from-project 創建骨架來自工程
-
install 安裝到本地倉庫
-
archetype:crawl 抓取本地倉庫骨架
<plugin> <artifactId>maven-archetype-plugin</artifactId> <version>3.0.0</version> </plugin>
建立好模板(所有目錄不能爲空,pom.xml里加上上面的配置)
編譯:
命令1: archetype:create-from-project
選好路徑,粘貼命令
安裝到本地倉庫,路徑選到target下的archetype目錄
本地目錄下查找:
到本地倉庫抓取骨架:archetype:crawl
執行命令即可,此命令與路徑無關
新建自定義maven骨架(模板)
根據本地倉庫下的myarchetypewebapp-archetype-1.0.pom文件填寫信息
利用模板新建項目test
最好斷網(1.0模板不斷網也行)
模板有的全自動有了 以後再也不用慢慢建立包結構 設置藍設置綠了
刪除失敗骨架
刪除重啓