Maven basis

 Maven

     本部分有很多都摘自一篇 maven 的书。 Maven 是一个优秀的构建工具,能够帮我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。Maven 是跨平台的,这意味着无论是在Windows 上,还是在 Linux 或者 Mac 上,都可以使用同样的命令。
     在不了解 maven 时,你可以想象它完成的是像 make 或 ant 那样的功能。就 像 Make 的 makefile,Ant 的 build.xml 一样,Maven 项目的核心是pom.xml。 POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述 项目如何构建,声明项目依赖,等等。打开 opendaylight controller 代码的任意一 个目录,例如 controller/arphandler 目录,就可以看到 pom.xml,稍后,简单分析 下 pom.xml,网上也有很多相关的文章。 使用 Ubuntu 的 apt-get install 安装 maven 时,maven 的安装目录一般在/usr/share/maven,Maven 的安装目录被称之为 M2_HOME(我在试验时,环境变量没有设臵这一项,所以不确定若不设臵这一环境变量有什么后果)。
      以下是 maven 安装目录的分析:

  • Bin:该目录包含了 mvn 运行的脚本,这些脚本用来配臵 Java 命令,准备好 classpath 和相关的 Java 系统属性,然后执行 Java 命令。其中 mvn 是基于UNIX平台的 shell 脚本,mvn.bat 是基于 Windows 平台的 bat 脚 本。在命令行输入任何一条 mvn 命令时,实际上就是在调用这些脚本。 该目录还包含了 mvnDebug 和 mvnDebug.bat 两个文件,同样,前者是 UNIX 平台的 shell 脚本,后者是 windows 的 bat 脚本。那么 mvn 和mvnDebug 有什么区别和关系呢?打开文件我们就可以看到,两者基本是一样的,只是 mvnDebug 多了一条 MAVEN_DEBUG_OPTS 配臵,作用就 是在运行 Maven 时开启 debug,以便调试 Maven 本身。此外,该目录还 包含 m2.conf 文件。
  • Boot 目录: 据说普通用户不需要关心这个目录。
  • Conf:该目录包含了一个非常重要的文件 settings.xml。直接修改该文件, 就能在机器上全局地定制 Maven 的行为。一般情况下,我们更偏向于复 制该文件至 home 目录下的.m2/目录下(这里~表示用户目录),然后修改 该文件,在用户范围定制 Maven的行为。~/.m2是默认的maven本地仓库, 我 们 可 以 通 过 加 入 环 境 变 量 (export MAVEN_OPTS="-Dmaven.repo.local=/path/to/repository")来修改本地仓库 的路径。~/.m2 的作用在下面详细介绍。关于 setting.xml 对于 maven 应该 是一个很重要的文件, 导入工程到 Eclipse 和 Intellij idea 两个 IDE中时都 需要将 setting.xml 的位臵设臵正确。
  • Lib:该目录包含了所有 Maven 运行时需要的 Java 类库。
      .~/m2/repository 目录为 maven 的本地仓库,观察 mvn clean install 执行时, 会发现有很多 download 的过程,download 下的内容即保存到了 repository 下 的对应目录下了。从目前的经验来看,安装到这个仓库的内容包括执行 mvn 命令时需要的或 pom.xml 所依赖的各种插件。按照 maven 的一些资料所述, 一个 maven 构件若想能被其他 maven 项目使用,则需要将此构建安装到本地 仓库中,但是我还不确定这一点在 opendaylight controller 上是怎么表现的,因 为我查看 repository 中没有 controller 各个 bundle 的 jar,也许跟使用的 OSGI 框架有关。
       maven 的主要命令包括:mvn clean compile、mvn clean test、mvn clean package、mvn clean install。Clean 是清空,compile 是编译,test 是编译 java 的 test 代码,package 是打包,打包默认存放路径是 target/目录,install 是将打包出的.jar 安装



https://maven.apache.org/guides/getting-started/index.html

We are going to jump headlong into creating your first Maven project! To create our first Maven project we are going to use Maven's archetype mechanism. An archetype is defined as an original pattern or model from which all other things of the same kind are made. In Maven, an archetype is a template of a project which is combined with some user input to produce a working Maven project that has been tailored to the user's requirements. We are going to show you how the archetype mechanism works now, but if you would like to know more about archetypes please refer to our Introduction to Archetypes.
On to creating your first project! In order to create the simplest of Maven projects, execute the following from the command line:
  1. mvn -B archetype:generate \
  2. -DarchetypeGroupId=org.apache.maven.archetypes \
  3. -DgroupId=com.mycompany.app \
  4. -DartifactId=my-app
Once you have executed this command, you will notice a few things have happened. First, you will notice that a directory named my-app has been created for the new project, and this directory contains a file named pom.xml that should look like this:
  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  4. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.mycompany.app</groupId>
  7. <artifactId>my-app</artifactId>
  8. <packaging>jar</packaging>
  9. <version>1.0-SNAPSHOT</version>
  10. <name>Maven Quick Start Archetype</name>
  11. <url>http://maven.apache.org</url>
  12. <dependencies>
  13. <dependency>
  14. <groupId>junit</groupId>
  15. <artifactId>junit</artifactId>
  16. <version>4.11</version>
  17. <scope>test</scope>
  18. </dependency>
  19. </dependencies>
  20. </project>

