Maven学习笔记二
packaging
项目打包的类型,可以使 jar、war、rar、ear、pom,默认是 jar(一般父工程设置为pom,子工程设置为jar),web项目是war包
properties
是用来定义一些配置属性的,例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级(配置属性)
<properties> <!--源码编译jdk版本--> <maven.compiler.source>1.8</maven.compiler.source> <!--运行代码的jdk版本--> <maven.compiler.target>1.8</maven.compiler.target> <!--项目构建使用的编码,避免中文乱码--> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!--生成报告的编码--> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties>
modules
在Maven的多模块开发中,为了统一构建整个项目的所有模块,可以提供一个额外的模块,该模块打包方式为pom,并且在其中使用modules聚合的其它模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有模块,叫Maven的聚合
依赖
Maven 的一个重要作用就是管理jar包,为了一个项目可以构建或运行,项目中不可避免的,会依赖很多其他的jar包,在Maven中,这些 jar 就被称为依赖,使用标签dependency来配置。
Maven解析依赖信息时会到本地仓库中查找依赖的jar包。对于我们自己开发的Maven工程,需要install后才能使用。
依赖范围 scope
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency>
Compile:默认值。表示编译(compile)时需要,测试时需要,运行时需要,打包时需要。比如:struts2-core
Provided:编译(compile)时需要,测试(test)时也需要 ,运行时不需要,打包时不需要。比如 jsp-api.jar servlet-api.jar
Runtime:编译时不需要,测试时需要,,运行时需要,打包时需要。比如:数据库驱动包
Test:编译时不需要,测试时需要,运行时不需要,打包也不需要。比如:junit.jar
总结:Compile所有阶段都需要,Provided运行时不需要,Runtime编译时不需要,Test测试时需要。
依赖传递
可以传递的依赖不必在每个模块工程中重复引入,只需在“最底层”引入一次即可,非compile范围的依赖不能传递,需要重复声明。比如:只添加了一个struts2-core依赖,发现项目中出现了很多jar,这种情况叫依赖传递。
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.24</version> </dependency>
在整合ssh框架的时候,添加struts2-spring-plugin包和spring-context包依赖时,spring-bean会出现版本冲突。
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.4.RELEASE</version> </dependency>
依赖版本冲突的解决
1、第一声明优先原则,如果路径相同,谁先定义的就优先使用谁的传递依赖。
<!-- spring-beans-4.2.4 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.4.RELEASE</version> </dependency> <!-- spring-beans-3.0.5 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24</version> </dependency>
以上代码都包含对spring-beans的依赖,但是版本不同,我们要使用4.2.4的。
2、路径近者优先原则,直接依赖级别大于传递依赖。也就是自己添加jar包。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.2.4.RELEASE</version> </dependency>
还是上面的代码都包含对spring-bean的依赖,我们也可以自己添加jar包,则会使用我们自己添加的。
3、排除原则,排除掉不想用的依赖。
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> </exclusions> </dependency>
4、版本锁定原则,指定项目中用到依赖信息版本。
<!--抽取公用的版本--> <properties> <spring.version>4.2.4.RELEASE</spring.version> <hibernate.version>5.0.7.Final</hibernate.version> <struts.version>2.3.24</struts.version> </properties> <!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> </dependencies> </dependencyManagement>
继承
Maven中,如果多个模块都需要声明相同的配置,例如:groupId、version、有相同的依赖、或者相同的组件配置等,也有类似Java的继承机制,用parent声明要继承的父工程的pom配置(继承)
学习资源:http://www.cnblogs.com/xdp-gacl/tag/Maven%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/