1 设置 http代理:
有的公司基于安全考虑,要求使用通过安全认证的代理访问网络,这种情况需要为maven配置http代理,它才能正常访问外部仓库。在setting.xml配置,<proxies></proxies>
2 maven安装最佳实践
(1)设置MAVEN_OPTS环境变量,是java运行maven时参数
因为java的默认内存往往不能够满足maven运行的需要,比如项目较大时,使用maven生成项目站点需要占用大量内存,如果没有该配置,则很容易得到java.lang.OutOfMemeoryError
(2)配置用户范围settings.xml
$M2_HOME/conf/setting.xml 全局范围,整台机器所有用户都受影响
~/.m2/setting.xml用户范围的。
推荐使用用户范围:避免无意识影响其他用户;便于升级,否则每次升级新版本都要复制$M2_HOME/conf/setting.xml文件,使用~/.m2/setting.xml则不需要。
默认情况下,~/.m2/setting.xml不存在,用户需要从$M2_HOME/conf/setting.xml复制再进行编辑。
(3)不要使用ide内嵌maven:内嵌版本新,不稳定
3maven项目结构(约定,特殊需要可以自定义配置(不推荐))
src/main/java 主代码
src/test/java测试代码,主代码会被打包到最终构件中,测试代码不会
target/classes/:编译输出目录
target/:包输出目录
4编写pom
<!-- 命名空间,xsd便于xml编辑器快速编辑pom -->
<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/maven-v4_0_0.xsd">
<!-- modelVersion指定当前pom版本,maven2,3只能是4.0.0 -->
<modelVersion>4.0.0</modelVersion>
<!-- 组,通常是组织.项目-->
<groupId>cn.temptation</groupId>
<!-- 组中唯一id-->
<artifactId>ssm</artifactId>
<!-- 打包方式:jar(默认),war -->
<packaging>war</packaging>
<!-- 版本,SNAPSHOT意为快照,说明该项目还在开发中,是不稳定的版本 -->
<version>0.0.1-SNAPSHOT</version>
<!-- 对于用户的友好项目名 -->
<name>ssm Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<!-- Spring版本号 -->
<spring.version>4.3.8.RELEASE</spring.version>
</properties>
<dependencies>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.MnifestResouceTransformer">
<mainClass>#包含main方法的全类名#</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
4.1dependency依赖
groupId,artifactId,version:基本坐标
type:依赖的类型,对应于项目坐标定义的packaging
scope:依赖的范围:用来控制与三种classpath(编译,测试,运行)的关系。
(1)compile(默认):编译
(2)test:测试
(3)provided:已提供。编译和测试有效,但运行时无效,如:servlet-api,编译和测试项目需要该依赖,项目运行时由于容器已提供,就不需要maven重复地引入一遍。
(4)runtime:运行时依赖范围。测试和运行有效,编译主代码时无效。如:jdbc,项目主代码编译只需要jdk提供的jdbc接口,只有在执行测试或者运行项目时才需要实现上述接口的具体jdbc驱动。
(5)system(不建议使用):系统依赖范围,与provided相同,但必须通过systemPath元素显示地指定依赖文件的路径
(6)import:导入依赖范围
optional:标记依赖是否可选
exclusions:用来排除传递性依赖
4.2传递性依赖
maven会解析各个直接依赖的pom,将那些必要的间接依赖以传递性依赖的形式引入到当前项目中。
例如:a项目依赖org.springframework:spring-core:2.5.6依赖,而spring-core也有它自己的依赖,可以直接访问它在中央仓库的pom。该文件包含了一个commons-logging依赖。依赖范围都时compile。commons-logging就是account-email的传递性依赖,依赖范围也是compile。
4.3传递性依赖的依赖范围
4.4依赖调节
当传递性依赖版本冲突时,依赖调节原则:
(1)路径最近者优先
(2)路径相同时,在pom中依赖声明順序决定。
4.5可选依赖(不建议使用)
(1)可选依赖依赖不会传递
(2)可选依赖是指两个特性互斥,比如:一个持久层隔离工具包,支持多种数据库,在构件工具包时需要这两种数据库的驱动程序,但在使用这个工具包时只会依赖一种数据库。此时,将各个数据库驱动设置成可选依赖。
4.6排除依赖
(1)传递性依赖引入了一个SNAPSHOT不稳定版本,会影响当前项目,此时需要排除
(2)hibernate依赖于Sun JTA API,但由于版权原因不在中央仓库,由别的替换
(3)声明排除依赖时秩序groupId和artifactId而不需要version元素,因为只需groupId和artifactId就能定位(maven解析后的依赖中,不可能出现groupId和artifactId相同但是版本不同的两个依赖(依赖调节))。
4.7归类依赖
如下配置,运行时会把所有${spring.version}替换成4.3.8.RELEASE
<properties>
<!-- Spring版本号 -->
<spring.version>4.3.8.RELEASE</spring.version>
</properties>
4.8优化依赖
应对maven项目的依赖了然于胸,并对其优化,如去除多余的依赖,显示地声明某些必要的依赖。
(1)查看已解析依赖:mvn dependency :list(eclipse中 dependency:list)显示所有已解析依赖的信息和依赖范围
(2)查看依赖树:mvn dependency:tree
(3)分析依赖树:mvn dependency:analyze
该结果中重要的两个部分:
Used undeclared dependencies:项目中使用到的但没有显示声明的依赖。如果有很多java import声明,这些传递性依赖版本发生变化时,有可能导致程序出错,这种错误很难查出,因此应该显示声明项目中直接用到的依赖。
Unused declared dependencies:项目中未使用但显示声明的应用,但由于dependency:analyze只分析编译主代码和测试代码需要用到的依赖,发现不了执行测试和运行时需要的依赖,因此删除依赖声明可能把这些依赖删除,要小心测试。
5maven插件和插件目标
(mvn clean compile)
(mvn clean test)
clean:clean 清理
resources:resources 主资源处理
compiler:complile 主代码编译
resources:testResources测试资源处理
compiler:testCompile 测试代码编译
surefire:test surefire是maven中负责执行测试的插件
(mvn clean package)
jar:jar 将项目主代码打包成一个名为artifact-version.jar的文件,该文件位于/target输出目录中。如有需要还可以使用finalName自定义该文件名
(mvn clean install)
install:install 将输出的jar包安装到maven本地仓库中,其他maven项目才能使用它。
借助maven-shade-plugin插件生成可执行jar
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.MnifestResouceTransformer">
<mainClass>#包含main方法的全类名#</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
6Archetype生成项目骨架(基本目录结构,pom文件内容)