1.依赖管理Dependency Management
1.1.依赖管理的主要配置
坐标:groupId、artifactId、version
type:依赖的类型,默认值就jar。
bundle:打包不是maven标准的打包,也能凑合用,但不推荐
exclusions:排除某依赖
目标:要将log4j中不需要的jar排除掉。
操作右键:
操作右键:
保存后:
scope:依赖范围
compile:编译,打包、测试都需要。绝大多数jar都是如此,也是默认值。
provided:编译需要,打包不需要。例如servlet、jsp的jar。
1.2.传递性依赖的问题
引发传递性依赖的问题,即:同时引用了的依赖jar包冲突。如:通过引入struts2和spring整合jar:
jar的版本冲突出现了!
Maven的依赖调节策略:
举例:X是A的传递性依赖
1)
A->B->C-D-X(1.6)
A->D-X(2.0)
根据第一原则:2.0会引入进来!
2)
A->D-X(2.0)
A->D-X(3.0)
当第一原则失效,则遵循第二原则。
解决版本冲突:
1)优先遵循第二原则,先声明先进来。
这里优先将spring放到前面
2)第一原则:直接依赖,路径最短
3)我们一般优先使用依赖调节策略,当依赖调节策略也不能解决的情况下,可以锁定版本。但会打破依赖调节策略。
例如:spring core的版本就是要用3.05
4)如果某个jar不需要(按道理说,maven自动识别同样类型的jar,引入一个版本。但有时候,两个jar差距太大,识别不出来。)可以排除一个版本。(上节知识)
1.3.自定义属性-统一版本维护
在maven中,可以自定义属性,为了在maven的环境中使用(引用)。
自定义属性应用中,可以做统一版本维护。
问题:当引入过多的依赖的时候,相同类型的依赖版本一般要统一,但单独维护很麻烦。
maven默认是1.5的编译。
解决方案:
修改编译版本为1.7:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
需要按照pom配置去更新项目:
2.生命周期
不管哪套生命周期,都是独立的。但同一套生命周期执行的顺序是从上到下的,例如:
执行mvn package,那么会自动执行package之前的所有的过程。
扩展:可以同时执行两套生命周期(组合命令)
mvn clean package
3.插件(Plugin)
插件是maven的功能的组成!
主要用来控制生命周期、tomcat运行等等。
仓库中存放是构件,构件有两种:jar相关和插件。
如果插件本地仓库没有,则会自动到远程仓库下载。
3.1.编译maven-compiler-plugin
maven-compiler-plugin:3.1
负责编译。
改变编译版本,默认是maven的编译版本是1.5.
maven的插件要改变默认值,的方法:通过自定义pom的配置来覆盖默认配置。
<build>
<plugins>
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<!-- 开发时源代码编译版本 -->
<source>1.7</source>
<!-- 打包编译到target目录时的版本 -->
<target>1.7</target>
<!-- 编译时的编码,默认是iso8859-1 -->
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
要让配置生效,需要更新项目(让项目根据配置来重新构建):
3.2.测试
编写测试用例:
让所有的用例都跑一下:mvn test
1)中文乱码问题
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<!-- 控制台中文编码问题 -->
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>
3.3.Tomcat
tomcat-maven-plugin:1.1
默认端口是8080,编码是iso8859-1
目标;要修改端口和编码
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<!-- 端口 -->
<port>9090</port>
<!-- 编码 -->
<charset>utf-8</charset>
</configuration>
</plugin>
3.4.其他
maven的插件有内置的,和外置的插件。
内置插件:根据groupId来识别的,只能识别两个:org.codehaus.mojo、org.apache.maven.plugins
直接使用即可。比如编译,打包,内置tomcat。
外置插件(第三方):组id不是上面这两个
需要声明再用。
比如tocmat7插件
解决方案:声明引入插件:
注:【自己】
4.多模块和聚合
4.1.概念
多模块:将一个项目分解为几个小的项目,在父项目中统一管理子项目的功能,通过父项目module管理子项目
聚合(继承):子项目继承父项目,复用父项目中的内容(jar、配置等),通过子项目中parent标签继承。
两者是独立的,但通常一起使用。多模块是从上到下管理子项目的,继承从下到上继承复用父项目的。
4.2.多模块和继承的构建
第一步:先建立父项目
项目类型选择pom:
第二步;:建立子项目(两个java项目)
提示:父项目必须是pom类型的,否则报错:
分析配置代码:
父项目:
子项目:
按照上面的步骤,再建立子项目:
分析父项目:
子项目:
4.3.多模块和继承的操作
目标:测试向下管理和向上继承。
向下管理
父项目统一管理操作子项目
需求:对子项目打包操作。
只需要在父项目上 mvn package即可,子项目自动打包。{注:使用Eclipse Maven插件[Run As]-[Maven build]时多输入了mvn命令
,因为Eclipse Maven插件已经帮你加上了mvn的命令前缀,此时只需package即可,否则报错误LifecyclePhaseNotFoundException,Unknown lifecycle phase “mvn”. You must specify a valid lifecycle}
向上继承
子项目可以复用父项目的东东
需求:所有子项目都需要junit包,
只需要在父项目中引入即可。
为什么要分解??
因为有时候项目本身要复用,因此可以将一个项目中模块,抽取出来一个单独的项目,多个项目复用该项目。
如何分解?
根据业务功能分解。业务功能模块是复用的。比如发短信的模块抽取出来单独项目。
根据开发层来分解。根据三层架构来分解。比如domain多个项目复用,则可以抽取出来。
5.全局Settings的配置
5.1.私服的客户端配置使用
比如阿里云的私服:
<mirror>
<id>aliyun</id>
<mirrorOf>*</mirrorOf>
<name>aliyun de sifu</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
5.2.自定义属性覆盖
问题:之前maven默认编译版本是1.5,以后创建的项目都默认是1.5,虽然可以通过项目中的pom.xml去覆盖,但麻烦。
在全局覆盖!
<profile>
<id>jdk-1.7</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<!--prevent "[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--Handle special characters in site-->
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!--set up Maven so it will compile with a target and source JVM of my choice-->
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
</properties>
</profile>
6.第三方构件安装到本地仓库
问题:Oracle在中央仓库中没有构件,因此无法下载下来。
解决方案:手动安装
1.命令行安装(了解):
*在你下载后的 jar 的所在目录下打开命令窗口,然后输入如下命令:
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=1.0 -Dpackaging=jar -Dfile=ojdbc6.jar*
2.图形界面:
填写必要信息: