第十章 XML与Maven依赖管理 v1.0
第一部分 XML
XML(可扩展标记语言,eXtensible Markup Language),是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据,经常被当成消息进行网络传输,或者作为配置文件用于存储系统的信息。
一、XML
1.XML特点
- 纯文本,默认使用UTF-8编码,文件后缀为
.xml - 可嵌套
2.XML语法规则
a.文档声明
文档声明必须是第一行,version表示版本号(必须存在),conding表示文件编码
<?xml version="1.0" enconding="UTF-8" ?>b.标签(元素)
- 标签由一对尖括号和合法标识符组成:
<name></name>,必须存在一个根标签, 有且只能有一个。 - 标签必须成对出现,又开始有结束;特殊标签可以不成对,但必须有结束标记,如:
<br/> - 标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来
<student id="1"></student>
c.其他组成
- 注释:用
<!-- 注释 -->表示 - 特殊字符
[特殊字符表示]
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 双引号
- 数据区
<![CDATA[
此处可以写任意字符,会自动解析,不会造成冲突
]]>3.DTD约束
特点:可以约束XML文件的编写,但不能约束具体的数据类型,文档后缀名为.dtd
引入DTD约束:<!DOCTYPE 约束名 SYSTEM "文件名.dtd">
4.schema约束
特点:可以约束XML文件的编写,也能约束具体的数据类型,文档后缀名为.xsd
引schema约束:<根元素 xsi:schemaLocation="命名空间(targetNamespace) 文件名">
二、XML解析
使用程序读取XML中的数据,有SAX解析和DOM解析两种方式
1.DOM解析常用工具
- JAXP:SUN公司提供的一套XML的解析的API
- JDOM:开源项目,它基于树型结构,利用纯JAVA技术对XML文档实现解析、生成、序列化以及多种操作
- dom4j:JDOM升级品,具有性能优异、功能强大和极其易使用的特点
- 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相关方法
selectSingleNode(String expression):获取符合表达式的唯一元素selectNodes(String expression):获取符合表达式的元素集合
2.XPath相关路径表示
- 绝对路径:从根元素开始,一级一级向下进行查找,不能跨级
示例:/根元素/子元素/孙元素/...
- 相对路径:从当前元素开始一级一级乡下查找,不能跨级
示例:./子元素/孙元素/...
- 全文搜索:通过全文搜索元素
示例1://contact:查找contact元素,无论元素在哪
示例2://contact/name:查找contact元素,无论元素在哪,但name是contact的子节点
示例3://contact//name:查找contact元素,无论元素在哪,但name是contact的子孙节点
- 属性查找:在全文中搜索属性,或带属性的元素
示例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>标签标记。
<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,如下表所示:
<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.声明形式
<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会运行
运行生命周期:
- cmd命令:
mvn 命令 - IDEA:Maven模块->Lifecycle(生命周期)->选中相应选项
三、安装流程
1.下载Maven
2.配置本地仓库并使用Maven阿里云镜像
方法:
- 方法1:进入用户主目录(User)/.m2->创建settings.xml配置文件
- 方法2:通过IntelliJ IEDA->在
pom.xml文件中右键->Maven->Create/Open settings.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>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.父工程
<groupId>asia.hymsk</groupId>
<artifactId>project-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<package>pom</package>c.子工程
<!--自动继承父工程的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>来统一管理依赖版本
<dependencyManagement><!--仅管理依赖版本而不直接引入依赖-->
<dependencies>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version><!--指定依赖版本-->
</dependency>
</dependencies>
</dependencyManagement>在父工程通过<dependencyManagement>指定依赖版本后,子工程引入依赖时无需引入<version>属性
5.自定义属性与应用属性
<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>设置当前聚合工程所包含的子模块名称
<modules>
<module>../project-son</module>
<module>../project-son-second</module>
</modules>四、私服
1.概念
私服是一种特殊的架设在局域网内的远程仓库,用来代理外部的中央仓库,解决团队的资源共享与资源同步问题。
2.查找顺序
- 本地仓库
- 私服
- 中央仓库
3.私服的配置(拓展)
访问私服:http://<私服IP>:8081
访问密码:admin/admin
使用私服,需要在maven的settings.xml配置文件中,做如下配置:
- 需要在 servers 标签中,配置访问私服的个人凭证(访问的用户名和密码)
<server>
<id>maven-releases</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>maven-snapshots</id>
<username>admin</username>
<password>admin</password>
</server>- 在 mirrors 中只配置我们自己私服的连接地址(如果之前配置过阿里云,需要替换掉)
<mirror>
<id>maven-public</id>
<mirrorOf>*</mirrorOf>
<url>http://<私服IP>:8081/repository/maven-public/</url>
</mirror>- 需要在 profiles 中,增加如下配置,来指定snapshot快照版本的依赖,依然允许使用
<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>- 若要上传自己的项目到私服上,需要在项目的pom.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>- 发布项目,直接运行 deploy 生命周期即可(发布时,建议跳过单元测试)
4.启动本地私服(拓展)
- 解压: apache-maven-nexus.zip (文件:)
- 进入目录: apache-maven-nexus\nexus-3.39.0-01\bin
- 启动服务:双击 start.bat
- 访问服务:localhost:8081
- 私服配置说明:将上述配置私服信息的 <私服IP> 改为 localhost
第五部分 常用依赖
一些常用的Maven依赖,方便快速复制使用~
[Spring相关依赖]
<!-- 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>[数据库与持久层依赖]
<!-- 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相关依赖]
<!-- 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>[工具类依赖]
<!-- 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>