maven第二节-maven基础-依赖管理

 1.maven常用命令
mvn archetype:create :创建 Maven 项目
mvn compile :编译源代码
mvn test-compile :编译测试代码
mvn test : 运行应用程序中的单元测试
mvn site : 生成项目相关信息的网站
mvn clean :清除目标目录中的生成结果
mvn package : 依据项目生成 jar 文件或者打zip包
mvn install :在本地 Repository 中安装 jar

mvn deploy:发布到私服上
mvn eclipse:eclipse :生成 Eclipse 项目文件
mvn -Dmaven.test.skip=true : 忽略测试文档编译
mvn archetype:generate 你是怎么创建你的maven项目的?是不是像这样:mvn archetype:create -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=com.ryanote -Dartifact=common,如果你还再用的话,那你就out了,现代人都用mvn archetype:generate了,它将创建项目这件枯燥的事更加人性化,你再也不需要记那么多的archetypeArtifactId,你只需输入archetype:generate,剩下的就是做”选择题”了.
mvn tomcat:run 用了maven后,你再也不需要用eclipse里的tomcat来运行web项目(实际工作中经常会发现用它会出现不同步更新的情况),只需在对应目录(如/ryanote)里运行 mvn tomat:run命令,然后就可在浏览器里运行http://localhost:8080/ryanote查看了.如果你想要更多的定制,可以在pom.xml文件里加下面配置: 01 02 03 04 org.codehaus.mojo 05 tomcat-maven-plugin 06 07 /web 08 9090 09 10 11 当然你也可以在命令里加参数来实现特定的功能,下面几个比较常用: 1. 跳过测试:-Dmaven.test.skip(=true) 2. 指定端口:-Dmaven.tomcat.port=9090 3. 忽略测试失败:-Dmaven.test.failure.ignore=true 当然,如果你的其它关联项目有过更新的话,一定要在项目根目录下运行mvn clean install来执行更新,再运行mvn tomcat:run使改动生效.
mvnDebug tomcat:run 这条命令主要用来远程测试,它会监听远程测试用的8000端口,在eclipse里打开远程测试后,它就会跑起来了,设断点,调试,一切都是这么简单.上面提到的那几个参数在这里同样适用
mvn dependency:sources 故名思义,有了它,你就不用到处找源码了,运行一下,你项目里所依赖的jar包的源码就都有了    

2.依赖      

  使用 Maven 可以方便的管理依赖,如下是一段在 pom.xml 文件中声明依赖的代码示例:

 

 

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>3.2.0.RELEASE</version>
        <type>jar</type>
        <scope>test</scope>
        <systemPath>${java.home}/lib/rt.jar</systemPath>
        <optional>false</optional>
        <exclusions>
            <exclusion></exclusion>
        </exclusions>
    </dependency>
</dependencies>

type:依赖类型,对应构件中定义的 packaging,可不声明,默认为 jar;

 

scope:依赖范围;

optional:依赖是否可选;

exclusions:排除传递依赖。

                                                                                                               

 3.maven依赖关系中Scope的作用 

执行不同的 Maven 命令(mvn package,mvn test,mvn install ……),会使用不同的 classpath,Maven 对应的有三套 classpath:编译classpath、测试classpath,运行classpath。scope 选项的值,决定了该依赖构件会被引入到哪一个 classpath 中。

 

compile:编译依赖范围,默认值。此选项对编译、测试、运行三种 classpath 都有效,如 hibernate-core-3.6.5.Final.jar,表明在编译、测试、运行的时候都需要该依赖;

test:测试依赖范围。只对测试有效,表明只在测试的时候需要,在编译和运行时将无法使用该类依赖,如 junit;

provided:已提供依赖范围。编译和测试有效,运行无效。如 servlet-api ,在项目运行时,tomcat 等容器已经提供,无需 Maven 重复引入;

runtime:运行时依赖范围。测试和运行有效,编译无效。如 jdbc 驱动实现,编译时只需接口,测试或运行时才需要具体的 jdbc 驱动实现;

system:系统依赖范围。和 provided 依赖范围一致,需要通过 <systemPath> 显示指定,且可以引用环境变量;

import:导入依赖范围。使用该选项,通常需要 <type>pom</type>,将目标 pom 的 dependencyManagement 配置导入合并到当前 pom 的  dependencyManagement 元素。


