Skip to content

第十章 XML与Maven依赖管理 v1.0 ​

第一部分 XML ​

XML(可扩展标记语言,eXtensible Markup Language),是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据,经常被当成消息进行网络传输,或者作为配置文件用于存储系统的信息。

一、XML ​

1.XML特点 ​

  • 纯文本,默认使用UTF-8编码,文件后缀为.xml
  • 可嵌套

2.XML语法规则 ​

a.文档声明 ​

文档声明必须是第一行,version表示版本号(必须存在),conding表示文件编码

xml
<?xml version="1.0" enconding="UTF-8" ?>
b.标签(元素) ​
  1. 标签由一对尖括号和合法标识符组成:<name></name>,必须存在一个根标签, 有且只能有一个。
  2. 标签必须成对出现,又开始有结束;特殊标签可以不成对,但必须有结束标记,如:<br/>
  3. 标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来<student id="1"></student>
c.其他组成 ​
  1. 注释:用<!-- 注释 -->表示
  2. 特殊字符
[特殊字符表示]

&lt; < 小于

&gt; > 大于

&amp; & 和号

&apos; ' 单引号

&quot; " 双引号

  1. 数据区
xml
<![CDATA[
	此处可以写任意字符,会自动解析,不会造成冲突
]]>

3.DTD约束 ​

特点:可以约束XML文件的编写,但不能约束具体的数据类型,文档后缀名为.dtd

引入DTD约束:<!DOCTYPE 约束名 SYSTEM "文件名.dtd">

4.schema约束 ​

特点:可以约束XML文件的编写,也能约束具体的数据类型,文档后缀名为.xsd

引schema约束:<根元素 xsi:schemaLocation="命名空间(targetNamespace) 文件名">​

二、XML解析 ​

使用程序读取XML中的数据,有SAX解析和DOM解析两种方式

1.DOM解析常用工具 ​

  1. JAXP:SUN公司提供的一套XML的解析的API
  2. JDOM:开源项目,它基于树型结构,利用纯JAVA技术对XML文档实现解析、生成、序列化以及多种操作
  3. dom4j:JDOM升级品,具有性能优异、功能强大和极其易使用的特点
  4. jsoup:功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便

2.相关对象 ​

  • Document对象:整个XML文档对象
  • Element对象:标签
  • Attribute对象:属性
  • Text对象:文本内容

3.Dom4j ​

a.SAXReader类 ​

构造函数:SAXReader():创建一个Dom4j解析器对象

常用方法:read(String path):加载XML文件为,Document对象

b.Document类 ​

常用方法:getRootElement():获得根元素对象(Element)

c.Element常用方法 ​

常用方法:getName():获得元素对象的名称

三、XPath ​

依赖于Dom4j,进一步分析Document类对象进行进一步解析

1.Document类XPath相关方法 ​

  1. selectSingleNode(String expression):获取符合表达式的唯一元素
  2. selectNodes(String expression):获取符合表达式的元素集合

2.XPath相关路径表示 ​

  1. 绝对路径:从根元素开始,一级一级向下进行查找,不能跨级

示例:/根元素/子元素/孙元素/...

  1. 相对路径:从当前元素开始一级一级乡下查找,不能跨级

示例:./子元素/孙元素/...

  1. 全文搜索:通过全文搜索元素

示例1://contact:查找contact元素,无论元素在哪

示例2://contact/name:查找contact元素,无论元素在哪,但name是contact的子节点

示例3://contact//name:查找contact元素,无论元素在哪,但name是contact的子孙节点

  1. 属性查找:在全文中搜索属性,或带属性的元素

示例1://@属性名:查找属性对象,只要元素中有这个属性即可

示例2://元素[@属性名]:查找元素对象,全文搜索指定元素名和属性名

示例3://元素//[@属性名='值']:查找元素对象,全文搜索指定元素名和属性名,并且属性值相等

第二部分 Maven简介 ​

一、主要作用 ​

