一、用Maven Archetype插件创建简单项目。
1>在终端(* UNIX或Mac)或命令提示符(Windows)中,浏览到要创建 Java 项目的文件夹。键入以下命令:
mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name}-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false这告诉 Maven 来从 maven-archetype-quickstart 模板创建 Java 项目。如果忽视 archetypeArtifactId 选项,一个巨大的 Maven 模板列表将列出。
例如,这里的工作目录是:C:\worksp,执行命令过程时间可能比较久,看个人的网络状况。
C:\worksp>mvn archetype:generate -DgroupId=com.yiibai -DartifactId=NumberGenerat or -DarchetypeArtifactId=maven -archetype-quickstart -DinteractiveMode=false [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Maven Stub Project (No POM) 1 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > generate-sources @ standalone-pom >>> [INFO] [INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < generate-sources @ standalone-pom <<< [INFO] [INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom -- - [INFO] Generating project in Batch mode [INFO] ------------------------------------------------------------------------- --- [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0 [INFO] ------------------------------------------------------------------------- --- [INFO] Parameter: basedir, Value: C:\worksp [INFO] Parameter: package, Value: com.yiibai [INFO] Parameter: groupId, Value: com.yiibai [INFO] Parameter: artifactId, Value: NumberGenerator [INFO] Parameter: packageName, Value: com.yiibai [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] project created from Old (1.x) Archetype in dir: C:\worksp\NumberGenerato r [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 23.166 s [INFO] Finished at: 2015-10-27T11:03:48+08:00 [INFO] Final Memory: 17M/114M [INFO] ------------------------------------------------------------------------在上述情况下,一个新的Java项目命名 “NumberGenerator”, 而整个项目的目录结构会自动创建。
2>Maven的目录结构
使用 mvn archetype:generate + maven-archetype-quickstart 模板, 以下项目的目录结构被创建。
NumberGenerator |-src |---main |-----java |-------com |---------yiibai |-----------App.java |---test|-----java |-------com |---------yiibai |-----------AppTest.java |-pom.xml这个生成的目录遵循Maven标准目录布局。
a>artifactId匹配的目录----NumberGenerator。这是项目的基本目录,即项目名。
b>每个项目在文件pom.xml里有它的项目对象模型(POM)。这个文件描述了这个项目,配置了插件,声明了依赖。
c>项目源码和资源文件被放在src/main目录下,Java类放在src/main/java下面,而classpath资源文件放在src/main/resources下面。
d>测试文件放在src/test。其中src/test/java存放Java测试类,目录src/test/resources下存放测试的classpath资源文件。
二、构建Maven项目
遵循Maven插件创建了一个项目,希望构建并打包这个应用,在包含pom.xml的目录下运行mvn install
这样就创建、编译、测试、打包,并且安装了最简单的Maven项目。在命令行运行它来验证这个程序是否工作。
在pom.xml目录下运行
java -cp target/simple-1.0-SNAPSHOT.jar org.sonatype.mavenbook.App
三、简单的项目对象模型
当Maven运行时向项目对象模型(POM)查看关于这个项目的信息。
1>这个pom.xml文件时面对Maven项目中最基础的POM,最开始的几个元素-groupId,artifactId,packaging,version-是Maven的坐标,它们唯一标识了一个项目。name和url是POM提供的描述性元素,它们提供可阅读的名字,项目关联的web站点。最后,dependencies元素定义了一个单独的测试范围依赖,依赖于称为JUnit的单元测试框架。<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>4.0.0</modelVersion> <groupId>com.companyname.bank</groupId> <artifactId>consumerBanking</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>consumerBanking</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
2>当Maven运行时,采用许多的全局默认值。想看真正运行时的“有效的”POM,在simple项目的基础目录下跑下面的命令。
四、核心概念mvn help:effective-pom
( 1 )Maven插件和目标
( 2 )Maven生命周期
1>一个阶段是在被Maven称为“构建生命周期”中的一个步骤。生命周期是包含在一个项目构建中的一系列有序的阶段。Maven可以支持许多不同的生命周期,但是最常用的生命周期是默认的Maven生命周期,这个生命周期中一开始的一个阶段是验证项目的基本完整性,最后一个阶段是把一个项目发布成产品。
2>生命周期的阶段被特地留的含糊,单独的定义为验证、测试、或者发布,而他们对不同的项目意味着不同的事情。
3>插件目标可以附着在生命周期阶段上。随着生命周期的阶段移动,他会执行附着在特定阶段上的目标。每个阶段可能绑定了零个或多个目标。
( 3 )Maven坐标
1>Maven坐标通常用冒号作为分隔符,格式为:groupId:artifactId:packaging:version
groupId 团体,公司,小组,组织,项目,或者其它团体。
artifactId 在groupId下的表示一个单独项目的唯一标识符
version 一个项目的特定版本。正在开发的项目可以用一个特殊的标识,这种标识给版本加上一个“SNAPSHOT”的标记。
2>项目的打包格式也是Maven坐标的重要组成部分,但是它不是项目唯一标识符的一个部分。之前的三个标识使项目独一无二。
packaging 项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个JAR文件,类型为war的项目产生一个web应用。
( 4 )Maven仓库
1>初始的Maven下载包相当的小,其中的一个原因是事实上这个初始的Maven不包括很多插件。它只包含几近赤裸的最少值,而在需要的时候再从远程仓库去取。Maven自带了一个用来下载Maven核心插件和依赖的远程仓库地址(http://repo1.maven.org/maven2)。
2>Maven仓库的标准是按照下面的目录格式来存储构件,相对于仓库的根目录:
/<groupId>/<artifactId>/<version>/<artifactId>-<version>.<packaging>
3>Maven从远程仓库下载构件和插件到本机上,存储在你的本地Maven仓库里。一旦Maven已经从远程仓库下载了一个构件,它将永远不需要再下载一次,因为maven会首先在本地仓库查找插件,然后才是其它地方。
注:install阶段执行一个目标,把你项目的构件安装到你的本地仓库。
Maven仓库既是一个从远程仓库下载的构件的缓存,也允许你的项目相互依赖。
( 5 )Maven依赖管理
1>一个复杂的项目将会包含很多依赖,也有可能包含依赖于其它构件的依赖。这是Maven最强大的特征之一,它支持传递性依赖。
即:假如你的项目依赖于一个库,而这个库又依赖于五个或十个其它的库,你不必找出所有的依赖写入pom.xml,你只需加入你直接依赖的那些库,Maven会隐式的把这些库间接依赖的库加入到你的项目。而且会处理这些依赖中的冲突,同时能让你自定义默认行为,或者排除一些特定的传递性依赖。
2>当项目的构件安装到本地仓库时,在jar文件同一目录下,Maven发布了一个稍微修改过的pom.xml的版本。记录了项目有哪些依赖,以便实现传递性依赖。
3>在POM文件中可能声明了对其它构件的依赖。这些依赖的依赖叫做传递性依赖。
Maven仓库不仅仅存储二进制文件,也存储了这些构件的元数据,才使传递性依赖成为可能。
( 6 )站点生成和报告
注:在学习过程中,发现版本更新差异,所以可以结合http://www.yiibai.com/maven/create-a-java-project-with-maven.html学习。Maven的另一个重要特征是,生成文档和报告。在项目目录下,运行mvn site
Site生命周期只关心处理在src/site目录下的site内容,还有生成报告。在这个命令运行过后,你将会在target/site目录下看到一个项目的web站点。