前言
随着前后端的分离,集成框架收到了大众的喜爱,像springboot,maven,gradle等,本章主要介绍了maven的框架的搭建,csdn所有文章最详细没有之一。
Maven简介
目前无论使用IDEA还是Eclipse等其他IDE,使用里面ANT工具。ANT工具帮助我们进行编译,打包运行等工作。
Apache基于ANT进行了升级,研发出了全新的自动化构建工具Maven。
Maven是Apache的一款开源的项目管理工具。以后无论是普通javase项目还是javaee项目,我们都创建的是Maven项目。
Maven使用项目对象模型(POM-Project Object Model,项目对象模型)的概念,可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
在Maven中每个项目都相当于是一个对象,对象(项目)和对象(项目)之间是有关系的。关系包含了:依赖、继承、聚合,实现Maven项目可以更加方便的实现导jar包、拆分项目等效果。
一、Maven的安装及整合
我们最常用的编译工具idea实际上自己整合了maven,我们在使用的时候,建议使用自定义的Maven,在后期的维护也比较方便
1. 下载Maven
2. Maven的目录结构
bin:存放的是执行文件,命令conf:存放的配置文件其中 settings.xml 是 maven的核心配置文件/全局配置文件
3. 更改仓库位置
Windows中在用户目录下会产生一个默认参考目录名为 .m2,这个目录默认在c盘的用户空间里面,后期很占空间,所以建议更换位置。
更换方式:
- 打开conf文件下的settings.xml文件,找到这一行。
- 直接添加如下代码:
<localRepository>D:/.m2/repository</localRepository>
- 添加后效果如图:
4. 环境配置
直接在系统环境变量的path里面加bin目录的路径即可
5. 启动测试
打开cmd,输入:
mvn
- 如果出现这样的界面,表示配置成功。
- 这个时候打开你的D盘,发现出现了一个新的文件夹.m2,包括里面的repository文件夹。
6. Maven整合到Idea
我们的开发工具是idea,必须把Maven工作环境整合到idea才能发挥其功能。
- 在Idea中通过 File -> Settings->Build,Execution,Deployment->Build Tools->Maven,找到Maven 并配置 Maven home directory 选项,配置成自己的Maven根目录
- 改好的配置如图所示:
二、Maven仓库的概念
Maven仓库是基于简单文件系统存储的,集中化管理Java API资源(构件)的一个服务。
仓库中的任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径。
得益于Maven 的坐标机制,任何 Maven项目使用任何一个构件的方式都是完全相同的。
Maven 可以在某个位置统一存储所有的 Maven 项目共享的构件,这个统一的位置就是仓库,项目构建完毕后生成的构件也可以安装或者部署到仓库中,供其它项目使用。
对于Maven来说,仓库分为两类:本地仓库和远程仓库。
1. 远程仓库
不在本机中的一切仓库,都是远程仓库:
分为中央仓库和本地私服仓库
远程仓库指通过各种协议如"file://"和"http://"访问的其它类型的仓库。
这些仓库可能是第三方搭建的真实的远程仓库,用来提供他们的构件下载(例如repo.maven.apache.org和uk.maven.org是Maven的中央仓库)。
其它“远程”仓库可能是你的公司拥有的建立在文件或HTTP服务器上的内部仓库(不是Apache的那个中央仓库,而是你们公司的私服,你们自己在局域网搭建的maven仓库),用来在开发团队间共享私有构件和管理发布的。
默认的远程仓库使用的是Apache提供的中央仓库
默认中央仓库
2. 本地仓库
本地仓库指本机的一份拷贝,用来缓存远程下载,包含你尚未发布的临时构件。即本地 .m2 目录
配置本地仓库
前面已经赘述过了
配置远程仓库
- 方法一: 配置远程仓库和本地仓库类似,同样是修改settings.xml文件,修改方式如下。
此种方式适用于本机所有Maven项目
优点:配置一次,可重复使用
缺点:如其他成员Maven中未配置此镜像,则仍会从默认中央仓库获取数据
- 方法二:在POM文件中配置远程程仓库
<repositories>
<repository>
<id>central</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public/</url>
<layout>default</layout>
<!-- 是否开启发布版构件下载 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否开启快照版构件下载 -->
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
此种方式只适用于当前Maven项目
优点:无论项目在哪里,都会按照配置好的镜像来拉取资源
缺点:每个项目都需要进行配置
3. 仓库优先级
4. 其他
配置JDK(非必须)
- 方法一:当你的idea中有多个jdk的时候,就需要指定你编译和运行的jdk:在settings.xml中配置
<profile>
<!-- settings.xml中的id不能随便起的 -->
<!-- 告诉maven我们用jdk1.8 -->
<id>jdk-1.8</id>
<!-- 开启JDK的使用 -->
<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>
配置的前提是你的idea中要有1.8的jdk
- 方法二: 也可以在POM文件中进行JDK版本声明
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
三、Maven项目
1. Maven工程类型
- POM工程
POM工程是逻辑工程。用在父级工程或聚合工程中。用来做jar包的版本控制。 - JAR工程
将会打包成jar,用作jar包使用。即常见的本地工程 -> Java Project。 - WAR工程
将会打包成war,发布在服务器上的工程
maven的项目是pom项目
2. Idea创建Maven项目
- 首先新建一个工程,选择Maven
- 点击下一步,有三个框需要我们填写
- 填好之后点击下一步
- 然后点击finish,完成项目的构建
3. Maven项目结构
- src/main/java
这个目录下储存java源代码 - src/main/resources
储存主要的资源文件。比如xml配置文件和properties文件 - src/test/java
储存测试用的类,比如JUNIT的测试一般就放在这个目录下面因为测试类本身实际是不属于项目的,所以放在任何一个包下都显得很尴尬,所以maven专门创建了一个测试包用于存放测试的类 - src
包含了项目所有的源代码和资源文件,以及其他项目相关的文件。 - target
编译后内容放置的文件夹 - pom.xml
是Maven的基础配置文件。配置项目和项目之间关系,包括配置依赖关系等等
结构图:
--MavenDemo 项目名
--.idea 项目的配置,自动生成的,无需关注。
--src
-- main 实际开发内容
--java 写包和java代码,此文件默认只编译.java文件
--resource 所有配置文件。最终编译把配置文件放入到classpath中。
-- test 测试时使用,自己写测试类或junit工具等
--java 储存测试用的类
pom.xml 整个maven项目所有配置内容
注意:目录名字不可以随便改,因为maven进行编译或者jar包生成操作的时候,是根据这个目录结构来找的,你若轻易动,那么久找不到了
四、POM文件
Maven工具基于POM(Project Object Model,项目对象模型)模式实现的。
在Maven中每个项目都相当于是一个对象,对象(项目)和对象(项目)之间是有关系的。
关系包含了:依赖、继承、聚合,实现Maven项目可以更加方便的实现导jar包、拆分项目等效果。
学习Maven其实就是学习POM文件的配置方式
1. 坐标
Maven的坐标,使用三个向量在Maven仓库中唯一地确定一个Maven工程
- groupid:
项目组织唯一的标识符,实际对应JAVA的包结构。一般采用“ 公司或组织的域名倒序.当前项目名称” - artifactId:
当前项目的模块唯一标识名称。 - version:
当前模块的版本。分为 SNAPSHOT(快照)、 RELEASE(发布)等
项目打包方式:默认为jar。 web项目用war,聚合项目是pom
- 在pom.xml中使用war来定义
2. 常用远程仓库
<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>
<repository>
<id>io.spring.repo.maven.release</id>
<url>http://repo.spring.io/release/</url>
</repository>
<repository>
<id>mvnrepository</id>
<url>https://mvnrepository.com/artifact/com.octo.captcha/jcaptcha</url>
</repository>
</repositories>
3. 依赖
依赖语法
依赖管理功能。 Maven中最关键的部分依赖的目的:引入项目所依赖的jar包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
<scope>compile</scope>
</dependency>
依赖的范围:常用的有
- compile:
编译依赖范围(默认范围)。编译、测试、运行下的classpath都有效 - test:
测试依赖范围。测试时的classpath有效。如junit - provided :
已提供依赖范围。对编译和测试有效,对运行无效。常用于容器提供了的运行环境。如servlet-api - runtime:
运行时依赖范围。测试和运行有效,编译无效
依赖排除
<dependency>
...
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
自定义变量
<properties>
<!-- 此处自定义xml标签标签名为变量名标签体为变量值 -->
<spring.version>4.3.6.RELEASE</spring.version>
</properties>
<!-- 引用变量 -->
<dependency>
<version>${spring.version}</version>
</dependency>
依赖调解
主要用于解决jar包冲突,主要原则有:
- 路径最近者优先
例如,假设A、B、C之间的依赖关系是A->B->C->D(2.0) 和A->E->(D1.0),那么D(1.0)会被使用,因为A通过E到D的路径更短 - 第一声明者优先
例如:A–>B–>Y(1.0),A–>C–>Y(2.0),Y(1.0)和Y(2.0)的依赖路径长度是一样的,则谁在POM中有限声明,则使用谁 - 和版本无关
4. 继承 & 聚合
大型项目要进行分层架构、分模块开发,以提高代码的清晰和重用。
maven工具通过“ 聚合” 来实现
先创建一个聚合项目(父项目)
packing类型为pom,父项目不需要有什么源码,可将这个工程下的所有目录都删除,仅留下pom.xml文件
<project...>
<modelVersion>4.0.0</modelVersion>
<groupId>cn.itvk.testmvn</groupId>
<artifactId>b2c</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<!--声明子模块-->
<modules>
<module>b2c-core</module>
<module>b2c-admin</module>
</modules>
<properties>
<!--统一版本等信息-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>4.12</junit.version>
</properties>
<!-- dependencyManagement 管理的包只声明不加载子类使用时才正式加载-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
在这个聚合项目下创建子项目
- 选中刚建的父项目,在其下创建子项目
- 继承机制:将共同的属性、依赖信息统一提取到聚合项目(父项目)中进行统一管理。
- 在父项目中管理依赖。
- 子项目中引用项目,并引用父项目中管理的依赖(删除范围和版本号)
<project...>
<modelVersion>4.0.0</modelVersion>
<artifactId>b2c-core</artifactId>
<!-- 关联父项目坐标系 -->
<parent>
<groupId>cn.itvk.testmvn</groupId>
<artifactId>b2c</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<!--真实加载父类中声明的jar包不许要写版本号除非要引用和父类不一样的jar包版本-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
<build>
...
</build>
</project>
五、常用插件
1. 资源拷贝插件
Maven在打包时默认只将src/main/resources里的配置文件拷贝到项目中并做打包处理,而非resource目录下的配置文件在打包时不会添加到项目中。
我们的配置文件,一般都放在:src/main/resources
然后打包后配置文件就会在target的classes下面放着:
测试:
我现在想把非resources下面的文件也打包到classes下面:需要配置:
pom.xml配置片段
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
配置好以后,那么你设置的位置下的配置文件都会被打包了:
六、Maven常用命令
Maven的命令非常多,我们只是讲解常用的几个:(所有命令都可以在控制台运行的)
- install
本地安装,包含编译,打包,安装到本地仓库
编译 - javac
打包 - jar,将java代码打包为jar文件
安装到本地仓库 - 将打包的jar文件,保存到本地仓库目录中。 - clean
清除已编译信息。
删除工程中的target目录。 - compile
只编译 javac命令 - package
打包。包含编译,打包两个功能
install和package的区别:
package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库
拓展:(部署项目到远程仓库)
如果要部署项目到远程仓库,
配置pom.xml:
<distributionManagement>
<repository>
<id>releases</id>
<name>Internal Releases</name>
<url>http://localhost:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>Snapshots</id>
<name>Internal Snapshots</name>
<url>http://localhost:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
这时候用mvn deploy
命令就可以把项目发布至远程仓库里了