maven

Maven

學習目標:

  1. 能夠了解Maven的作用
  2. 能夠理解Maven倉庫的作用
  3. 能夠理解Maven的座標概念
  4. 能夠掌握Maven的安裝
  5. 能夠掌握IDEA配置本地Maven
  6. 能夠使用IDEA創建javase的Maven工程
  7. 能夠使用IDEA創建javaweb的Maven工程
  8. 能夠自定義javeweb的Maven工程
  9. 能夠掌握依賴引入的配置方式
  10. 能夠了解依賴範圍的概念

第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\color{#FF0000}{maven定義一套項目生命週期。清理、初始化、編譯、測試、報告 、打包、部署、站點生成。}
  • maven\color{#FF0000}{一組標準集合。maven工程有自己標準的工程目錄結構、定義座標有標準。}
  • 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模板不斷網也行)

在這裏插入圖片描述

模板有的全自動有了 以後再也不用慢慢建立包結構 設置藍設置綠了

刪除失敗骨架

在這裏插入圖片描述

在這裏插入圖片描述

刪除重啓

發佈了388 篇原創文章 · 獲贊 89 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章