pom.xml包含此项目的项目对象模型(POM)。 POM是Maven的基本工作单元。这是很重要的,因为Maven本质上是以项目为中心的,因为一切都围绕着一个项目的概念。简而言之,POM包含关于您的项目的所有重要信息,并且基本上是一站式购物,用于查找与您的项目相关的任何内容。理解POM是重要的,并且鼓励新用户参考POM的介绍。

这是一个非常简单的POM,但仍然显示每个POM包含的关键元素,所以让我们逐步了解每个POM,以熟悉POM要点:

project这是所有Maven pom.xml文件中的顶级元素。
modelVersion此元素指示此POM正在使用的对象模型的版本。模型本身的版本变化很少,但它是强制性的,以确保使用的稳定性,如果和当Maven开发人员认为有必要更改模型。
groupId此元素指示创建项目的组织或组的唯一标识符。 groupId是项目的关键标识符之一,通常基于组织的完全限定域名。例如org.apache.maven.plugins是所有Maven插件的指定groupId。
artifactId此元素指示此项目生成的主工件的唯一基本名称。项目的主要工件通常是JAR文件。次级工件(如源包)还将artifactId用作其最终名称的一部分。 Maven产生的典型工件的形式为<artifactId> - <version>。<extension>(例如,myapp-1.0.jar)。
packaging此元素指示此工件要使用的包类型(例如JAR,WAR,EAR等)。这不仅意味着产生的工件是JAR,WAR或EAR,而且还可以指示要用作构建过程的一部分的特定生命周期。 (生命周期是我们将在指南中进一步讨论的主题。现在,请记住,项目的指定包装可以在定制构建生命周期中发挥作用)。包装元素的默认值是JAR因此您不必为大多数项目指定此选项。
version此元素指示项目生成的工件的版本。 Maven在很大程度上帮助你进行版本管理,你经常会在一个版本中看到SNAPSHOT指示符,这表明一个项目处于开发状态。我们将在本指南中讨论快照的使用及其如何进一步工作。
name此元素表示用于项目的显示名称。这常用于Maven的生成文档。
url此元素指示可以在哪里找到项目的网站。这常用于Maven的生成文档。
description此元素提供项目的基本描述。这常用于Maven的生成文档。
有关可在POM中使用的元素的完整参考,请参考我们的POM参考。现在让我们回到手头的项目。

在您的第一个项目的原型生成后,您还将注意到已创建以下目录结构:


  1. my-app
  2. |-- pom.xml
  3. `-- src
  4. |-- main
  5. | `-- java
  6. | `-- com
  7. | `-- mycompany
  8. | `-- app
  9. | `-- App.java
  10. `-- test
  11. `-- java
  12. `-- com
  13. `-- mycompany
  14. `-- app
  15. `-- AppTest.java


如您所见,从原型创建的项目具有POM,应用程序源的源代码树和测试源的源代码树。 这是Maven项目的标准布局(应用程序源驻留在$ {basedir} / src / main / java中,测试源驻留在$ {basedir} / src / test / java中,其中$ {basedir} .xml)。

如果你要手工创建一个Maven项目,这是我们建议使用的目录结构。 这是一个Maven约定,要了解更多信息,您可以阅读我们的标准目录布局简介。


现在我们有一个POM,一些应用程序源,以及一些测试源你可能会问...






How do I compile my test sources and run my unit tests?



现在你成功地编译了应用程序的源代码,现在你有了一些单元测试,你想要编译和执行(因为每个程序员总是写和执行单元测试*微移nudge wink wink *)。


  1. [INFO] ----------------------------------------------------------------------------
  2. [INFO] Building Maven Quick Start Archetype
  3. [INFO] task-segment: [test]
  4. [INFO] ----------------------------------------------------------------------------
  5. [INFO] artifact org.apache.maven.plugins:maven-surefire-plugin: \
  6. checking for updates from central
  7. ...
  8. [INFO] [resources:resources]
  9. [INFO] [compiler:compile]
  10. [INFO] Nothing to compile - all classes are up to date
  11. [INFO] [resources:testResources]
  12. [INFO] [compiler:testCompile]
  13. Compiling 1 source file to C:\Test\Maven2\test\my-app\target\test-classes
  14. ...
  15. [INFO] [surefire:test]
  16. [INFO] Setting reports dir: C:\Test\Maven2\test\my-app\target/surefire-reports
  17.  
  18. -------------------------------------------------------
  19. T E S T S
  20. -------------------------------------------------------
  21. [surefire] Running com.mycompany.app.AppTest
  22. [surefire] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0 sec
  23.  
  24. Results :
  25. [surefire] Tests run: 1, Failures: 0, Errors: 0
  26.  
  27. [INFO] ----------------------------------------------------------------------------
  28. [INFO] BUILD SUCCESSFUL
  29. [INFO] ----------------------------------------------------------------------------
  30. [INFO] Total time: 15 seconds
  31. [INFO] Finished at: Thu Oct 06 08:12:17 MDT 2005
  32. [INFO] Final Memory: 2M/8M
  33. [INFO] ----------------------------------------------------------------------------















评论

此博客中的热门博文

openflow switch(I)

YANG Tools:YANG to Java Mapping

OpenDaylight架构简介