Maven是专门为Java项目打造的管理和构建工具,主要作用有:

  • 提供了一套标准化的项目结构(Eclipse、IDEA等通用)
  • 提供了一套标准化的构建流程(编译,测试,打包,发布……)
  • 提供了一套依赖管理机制

二、项目结构 ​

如右图,这些就是一个Maven项目的标准目录结构:

项目的根目录a-maven-project是项目名,

有一个根目录下的项目配置描述文件pom.xml,

存放Java源码的目录是src/main/java,

存放资源文件的目录是src/main/resources,

存放测试源码的目录是src/test/java,

存放测试资源的目录是src/test/resources,

最后,所有编译、打包生成的文件都放在target目录里。

三、搜索项目依赖文件 ​

搜索第三方组件,确切地获得groupId、artifactId和version的方法:

通过 search.maven.org 搜索关键字,找到对应的组件后,直接复制

更多网站:mvnrepository

第三部分 Maven的使用 ​

一、依赖关系 ​

Maven中依赖具有传递性

直接依赖:在当前项目中通过依赖配置建立的依赖关系

间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

a.排除依赖 ​

排除依赖指主动断开依赖的资源,被排除的资源无需指定版本,使用<exclusion>标签标记。

xml
<dependency>
  <groupId>com.itheima</groupId>
  <artifactId>maven-projectB</artifactId>
  <version>1.0-SNAPSHOT</version>
  <exclusions>
    <exclusion>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </exclusion>
  </exclusions>
</dependency>
b.依赖范围 ​

依赖的jar包,默认情况下,可以在任何地方使用。可以通过<scope>标签设置其作用范围。

Maven定义了几种依赖关系,分别是compile、test、runtime和provided,如下表所示:

xml
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.10</version>
  <scope>test</scope>
</dependency>

二、项目描述文件(pom.xml) ​

在Maven中使用项目描述文件(pom.xml)来描述依赖关系进行依赖管理。

1.声明位置 ​

Maven项目的所有依赖都在<dependencies></dependencies>之间声明

2.声明形式 ​

xml
<dependency>
  <groupId>组织名</groupId>
  <artifactId>包名</artifactId>
  <version>版本号</version>
</dependency>

3.唯一ID ​

对于某个依赖,Maven只需要如下3个变量即可唯一确定某个jar包:

  • groupId:属于组织的名称,类似Java的包名
  • artifactId:该jar包自身的名称,类似Java的类名
  • version:该jar包的版本

4.生命周期 ​

a.三套相互独立的生命周期 ​
  • clean:清理工作
  • default:核心工作,如:编译、测试、打包、安装、部署等。
  • site:生成报告、发布站点等。
b.生命周期阶段 ​

每套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。

c.核心生命周期阶段 ​

clean:移除上一次构建生成的文件

compile:编译项目源代码

test:使用合适的单元测试框架运行测试(junit)

package:将编译后的文件打包,如:jar、 war等

install:安装项目到本地仓库

d.生命周期阶段的运行 ​

在同一套生命周期中,当运行后面的阶段时,前面的阶段都会运行。

例:package运行clean并不会运行,但complie、test会运行

运行生命周期:

  1. cmd命令:mvn 命令
  2. IDEA:Maven模块->Lifecycle(生命周期)->选中相应选项

三、安装流程 ​

1.下载Maven ​

2.配置本地仓库并使用Maven阿里云镜像 ​

方法:

  • 方法1:进入用户主目录(User)/.m2->创建settings.xml配置文件
  • 方法2:通过IntelliJ IEDA->在pom.xml文件中右键->Maven->Create/Open settings.xml
xml
<!--配置本地仓库-->
<localRepository>本地存放路径</localRepository>

<!--配置阿里云镜像-->
<settings>
    <mirrors>
        <mirror>
          <id>alimaven</id>
          <name>阿里云公共仓库</name>
          <url>https://maven.aliyun.com/nexus/content/groups/public/</url>
          <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>
