• maven 学习总结


     

    1、关于Maven

    最近学了一些maven方面的知识,感觉这个工具挺好用,为防遗忘现总结一下。Maven是一个项目管理工具,它可以通过一段描述信息来管理项目的构建、报告和文档的软件项目管理工具。它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。项目的主页地址为:http://maven.apache.org/

    2、配置文件

    Maven2 主要配置文件有pom.xml和settings.xml。

    2.1 pom.xml

    我们知道,Maven项目,依赖,构建配置,以及构件,所有这些都是要建模和表述的对象,这些对象就是通过pom.xml 文件描述的。这个POM 告诉Maven它正处理什么类型的项目,如何修改默认的行为来从源码生成输出等等。该文件就是Maven中一个项目的描述性陈述;也是当Maven构建项目的时候需要理解的一份“地图”。

    它包含的基本项如下:

    • poject 这是pom.xml的顶级元素。
    •  modelVersion 这是元素指出了这个POM使用的是那个版本的对象模型。这个模型的版本自身么是经常改变的,但这种改变是为了使模型更加的稳定。
    •  groupId 这个元素指出创建这个工程的组织或团队的唯一标识,并且这个也是一个项目的关键标识,推荐使用这个组织或团队的完整域名。例如:org.apache.maven.plugins是为Maven plug-ins定义的groupId。
    •  artifactId 这个元素指出这个工程的主要制品的基本名称。一个工程的主要制品如果是jar文件,次要制品如果是源码包,则次要制品的名称的一部分也使用artifactId。典型的制品名称使用这样的格式:<artifactId>-<version>.<extension>(例如,myapp-1.0.jar)。
    •  packaging 这个元素指出制品的类型(例如:JAR,WAR,EAR等等)。这个元素不仅仅指示出制品的类型,同时也指示出工程构建过程中的部分生命周期。Packaging的默认值是JAR。
    •  version 这个元素指出这个项目产生的制品的版本号,Maven在帮助开发人员管理版本号时走了很长的路,以后你将经常看到SNAPSHOT在一个版本中,这个表示一个工程仍然在开发状态。
    •  name 这个元素指出这个工程显示的名称。这个常用于Maven产生的文档中。
    •  url 这个员算指出在哪里能发现工程的站点。这个常用于Maven产生的文档中。
    •  desription 这个元素提供了这个工程基本的描述。这个也常用于Maven产生的文档中。

    以上只是pom.xml中的一些基本项,完整的pom.xml的元素介绍请参考:

    http://maven.apache.org/maven-model/maven.html

    2.2 settings.xml

    在Maven2中,配置使用settings.xml,它取代了原有的project.properties和build.properties。配置在Maven2中存在两种级别:

    • 用户级,针对操作系统登录用户而言。一般在$home/.m2/,对于windows用户,就是目录:C:\Documents and Settings\用户名\.m2\settings.xml。
    •  全局级:一般在%M2_HOME%/conf/settings.xml,M2_HOME是Maven2的根目录环境变量名。

    在settings.xml中可以配置,如本地Repository、proxy等等.

    3、目录结构

    Maven2的标准目录结构如下:

    maven 学习总结 - jean - jean

    使用目录模板,可以使pom.xml更简洁。因为Maven2已经根据缺省目录,预定义了相关的动作,而无需人工的干预。以resources目录为例:

    • src/main/resources,负责管理项目主体的资源。在使用Maven2执行compile之后,这个目录中的所有文件及子目录,会复制到target/classes目录中,为以后的打包提供了方便。
    •  src/test/resources,负责管理项目测试的资源。在使用Maven2执行test-compile之后,这个目录中的所有文件及子目录,会复制到target/test-classes目录中,为后续的测试做好了准备。

    4、安装maven2

    安装Maven2的步骤非常简单:首先从Maven官方网站http://maven.apache.org/下载相应的软件包,目前是Maven 2.0.4;然后解压,并设置环境变量M2_HOME= Maven2的解压安装目录;最后将%M2_HOME%/bin添加到path中,方便Maven在任何目录下运行。检查一下是否已经完成安装,打开dos窗口,输入mvn –v,如果出现一下信息则表示maven2已经安装成功:

    X:>mvn –v

    Maven Version2.0.4

    5、常用运行命令

    Maven2的运行命令是mvn,使用mvn -h可以获得相关的帮助信息。常用情形:

    • 创建Maven项目:mvn archetype:create
    •  编译源代码:mvn compile
    •  编译测试代码:mvn test-compile
    •  运行测试:mvn test
    •  产生site:mvn site
    •  打包:mvn package
    •  在本地Repository中安装jar:mvn install
    •  清除产生的项目:mvn clean

    6、项目开发

    61创建项目的步骤

    生成项目布局:mvn archetype:create -DgroupId=com.oreilly -DartifactId=my-app

    创建完项目后,我们可以往项目里添加代码并使用Maven的所有全新技巧。注意以下命令必须在pom.xml文件所在的目录中运行。
    –mvn test:运行应用程序中的单元测试
    –mvn package:依据项目生成jar文件,以备依赖此项目时使用

    –mvn install:将项目的jar文件添加到库中,
    –mvn site:生成项目相关信息的网站
    –mvn clean:清除目标目录中的生成结果
    –mvn eclipse:eclipse:生成Eclipse项目文件

    6.2 生命周期的引入

    在Maven2中有了明确的生命周期概念,而且都提供与之对应的命令,使得项目构建更加清晰明了。主要的生命周期阶段:

    • validate,验证工程是否正确,所有需要的资源是否可用。
    •  compile,编译项目的源代码。
    •  test-compile,编译项目测试代码。
    •  test,使用已编译的测试代码,测试已编译的源代码。
    •  package,已发布的格式,如jar,将已编译的源代码打包。
    •  integration-test,在集成测试可以运行的环境中处理和发布包。
    •  verify,运行任何检查,验证包是否有效且达到质量标准。
    •  install,把包安装在本地的repository中,可以被其他工程作为依赖来使用
    •  deploy,在整合或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
    •  generate-sources,产生应用需要的任何额外的源代码,如xdoclet。

    如果要执行项目编译,那么直接输入:mvn compile即可,对于其他的阶段可以类推。阶段之间是存在依赖关系(dependency)的,如test依赖test-compile。在执行mvn test时,会先运行mvn test-compile,然后才是mvn test。

    7、依赖管理

    为了给项目添加一个依赖项,必须将此依赖项添加到pom.xml文件中。下次运行Maven的时候,它将从Ibiblio存储库中得到这个依赖项,并且将此依赖项添加到项目构建路径中。Maven中最大的麻烦之处就是不能从Maven存储库中获取Sun的jar文件。这个问题归因于Sun在其代码中设置的许可证限制。解决这个问题的办法有两种,一种是下载这些代码并将它们安装在您本地的存储库中,另一种是做一个外部声明,并将这个声明指向文件系统中依赖项所在的位置。改变Maven的存储库路径只需简单地编辑其安装目录下 conf文件夹下面的settings.xml文件即可

    在Maven中使用依赖是简单的。让我们看看往上述pom.xml文件中添加一个依赖项的情况。

    <dependency>
    <groupId>quartz</groupId>
    <artifactId>quartz</artifactId>
    <version>1.5.1</version>
    <scope>compile</scope>
    </dependency>

    注意到scope参数的使用,它告诉了Maven依赖项在何种阶段是所需的。在使用JUnit的情况下,我们设置scope参数的值为test来告诉Maven这个依赖项只是在测试阶段所需的,而不是运行时所需的资源。以下是scope参数值的说明:
    –compile:默认值。表明是所有任务所需的资源
    –test:运行所有的测试用例时所需资源
    –runtime:表明是运行时所需资源
    –provided:JDK部分或应用服务器的classpath所需的资源

    8、手动安装jar包到本地存储库

    如何处理那些麻烦的Sun的jar包和那些需要但却不能在远程存储库中找到的jar包呢?我们必须使用Maven来手动将这些jar包安装到本地的存储库中。为了做个示例,我们将安装Java Activation框架的jar包。首先我们必须从Sun的站点上下载此jar包,接着我们使用Maven将它导入本地的存储库中。您自己也可以按照 Maven上传资源指南中的指导将缺少的jar包安装到Ibiblio中。
    mvn install:install-file -Dfile=activation.jar
    -DgroupId=javax.activation -DartifactId=activation
    -Dversion=1.0 -Dpackaging=jar

    9、配置存储库

    要求项目的每个开发者必须在conf目录中配置存储库是不方便的,所以Maven可以同时查看多个存储库并且将它们全部配置在pom.xml文件中。让我们看看一个例子,它展示了如何在应用程序用使用多个存储库。在以下从pom.xml文件摘录的片断中,我们设置了两个存储库来让Maven寻找依赖项。 Ibiblio一直是默认的存储库,我们又添加了Planet Mirror作为后援存储库。我们也可以让团队使用的本地web服务器作为第二个存储库。

    <repositories>
    <repository>
    <id>Ibiblio</id>
    <name>Ibiblio</name>
    <url>http://www.ibiblio.org/maven/</url>
    </repository>
    <repository>
    <id>PlanetMirror</id>
    <name>Planet Mirror</name>
    <url>http://public.planetmirror.com/pub/maven/</url>
    </repository>
    </repositories>

    10、使用pom.xml父文件来构建多个项目

    软件公司通常的一种做法就是将多个项目构建到主要产品中。维护依赖关系链和一次性地构建整个产品足以成为一个挑战,但是如果使用Maven的话,事情将变得简单。如果您创建了一个指向其它子模块的pom.xml父文件,Maven将为您处理整个构建过程。它将分析每个子模块的pom.xml文件,并且按照这些子模块的相互依赖顺序来构建项目。如果每个项目明确地指明它们的依赖项,那么子模块在父文件中的放置顺序是不造成任何影响的。但是考虑到其他的开发者,最好保证子模块在pom.xml父文件中的放置顺序和您期望的子项目被构建的顺序一样。下面我们看个示例。
    pom.xml主文件如下:
    <project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.oreilly</groupId>
    <version>1.0-SNAPSHOT</version>
    <artifactId>my-app</artifactId>
    <packaging>pom</packaging>
    <modules>
    <module>Common</module>
    <module>Utilities</module>
    <module>Application</module>
    <module>WebApplication</module>
    </modules>
    </project>
    我们需要确保WebApplication子模块包含了所有的三个jar包,所以需要将这些jar包声明为依赖项。在这个例子中,Utilities项目依赖于Common项目,所以Utilities项目中需要添加一个对Common项目的依赖。Application子模块也是同样的道理,因为它依赖于 Common和Utilities项目,Utilities又赖于Common。如果这个例子中有60个子模块,并且它们都相互依赖,这会使得新开发者难以算出什么项目依赖于其它项目,所以这正好是要求确保pom.xml父文件中项目放置顺序要清除的原因。
    以下是Utility模块的依赖项:
    <dependencies>
    <dependency>
    <groupId>com.oreilly</groupId>
    <artifactId>Common</artifactId>
    <version>1.0-SNAPSHOT</version>
    </dependency>
    </dependencies>

    现在,我们只需为每个子模块的pom.xml文件添加一个元素来表明它们是一个逻辑构建的一部分:
    <parent>
    <groupId>com.oreilly</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0-SNAPSHOT</version>
    </parent>
    在pom.xml父文件所在的同一个目录中,存在有项目目录:Common, Utilities, Application, 和WebApplication。当我们在该目录中运行mvn package命令时,这些项目会按照依赖顺序而被构建。

    11、插件和报表

    Maven2.0 有大量的插件可以使用。不幸的是,由于Maven的重写,Maven1.0的插件不能在2.0中使用。尽管如此,还是存在一些可以使用的Maven2.0 的插件。下面pom.xml文件中的插件配置示例是直接从Maven2.0网站上得来的。这个插件是用来配置编译选项的。

    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
    <source>1.5</source>
    <target>1.5</target>
    </configuration>
    </plugin>
    </plugins>
    Maven报表插件可以用来生成不同的报表,这些报表是在当你使用mvn site命令生成项目的站点时产生的。下面的例子展示了如何使用<reporting>元素来配置这类插件中的一个。
    <reporting>
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-project-info-reports-plugin</artifactId>
    </plugin>
    </plugins>
    </reporting>

    12、总结

    Maven2.0 有着许多实用的特点,并且完成任务十分出色。Maven中最值得称赞的地方就是使用了标准的目录结构和部署。这就使得开发人员能够适应不同的项目,并且不用学习任何结构方面新的东西,也不用掌握特殊的指令来构建结构。Maven可以通过纯脚本来实现。在文档方面,由于使用了项目站点构建工具,所以当项目构建完成后,您可以查看所有开发的当前状态。

    作者:张锋
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
    更多精彩文章可以观注
    微信公众号 soft张三丰

    微信交流群,添加群主微信,邀请入群
  • 相关阅读:
    nginx学习,下载、安装。使用:正向代理、反向代理、负载均衡
    idea一键导入所有包
    开源小工具-随机生成图片验证码
    记一次Nginx报错403(Permission denied)
    记一次swf视频转mp4经历
    enumerate函数
    filter函数过滤序列
    RetinaNet pytorch implement from scratch 03--Focal Loss
    [读论文]Weighted Boxes Fusion 代替NMS的result ensemble
    Pytorch使用autograd.function自定义op
  • 原文地址:https://www.cnblogs.com/skyme/p/2146112.html
Copyright © 2020-2023  润新知