再识 Maven
1 修改Maven默认JDK版本
方式一:只针对修改的工程
在工程的pom.xml文件中添加:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
方式二: 全局
在settings.xml文件中,在标签下添加以下内容:
<profile>
<id>1.8</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.compilerVersuon>1.8</maven.compiler.compilerVersuon>
</properties>
</profile>
2 Maven项目直接在Tomcat中启动运行
在项目的pom.xml文件中配置tomcat-maven插件
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
启动命令:
tomcat7:run
3 Maven坐标主要组成
groupId: 组织标识(包名)
artifactId: 项目名称(项目名-模块名)
version: 项目当前的版本
packaging: 项目打包的方式,常见为jar和war两种,打的包默认在本地仓库中
样例:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
4 依赖范围
依赖范围scope用来控制依赖jar包和编译,测试,运行的classpath的关系,主要取值如下:
- compile:默认编译依赖范围,对于编译,测试,运行三种classpath都有效
- test:测试依赖范围,只对于测试classpath有效
例如:junit
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
- provided:已提供依赖范围,对于编译,测试的classpath都有效,但对于运行无效,因为容器已经提供
例如:servlet-api
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
- runtime:运行时提供
例如:jdbc驱动
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<scope>runtime</scope>
</dependency>
5 生命周期
Maven生命周期就是为了对所有的构建过程进行抽象和统一,包括项目清理,初始化,编译,测试,打包,部署等构建过程
5.1 Maven的三套相互独立的生命周期分别是:
1 .Clean LifeCycle 在构建之前进行清理工作
2. Default LifeCycle 构建核心部分,编译,测试,打包,部署
3. Site LifeCycle 生成项目报告,站点,发布站点
6 聚合和继承
6.1 聚合:
一次构建多个项目模块,需要对多个项目模块进行聚合
<modules>
<module>system-entity</module>
<module>system-dao</module>
<module>system-service</module>
<module>system-web</module>
</modules>
6.2 继承:
为了消除重复,把相同的配置提取出来
<parent>
<groupId>com.xms</groupId>
<artifactId>system-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
项目结构:
system-parent
|---pom.xml
|---system-entity
|---src
|---pom.xml
|---system-dao
|---src
|---pom.xml
|---system-service
|---src
|---pom.xml
|---system-web
|---src
|---pom.xml
7 传递依赖 与 排除依赖
- 传递依赖:如果我们的项目引用了一个Jar包,而该Jar包又引用了其他Jar包,那么在默认情况下项目编译时,Maven会把直接引用和间接引用的Jar包都下载到本地。
- 排除依赖:如果我们只想下载直接引用的Jar包,那么需要在pom.xml中做如下配置:(将需要排除的Jar包的坐标写在中)
<exclusions>
<exclusion>
<groupId>cn.missbe.web.search</groupId>
<artifactId>resource-search</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
</exclusion>
</exclusions>
8 依赖冲突
若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。
1.短路优先
例如:
A.jar——>B.jar——>X.jar
C.jar——>X.jar
若本项目引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X.jar,并且C.jar也引用了X.jar。
这时,Maven只会引用引用路径最短的Jar。
2.声明优先
若引用路径长度相同时,在pom.xml中谁先被声明,就使用谁。
9 静态资源被拦截的处理
<mvc:default-servlet-handler/> 之后,对进入DispatcherServlet 的 URL进行筛查,如果发现是静态资源,就将请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet 继续处理
Tomcat, Jetty, JBoss, GlassFish 这些容器自带的默认Servlet的名字 都是default。