</settings>

详见:阿里云云效 Maven 中央代理仓库配置指南

3.配置环境变量 ​

配置MAVEN_ HOME为maven的解压目录,并将其bin目录加入PATH环境变量

即:MAVEN_HOME:Maven安装目录,Path中加入%MAVEN_PATH%\bin

四、导入Maven工程(IEDA) ​

1.方式1 ​

打开IDEA,选择右侧Maven面板,点击"+"号,选中对应项目的pom.xml文件,双击即可

2.方式2 ​

打开IDEA->File->项目结构->Modules->Import Module->选中对应项目的pom.xml文件->OK

第四部分 Maven高级 ​

一、分模块设计与开发 ​

1.概念 ​

将项目按照功能拆分成若干个子模块,方便项目的管理维护、扩展,也方便模块间的相互调用,资源共享

2.实现 ​

通过将模块拆分,通过Maven继承与聚合实现分模块的设计与开发

二、继承 ​

1.概念 ​

描述两个工程间的关系,与Maven中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承

注:Maven中继承与Java一样,都只能单继承,不能多继承;若父子工程依赖版本不同,以子工程为准

2.作用 ​

简化依赖配置、统一管理依赖

3.实现 ​

创建父工程,设置打包方式为pom(Maven默认打包方式为jar)

a.打包方式 ​
  • jar:普通模块打包,SpringBoot项目基本都是jar包(内嵌tomcat运行)
  • war:普通web程序打包,需要部署在外部的tomcat服务器中运行
  • pom:父工程或聚合工程,该模块不书写代码,仅进行依赖管理
b.父工程 ​
xml
<groupId>asia.hymsk</groupId>
<artifactId>project-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<package>pom</package>
c.子工程 ​
xml
<!--自动继承父工程的groupId <groupId>asia.hymsk</groupId>-->
<artifactId>project-son</artifactId>
<version>1.0-SNAPSHOT</version>

<parent>
  <groupId>asia.hymsk</groupId>
  <artifactId>project-parent</artifactId>
  <version>1.0-SNAPSHOT</version>
  <relativePath>../project-parent/pom.xml</relativePath><!--父工程pom文件相对位置-->
</parent>

4.版本锁定 ​

在maven中,可以在父工程的pom文件中通过<dependencyManagement>来统一管理依赖版本

xml
<dependencyManagement><!--仅管理依赖版本而不直接引入依赖-->
  <dependencies>
    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.9.1</version><!--指定依赖版本-->
    </dependency>
  </dependencies>
</dependencyManagement>

在父工程通过<dependencyManagement>指定依赖版本后,子工程引入依赖时无需引入<version>属性

5.自定义属性与应用属性 ​

xml
<properties>
  <lombok.version>1.18.24</lombok.version><!--指定自定义属性:lombok.version-->
</properties>

<dependencies>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok.version}</version><!--使用自定义属性:lombok.version-->
  </dependency>
</dependencies>

三、聚合 ​

1.概念 ​

将多个模块组织成一个整体,同时进行项目的构建,需要一个不具有业务功能的“空”工程(继承中的父工程)

2.实现 ​

maven中可以通过<modules>设置当前聚合工程所包含的子模块名称

xml
<modules>
  <module>../project-son</module>
  <module>../project-son-second</module>
</modules>

四、私服 ​

1.概念 ​

私服是一种特殊的架设在局域网内的远程仓库,用来代理外部的中央仓库,解决团队的资源共享与资源同步问题。

2.查找顺序 ​

  1. 本地仓库
  2. 私服
  3. 中央仓库

3.私服的配置(拓展) ​

访问私服:http://<私服IP>:8081

访问密码:admin/admin

使用私服,需要在maven的settings.xml配置文件中,做如下配置:

  1. 需要在 servers 标签中,配置访问私服的个人凭证(访问的用户名和密码)
xml
<server>
    <id>maven-releases</id>
    <username>admin</username>
    <password>admin</password>