4.maven的坐标


maven 的所有构件均通过坐标进行组织和管理。maven 的坐标通过 5 个元素进行定义,其中 groupId、artifactId、version 是必须的,packaging 是可选的(默认为jar),classifier 是不能直接定义的。

 

groupId:定义当前 Maven 项目所属的实际项目,跟 Java 包名类似,通常与域名反向一一对应。

artifactId:定义当前 Maven 项目的一个模块,默认情况下,Maven 生成的构件,其文件名会以 artifactId 开头,如 hibernate-core-3.6.5.Final.jar。

version:定义项目版本。

packaging:定义项目打包方式,如 jar,war,pom,zip ……,默认为 jar。

classifier:定义项目的附属构件,如 hibernate-core-3.6.6.Final-sources.jar,hibernate-core-3.6.6.Final-javadoc.jar,其中 sources 和 javadoc 就是这两个附属构件的 classifier。classifier 不能直接定义,通常由附加的插件帮助生成。 

5.maven依赖

依赖冲突

通常我们不需要关心传递性依赖,当多个传递性依赖中有对同一构件不同版本的依赖时,如何解决呢?

 

短路径优先:假如有以下依赖:A -> B -> C ->X(版本 1.0) 和 A -> D -> X(版本 2.0),则优先解析较短路径的 X(版本 2.0);

 

先声明优先:若路径长度相同,则谁先声明,谁被解析,如果希望精确的空子依赖包,可以使用依赖的排除功能

依赖排除

  针对依赖冲突中的“短路径优先”,如果我们想使用长路径的依赖怎么办呢?这时可以使用依赖排除 <exclusions> 元素,显示排除短路径依赖。在非冲突的情况下,这种方法同样有效。

6.maven常用变量

      在配置 pom.xml 文件时我们经常会使用到一些 Maven 中提前定义好的变量来统一控制某些关键参数,使得 pom 文件的管理更为合理。

        注:在 Maven 的 3.X 版本以后,所有的 pom.* 参数全部改为了 project.*。

        Maven 开发中使用的 ${XXX} 类型的参数大体可分为7类:

1.Built-in properties  内置参数

        ${basedir} 代表项目中 pom.xml 文件所在的文件夹;

        ${version} 代表项目的版本,等价于 ${project.version}(老版本中的 ${pom.version}),即 pom 文件中<version></version>标签内定义的版本号。

2.Pom/Project properties  Pom/项目参数

        所有在 pom 文件中定义的项目相关元素,可通过 project. 前缀(老版本中的 pom. 前缀)来进行引用。

        ${project.build.directory} 代表了项目编译后的目录,等同于 ${pom.project.build.directory},默认为“target”;

        ${project.build.outputDirectory} 代表了项目输出目录,默认为“target/classes”;

        ${project.name} 代表了项目名称(老版本中的 ${pom.name}),即 pom 文件中<name></name>标签内定义的项目名称;

        ${project.build.finalName} 代表了项目最终打包后生成文件的名称,即 pom 文件中<finalName></finalName>标签内定义的项目打包名称。

3.Local user settings  用户本地配置参数

        在用户 settings.xml 文件中定义的元素,可通过 settings. 前缀来进行引用。

        ${settings.localRepository} 代表了本地仓库路径,即 settings 文件中定义的本地仓库路径。

4.Environment variables  环境变量

        系统环境变量可以通过 env. 前缀来进行引用。

        ${env.M2_HOME} 代表了环境变量中配置的 M2_HOME 的值;

        ${java.home} 代表了环境变量中配置的 JAVA_HOME 的值。

5.Java system propertie  Java 系统参数

        同样可以引用 JVM 中定义的 Java 系统参数。

6.Custom properties in the POM  用户自定义参数

        用户在 pom.xml 文件中可自定义参数,并进行引用。

        ${jdk.version} 代表了 JDK 的版本参数,即 pom 文件中<properties></properties>标签内定义的<jdk.version></jdk.version>标签中的值。

7.Parent Project variables  父级参数

        父级 pom.xml 文件中定义的元素,可通过 parent. 前缀来进行引用。

        ${parent.version} 代表了 父级 pom 文件中<version></version>标签内定义的版本号。

 

 

 

猜你喜欢

转载自blueyan.iteye.com/blog/2276106