maven常用知识点整理
一、maven变量
1.1 内置变量
${basedir} 项目根目录
${project.build.directory} 构建目录,缺省为target
${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
${project.build.finalName} 产出物名称,缺省为${project.artifactId}-${project.version}
${project.packaging} 打包类型,缺省为jar
${project.xxx} 当前pom文件的任意节点的内容
1.2 自定义变量
<project>
...
<properties>
<变量名>变量值</变量名>
</properties>
...
<应用>${变量名}</应用>
</project>
二、maven依赖管理
2.1 maven依赖范围说明
compile: 编译依赖范围(默认),使用此依赖范围对于编译、测试、运行三种 classpath 都有效,即在编译、测试和运行的时候都要使用该依赖jar包;
test: 测试依赖范围,从字面意思就可以知道此依赖范围只能用于测试classpath,而在编译和运行项目时无法使用此类依赖,典型的是JUnit,它只用于编译测试代码和运行测试代码的时候才需要;
provided: 此依赖范围,对于编译和测试classpath有效,而对运行时无效;
runtime: 运行时依赖范围,对于测试和运行classpath有效,但是在编译主代码时无效,典型的就是JDBC驱动实现;
system: 系统依赖范围,使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径,不依赖Maven仓库解析,所以可能会造成建构的不可移植,谨慎使用。
2.2 maven自调节原则
2.2.1 第一声明优先原则
2.2.2 路径近者优先原则
2.3 排除依赖
示例:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
<version>4.1.7.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
</exclusions>
</dependency>
2.4 版本锁定
所谓版本锁定就是指将依赖包的版本固定下来,使任何其他版本定义无效,这种依赖冲突的解决方案是目前实际项目中使用的最多的。
版本锁定使用< dependencyManagement >节点。
需要说明的是< dependencyManagement >节点仅仅起指定依赖包版本的作用,并不会把依赖包传递给子pom,具体需要哪些依赖包仍然是由< dependencies >元内容确定。如果在< dependencyManagement >中指定了依赖包的版本,那么< dependencies>节点设置的< version >将不起作用。
三、maven小技巧应用
3.1 maven使用systemPath引用本地依赖
以 oracle 的 ojdbc7 jar 为例。
将 ojdbc7-12.1.0.1.jar 手工放置到项目目录/src/main/webapp/WEB-INF/lib路径下。
修改pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<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>
...
<properties>
<custom.lib-path>${basedir}/src/main/webapp/WEB-INF/lib</custom.lib-path>
</properties>
<dependencys>
<dependency>
<groupId>com.oracle.jdbc</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.1</version>
<scope>system</scope>
<systemPath>${custom.lib-path}/ojdbc7-12.1.0.1.jar</systemPath>
</dependency>
...
</dependencys>
...
</project>
3.2 Maven pom.xml文件获取当前时间戳
<properties>
<!-- 设置时间格式-->
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
</properties>
<build>
<!-- 使用 -->
<finalName>starscream-flood-site-dev-${maven.build.timestamp}</finalName>
</build>
3.3 Maven打包包名带时间戳
<!--打包时包名添加时间戳-->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.3</version>
<configuration>
<timestampFormat>yyyyMMddHHmmss</timestampFormat>
</configuration>
<executions>
<execution>
<goals>
<goal>create-timestamp</goal>
</goals>
</execution>
</executions>
<inherited>false</inherited>
</plugin>
<!--war包插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<!--
<artifactId>maven-jar-plugin</artifactId>
-->
<version>2.6</version>
<configuration>
<warName>${project.artifactId}_${timestamp}</warName>
</configuration>
</plugin>
3.4 maven指定多个源码目录
<build>
<plugins>
<!-- 指定多个源代码目录、多个资源文件目录 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>src/main/java</source>
<source>src/main/third-part</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>