maven学习笔记(一)pom,依赖和基本命令

1 设置 http代理:

有的公司基于安全考虑,要求使用通过安全认证的代理访问网络,这种情况需要为maven配置http代理,它才能正常访问外部仓库。在setting.xml配置,

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



    
    
    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
                    1.5
                
            
            
            
            	org.apache.maven.plugins
                maven-shade-plugin
                1.2.1
                
                	
                		package
                		
                			shade
                		
                		
                   			
                   				
                   					#包含main方法的全类名#
                   				
                   			
                        
                	
                                
            
        
    

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:导入依赖范围

maven学习笔记(一)pom,依赖和基本命令_第1张图片

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。

maven学习笔记(一)pom,依赖和基本命令_第2张图片

4.3传递性依赖的依赖范围

maven学习笔记(一)pom,依赖和基本命令_第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

    
        
        4.3.8.RELEASE
    

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

            
            	org.apache.maven.plugins
                maven-shade-plugin
                1.2.1
                
                	
                		package
                		
                			shade
                		
                		
                   			
                   				
                   					#包含main方法的全类名#
                   				
                   			
                        
                	
                                
            

6Archetype生成项目骨架(基本目录结构,pom文件内容)

 

 

 

 

你可能感兴趣的:(maven)