</server>
    
<server>
    <id>maven-snapshots</id>
    <username>admin</username>
    <password>admin</password>
</server>
  1. 在 mirrors 中只配置我们自己私服的连接地址(如果之前配置过阿里云,需要替换掉)
xml
<mirror>
    <id>maven-public</id>
    <mirrorOf>*</mirrorOf>
    <url>http://<私服IP>:8081/repository/maven-public/</url>
</mirror>
  1. 需要在 profiles 中,增加如下配置,来指定snapshot快照版本的依赖,依然允许使用
xml
<profile>
    <id>allow-snapshots</id>
        <activation>
        	<activeByDefault>true</activeByDefault>
        </activation>
    <repositories>
        <repository>
            <id>maven-public</id>
            <url>http://<私服IP>:8081/repository/maven-public/</url>
            <releases>
            	<enabled>true</enabled>
            </releases>
            <snapshots>
            	<enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>
  1. 若要上传自己的项目到私服上,需要在项目的pom.xml文件中,增加配置,配置项目发布的地址(私服地址)
xml
<distributionManagement>
    <!-- release版本的发布地址 -->
    <repository>
        <id>maven-releases</id>
        <url>http://<私服IP>:8081/repository/maven-releases/</url>
    </repository>
    
    <!-- snapshot版本的发布地址 -->
    <snapshotRepository>
        <id>maven-snapshots</id>
        <url>http://<私服IP>:8081/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>
  1. 发布项目,直接运行 deploy 生命周期即可(发布时,建议跳过单元测试)

4.启动本地私服(拓展) ​

  1. 解压: apache-maven-nexus.zip (文件:)
  2. 进入目录: apache-maven-nexus\nexus-3.39.0-01\bin
  3. 启动服务:双击 start.bat
  4. 访问服务:localhost:8081
  5. 私服配置说明:将上述配置私服信息的 <私服IP> 改为 localhost

第五部分 常用依赖 ​

一些常用的Maven依赖,方便快速复制使用~

[Spring相关依赖]
xml
<!-- Spring依赖 -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.10.RELEASE</version>
</dependency>

<!-- Spring-jdbc整合 -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>5.2.10.RELEASE</version>
</dependency>

<!-- Spring-Mybatis整合 -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>1.3.0</version>
</dependency>

<!-- Spring-Junit整合 -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>5.2.10.RELEASE</version>
</dependency>

<!-- SpringMVC依赖 -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.2.10.RELEASE</version>
</dependency>
[数据库与持久层依赖]
xml
<!-- mybatis依赖 -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.6</version>
</dependency>

<!-- 德鲁伊连接池依赖 -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.16</version>
</dependency>

<!-- jdbc依赖 -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.48</version>
</dependency>
[Web相关依赖]
xml
<!-- jsp依赖 -->
<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.2</version>
  <scope>provided</scope>
</dependency>

<!-- servlet依赖 -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
  <!-- 解决Servlet依赖与Tomcat之间的冲突 -->
  <scope>provided</scope>
</dependency>

<!-- jstl -->
<dependency>
  <groupId>jstl</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>

<!--      Tomcat7插件      -->
<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <!-- 解决get中文乱码 -->
        <uriEncoding>UTF-8</uriEncoding>
        <port>8080</port>
        <path>/</path>
    </configuration>
</plugin>
[工具类依赖]
xml
<!-- junit单元测试 -->
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>

<!-- logback日志依赖 -->
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.2.3</version>
</dependency>

<!-- 用于操作实体类 -->
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.20</version>
</dependency>

<!-- 用于Java对象和JSON互相转化 -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.76</version>
</dependency>

<!-- jackson依赖 -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.0</version>
</dependency>

<!-- 用于简化流的相关操作 -->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-io</artifactId>
  <version>1.3.2</version>
</dependency>

<!--  用于简化分页操作 -->
<dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper</artifactId>
  <version>5.1.2</version>
</dependency>