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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ld705454682/article/details/82013896

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测试代码,主代码会被打包到最终构件中,测试代码不会

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文件内容)

猜你喜欢

转载自blog.csdn.net/ld705454682/article/details/82013896