有的公司基于安全考虑,要求使用通过安全认证的代理访问网络,这种情况需要为maven配置http代理,它才能正常访问外部仓库。在setting.xml配置,
(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:内嵌版本新,不稳定
src/main/java 主代码
src/test/java测试代码,主代码会被打包到最终构件中,测试代码不会
target/classes/:编译输出目录
target/:包输出目录
4.0.0
cn.temptation
ssm
war
0.0.1-SNAPSHOT
ssm Maven Webapp
http://maven.apache.org
4.3.8.RELEASE
org.apache.maven.plugins
maven-compiler-plugin
1.5
org.apache.maven.plugins
maven-shade-plugin
1.2.1
package
shade
#包含main方法的全类名#
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:用来排除传递性依赖
maven会解析各个直接依赖的pom,将那些必要的间接依赖以传递性依赖的形式引入到当前项目中。
例如:a项目依赖org.springframework:spring-core:2.5.6依赖,而spring-core也有它自己的依赖,可以直接访问它在中央仓库的pom。该文件包含了一个commons-logging依赖。依赖范围都时compile。commons-logging就是account-email的传递性依赖,依赖范围也是compile。
当传递性依赖版本冲突时,依赖调节原则:
(1)路径最近者优先
(2)路径相同时,在pom中依赖声明順序决定。
(1)可选依赖依赖不会传递
(2)可选依赖是指两个特性互斥,比如:一个持久层隔离工具包,支持多种数据库,在构件工具包时需要这两种数据库的驱动程序,但在使用这个工具包时只会依赖一种数据库。此时,将各个数据库驱动设置成可选依赖。
(1)传递性依赖引入了一个SNAPSHOT不稳定版本,会影响当前项目,此时需要排除
(2)hibernate依赖于Sun JTA API,但由于版权原因不在中央仓库,由别的替换
(3)声明排除依赖时秩序groupId和artifactId而不需要version元素,因为只需groupId和artifactId就能定位(maven解析后的依赖中,不可能出现groupId和artifactId相同但是版本不同的两个依赖(依赖调节))。
如下配置,运行时会把所有${spring.version}替换成4.3.8.RELEASE
4.3.8.RELEASE
应对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只分析编译主代码和测试代码需要用到的依赖,发现不了执行测试和运行时需要的依赖,因此删除依赖声明可能把这些依赖删除,要小心测试。
(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
org.apache.maven.plugins
maven-shade-plugin
1.2.1
package
shade
#包含main方法的全类名#
6Archetype生成项目骨架(基本目录结构,pom文件内容)