Maven 的作用:
- Maven 统一集中管理好所有的依赖包,不需要再去寻找。
- 对应第三方组件用到的共同 jar,Maven 自动解决重复和冲突问题。
- Maven 作为一个开放的架构,提供了公共接口,方便同第三方插件集成。程序员可以将自己需要的插件,动态地集成到 Maven,从而扩展新的管理功能。
- Maven 可以统一每个项目的构建过程,实现不同项目的兼容性管理。
Maven的下载和配置
maven官网下载地址 :http://maven.apache.org/download.cgi
下载之后可以放在本地磁盘里面,最好不要放C盘,路径不要太复杂 ,放好后解压,
解压之后创建一个repository文件夹作为本地仓库,以后项目在通过pom.xml文件加载jar包的过程中,首先会到本地仓库找jar包,如果没有,则会根据setting.xml文件配置的中央仓库联网下载。
接下来去配置环境变量,把maven可执行文件的bin目录路径复制下来,在环境变量里面新增一个MAVEN_HOME,然后把MAVEN_HOME添加到path环境变量中
然后去conf目录里面设置settings.xml文件
第一步是本地仓库的配置,打开setting.xml,找到/path/to/local/repo这一行 复制下来, 把地址改写成刚刚建立的repository文件夹的地址
下一步配置中央仓库,改成阿里的,切记看好位置 在mirrors里面,默认是外网的 ,访问量较大,且速度慢
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
弄好记得保存
接下来可以去DOS命令行窗口验证安装成功没,有版本号出来就可以了
输入命令:mvn -v
IDEA配置maven
创建多模块项目(以四个模块为例)
maven_parent 基模块(parent)
maven_dao 数据库访问层
maven_service 业务逻辑层
maven_controller 接收数据,响应数据
** 1.创建maven_parent项目**
2.新创建maven_dao 模块
在maven_parent项目上右键新建Module
这里只需要改Artifactic
3.新建maven_service 模块
步骤与maven_dao一致
4.新建maven_service 模块
步骤与maven_dao基本一致, 只是在选择模板时设置为web项目即可
创建好之后是这个样子的,在parent的pom.xml
接下来修改三个子模块的pom.xml文件
(三个子模块都一样操作)
1.修改jdk版本(这里是用的是jdk1.8 就修改成1.8)
2.设置junit版本
3.删除pluginManagement模块
接下来去三个模块中分别建立包和类
在service中调用Dao的方法,controller中调用service的方法,并且添加依赖,
添加依赖的方法(以把DAO添加到Service中为例)
在DAO中的pom.xml文件里面把下面几行复制出来,放到Service 中的pom.xml文件的dependence中去
<groupId>com.tcgroup</groupId>
<artifactId>maven_service</artifactId>
<version>1.0-SNAPSHOT</version>
同理把service添加到controller的依赖里面
因为controller还需要使用servlet和Tomcat服务器, 所以需要引入servlet的依赖,部署Tomcat服务器
<!-- 引入servlet的依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- 构建Tomcat -->
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<path>/web</path>
<uriEncoding>UTF-8</uriEncoding>
<server>tomcat7</server>
</configuration>
</plugin>
</plugins>
接下来可以尝试运行了
如果失败可以吧所有模块都用install命令启动一下 从DAO到Parent
Maven install 安装指令,其做了两件事情:
- 将项目打包(jar/war),将打包结果放到项目下的 target 目录下
- 同时将上述打包结果放到本地仓库的相应目录中,供其他项目或模块引用
都成功之后再去启动Tomcat,一般就没有什么问题了
maven 的项目打包操作(以打包mavenController为例)
1. 给resources文件夹下面添加一些不同环境的配置文件
2. 添加profile配置
在pom.xml文件里面添加
<profiles>
<profile>
<!-- 开发环境 -->
<id>dev</id>
<properties>
<environment>dev</environment>
</properties>
<activation>
<activeByDefault>true</activeByDefault><!-- 默认激活该profile节点-->
</activation>
</profile>
<profile>
<!-- 测试环境 -->
<id>test</id>
<properties>
<environment>test</environment>
</properties>
</profile>
<profile>
<!-- 生产环境 -->
<id>product</id>
<properties>
<environment>product</environment>
</properties>
</profile>
</profiles>
3.设置资源文件配置
对于项目资源文件的配置放在build里面
<resources>
<resource>
<directory>src/main/resources/${env}</directory>
</resource>
<resource>
<!-- 找 src/main/java路径下面的文件 -->
<directory>src/main/java</directory>
<!-- 包含的文件格式 -->
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.tld</include>
</includes>
<!-- 不进行过滤 -->
<filtering>false</filtering>
</resource>
</resources>
4.执行打包操作
打开Run/Debug Configurations 窗口 输入打包命令
可以直接用package命令打包所有环境下的配置文件
也可以通过打包命令mvn package -Pdev来指定激活id为 dev 的profile节点, 这样, 开发环境配置文件就会被打包.
还能再前面加上clean compile命令先清空之前的缓存, 编译之后在打包
以后项目发布的时候也可以通过-Dmaven.test.skip=true 设置跳过test环境的配置文件
clean compile package -Pdev -Dmaven.test.skip=true
打包好之后会在target目录下生成对应的war包
maven依赖的基本配置
Maven依赖的坐标
Maven的仓库中拥有着无数的构件,每一个构件都是一个jar或者war等文件,如果没有坐标,那么我们将无法唯一标识该构件,结果就是Maven将无法帮助我们自动下载构件。所以,Maven定义了一组规则:世界上任何一个构件都可以使用Maven坐标来唯一标识。Maven坐标的主要元素包括groupId,artifactId,version,packaging(可选)和classifier(可选),通过这些元素,我们可以明确标识任何一个构件。
groupId:该元素定义了当前Maven项目隶属的实际项目,一般情况下该项元素都与公司域名相对应,比如com.taobao.
artifactId:该元素定义了实际项目中的一个Maven Module
version:该元素表示当前构件的版本,包括稳定(release)版本和测试(snapshot)版本
packaging:该元素定义Maven项目的打包方式,默认为jar,还有war和pom方式
classifer:该元素用来帮助定义构件输出的一些附属构件,例如通过配置插件,可以在打包的同时生成-javadoc.jar和sources.jar 等构件。
依赖的范围(scope)
有如下几种:
**compile**:(默认值)
编译范围有效,编译和运行(打包)时都会将依赖存进去
**test**:
指测试范围有效,编译和打包时都不使用该依赖。
**provided**:
测试、编译范围都有效,最后生成war包时不会加入,例如:servlet-api,编译的时候需要该文件,但是在打包的时候不需要把这个 jar 文件打在 WAR 中,因为servlet容器或者应用服务器会提供的。打进去会出现冲突。
**runtime**:
编译时不依赖,运行(打包)时依赖
** System**:系统依赖范围
一般不使用
Maven POM
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。
在创建 POM 之前,我们首先需要描述项目组 (groupId), 项目的唯一ID。
<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/xsd/maven-4.0.0.xsd">
<!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId>
<!-- 版本号 -->
<version>1.0</version>
</project>
所有 POM 文件都需要 project 元素和三个必需字段:groupId,artifactId,version。(可以去网上搜超级POM看各种标签什么意思)
常见问题
资源过滤问题
maven由于约定大于配置,可能遇到写的配置文件无法被导出或者生效的问题(target目录里面没有),解决方法:在pom.xml添加下面配置(子项目父项目里面都放一下)
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>