一、背景
二.Maven下载
http://maven.apache.org/download.cgi
三. Maven安装
3.1解压
3.2环境变量
maven依赖java环境,所以要确保java环境已配置好(maven-3.3+需要jdk7+)
`MAVEN_HOME = maven的安装目录`
`PATH = maven的安装目录下的bin目录
3.3测试
4. maven配置
<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>D:\Program Files\maven\myrepository</localRepository>
<profiles>
<!-- 在已有的profiles标签中添加profile标签 -->
<profile>
<id>myjdk </id>
<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>
</profiles>
<!-- 让增加的profile生效 -->
<activeProfiles>
<activeProfile>myjdk</activeProfile>
</activeProfiles>
五.仓库
5.1仓库分类
5.2本地仓库
5.3远程仓库
5.3.1中央仓库
5.3.2远程仓库
6. idea-maven
6.1在idea中关联maven
6.2创建Maven项目
6.2.1选择⻣架
6.2.2指定项目名
6.2.3设置maven
6.2.4项目位置
6.2.5项目结构
6.4.6导入依赖
maven-web项目中没有携带servlet相关的依赖,所以需要导入。否则,servlet相关的组件不能使用,jsp也不能使用
<dependency> <!-- jstl 支持 --> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency><dependency> <!-- servlet编译环境 --> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency><dependency> <!-- jsp编译环境--> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency>
7.Aliyun仓库(必需)
中央仓库在国外,下载速度很慢,国内的aliyun仓库是一款很优秀的maven仓库。强烈建议使用
<mirrors> <mirror> <id>aliyun</id> <!-- 中心仓库的 mirror(镜像) --> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <!-- aliyun仓库地址以后所有要指向中心仓库的请求,都由aliyun仓库接替-> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> </mirrors>
8.maven特性
8.1传递性
所谓传递性,是指,在项目中导入了依赖A,而A内部依赖了B,则A会自动触发B也被导入项目
好处:没必要导入所有依赖在项目中,传递性会自动导入一些依赖。简化依赖导入管理
8.1.1 jar冲突
<!-- 冲突示例 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.6.RELEASE</version> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.8.3</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.6.RELEASE</version> <exclusions> <!-- 排除一个依赖,则此依赖不会被spring-context-suport传递导入--> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> </exclusions> </dependency>
8.1.2传递依赖范围
前置概念:项目A中依赖B库,B库依赖C库;则A对B是第一直接依赖,B对C是第二直接依赖,A对C是传递性依赖。
如果第一直接依赖范围是:compile,第二直接依赖范围:compile,则传递性依赖范围就是:compile则,传递性依赖的范围取决于第一和第二直接依赖
8.2继承
8.2.1定义父项目
创建浮父项目
定义空白的maven项目(不用写任何代码,只用他的pom文件)
注意:子项目中如果明确定义了版本,则父项目中的声明会失效。所以父项目中声明的版本,子项目中不允许再定义。
8.2.2子项目继承
子项目pom中继承父pom
8.3聚合
一个项目(projectproject),可以分为多个模块(module),使得项目更加层次清晰,利于管理。利于模块复用
8.3.1创建父模块
可以基于“quick-start”⻣架建立项目,或建立一个空白项目均可。模块必须是pom打包!!,其他没特殊要求。
8.3.2创建子模块
父模块作为:Project,再建项目作为:Module
注意:dao和service模块打包格式为jar,web模块打包格式为war
3.创建完毕后,如下
4.重复如上过程,再多创建几个Module
5.父项目的pom,已经发生了改变,<moludels><moludels>标签即在做多模块聚合
8.3.3父项目中定义版本管理
<!-- 共用的依赖定义--> <dependencies> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </dependency> .... </dependencies> <!-- 依赖版本统一管理 --> <dependencyManagement> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.3.6.RELEASE</version> </dependency> .... </dependencyManagement>
8.3.4相关指令
# 测试,对父模块做打包操作 mvn package # 测试,对父模块做清理并编译 mvn clean compile # 测试,对父模块做清理并打包 mvn clean package # # 注意:对父模块做的操作都会同步到每个模块上。
9.私服
访问私服:http://localhost:8081/nexus/
9.2 Nexus登录
9.3仓库列表
group:包含多个仓库,通过group库的地址可以从包含的多个仓库中查找构件
9.4导入第三方jar到私服
有些jar在中心库中是没有的,比如oracle的数据库驱动jar:ojdb6.jar.可以自己下载jar,然后上传到私服中。此种构件,我们建议放在"3rd party"仓库中(存放第三方构件
9.5 maven配置私服
在maven中配置私服,使得maven可以从私服上获取构件
9.5.1仓库组
而此时就有问题,私服中有很多仓库,每个仓库都有自己的url,则项目中配置哪个仓库呢?
9.5.2 maven关联私服
配置settings.xml,设置私服地址、认证等信息
配置私服为maven的远程仓库,注意:【此处的repository的id要和上图中server的id保持一致,才可以在私服认证通过
使profile配置生效
至此,maven项目中需要依赖时,maven会从私服中下载
9.6 maven项目部署到私服
在项目的pom中配置部署仓库位置:
执行:mvn deploy即可将项目部署到私服对应的仓库中,此时项目中的打包方式多为jar
注意:如上的repository的id依然是要和settings.xml中配置的server中的id对应才能通过私服的认证
10. mave常用指令
mvn compile 编译 mvn clean 清除上次编译的内容 mvn clean compile 清除并编译 mvn package 打包
11. Resources
11.1增加资源目录
如果有配置文件不在resources目录下,则需要额外配置:
<build> <resources> <!-- src/main/java目录也是一个资源目录,其中的配置文件也会被复制到编译目录-> <resource> <directory>src/main/java</directory> </resource> </resources> </build>
11.2排除或包含
如果有资源目录中有需要排除的配置文件,可以如下设置:
<resource> <directory>src/main/java</directory> <!--**代表src/main/java下的子目录或子目录的子目录..*.txt 代表所有txt文件。 所有文 件可以用:*.* 或 *【排除所有txt文件,其他文件都会被复制】--> <excludes> <exclude>**/*.txt</exclude> </excludes> </resource>
如果有资源目录中有需要包含的配置文件,可以如下设置:
<resource> <directory>src/main/java</directory> <!--**代表src/main/java下的子目录或子目录的子目录..*.txt 代表所有txt文件。 所有文件可以用:*.* 或 *【复制所有txt文件,其他文件都会被忽略】--> <includes> <include>**/*.txt</include> </includes> </resource>