(一下红色字体表示重要信息或者自己写的备注)
1.maven的安装。
1.需要安装JDK,使用java -version查看,或者使用javac确认。 2.http://maven.apache.org/download.html 3.网站下载最新版本的maven。
4.window系统,需要配置环境变量:
M2_HOME=c:/Program Files/maven-2.0.9 PATH=%PATH%;%M2_HOME%/bin 5.使用mvn -v命令查看mvn是否已经正确安装
2.maven help命令。
1.help:active-profiles : 列出当前构建中活动的Profile(项目的,用户的,全局的)。 2.help:effective-pom : 显示当前构建的实际POM,包含活动的Profile。
3.help:effective-settings : 打印出项目的实际settings, 包括从全局的settings 和用户级别settings 继承的配置
4.help:describe : 描述插件的属性。它不需要在项目目录下运行。但是你必须提供你想要描述插件的 groupId 和 artifactId。
3.创建一个maven项目。(在dos环境下用命令新建了一个项目)
我们用最基本的archetype 来创建一个入门项目的骨架。这个插件的前缀是―archetype‖,目标为‖create‖。 命令行中输入:
C:/Documents and Settings/Administrator>mvn archetype:create
-DgroupId=cn.vicky.maven.ch01 -DartifactId=simple -DpackageName=cn.vicky.maven 将在C:/Documents and Settings/Administrator文件夹下创建,一个simple文件夹。且会,自动创建一个App.java的文件! simple/ simple/pom.xml /src/
/src/main/
/main/java /src/test/
/test/java
Maven Archtype 插件创建了一个与artifactId 匹配的目录——simple。这是项目的基础目录
每个项目在文件pom.xml 里有它的项目对象模型 (POM)。这个文件描述了这个项目,配置了插件,声明了依赖。
我们项目的源码了资源文件被放在了src/main 目录下面。在我们简单Java 项目这样的情况下,这个目录包含了一下java 类和一些配置文件。在其它的项目中,它可能是web 应用的文档根目录,或者还放一些应用服务器的配置文件。在一个Java 项目中,Java 类
放在src/main/java 下面,而classpath 资源文件放在src/main/resources 下面。 我们项目的测试用例放在src/test 下。在这个目录下面,src/test/java 存放像使用JUnit 或者TestNG这样的Java 测试类。目录src/test/resources 下存放测试classpath 资源文件。
4.构建一个项目。
在3中,我们使用maven创建了一个项目,你会希望构建并打包这个应用。想要构建打包这个应用,在包含pom.xml 的目录下运行mvn install。
mvn install (首先,需要进入要构建的项目,与pom.xml同级目录!)(maven将自动下载pom.xml中配置的依赖的jar包,且还会编译项目中的java文件,生成了一个.jar的文件,如:simple-1.0-SNAPSHOT.jar,其中1.0-SNAPSHOT为创建项目时默认的版本号——可以更改)
此时,simple文件夹下,拥有了另外一个文件夹,target。 运行!
C:/Documents and Settings/Administrator/simple>java -cp target/simple-1.0-SNAPSHOT.jar cn.vicky.maven.App Hello World!
5.简单的项目对象模型(project Object Model)
当Maven 运行的时候它向项目对象模型(POM)查看关于这个项目的信息(pom.xml是一个让Maven 跑起来的文件)。
[xhtml]view plaincopy
(运行这个项目)
xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">
运行mvn help:effective-pom,可以查看一个大得多的POM,它暴露了Maven 的默认设置
1.前一章节总结
我们用两种类型的命令行参数运行了Maven。第一条命令是一条单个的插件目标,Archetype 插件的create 目标。Maven 第二次运行是一个生命周期阶段 –install。为了运行单个的Maven 插件目标,我们使用mvn archetype:create 这样的语法,这里archetype 是一个插件标识而create 是目标标识。
我们通过命令行参数-DgroupId=org.sonatype.mavenbook.ch03和
-DartifactId=simple 向Archetype 插件的create 目标传入了groupId 和artifactId 配置参数。我们也向create 目标传入了packageName 参数,它的值为org.sonatype.mavenbook。如果我们忽略了packageName 参数,那么包名的默认值为org.sonatype.mavenbook.ch03。
2.maven的生命周期
生命周期的阶段被特地留得含糊,但是大部分项目具有:单独的定义为验证(validation),测试(testing),或者发布(deployment)!
3.Maven 仓库(Repositories)
当你第一次运行Maven 的时候,你会注意到Maven 从一个远程的Maven 仓库下载了许多文件。在Maven 中,构件和插件是在它们被需要的时候从远程的仓库取来的。初始的Maven 下载包的大小相当的小(1.8 兆),其中一个原因是事实上这个初始Maven 不包括很多插件。
浏览中央Maven 仓库http://repo1.maven.org/maven2/
4.Maven 依赖管理 (Dependency Management)
一个复杂的项目将会包含很多依赖,也有可能包含依赖于其它构件的依赖。这是Maven 最强大的特征之一,它支持了传递性依赖(transitive dependencies)。
假如你的项目依赖于一个库,而这个库又依赖于五个或者十个其它的库(就像Spring或者Hibernate 那样)。你不必找出所有这些依赖然后把它们写在你的pom.xml 里,你只需要加上你直接依赖的那些库,Maven 会隐式的把这些库间接依赖的库也加入到你的项目中。Maven 也会处理这些依赖中的冲突,同时能让你自定义默认行为,或者排除一些特定的传递性依赖。
在Maven 中一个依赖不仅仅是一个JAR。它是一个POM 文件,这个POM 可能也声明了对其它构件的依赖。这些依赖的依赖叫做传递性依赖,Maven 仓库不仅仅存贮二进制文件,也存储了这些构建的元数据(metadata),才使传递性依赖成为可能。
项目A 依赖于项目B 和C,项目B 依赖于项目D,项目C 依赖于项目E,但是项目A 所需要做的只是定义对B 和C 的依赖。当你的项目依赖于其它的项目,而这些项目又有一些小的依赖时(向Hibernate, Apache Struts 或者Spring Framework),传递性依赖使之变得相当的方便。Maven 同时也提供了一种机制,能让你排除一些你不想要的传递性依赖。
5.站点生成和报告 (Site Generation and Reporting)
另外一个Maven 的重要特征是,它能生成文档和报告。在simple 项目的目录下, 运行以下命令:mvn site
将在target文件夹下,创建site文件夹,里面为项目的报告! 生成了一个这样的网站:
1。创建一个maven项目simple-weather
C:/>mvn archetype:create -DgroupId=cn.vicky.maven.ch04 -DartifactId=simple-weather -DpackageName=cn.vicky.maven -Dversion=1.0 (覆盖掉默认的1.0-SNAPSHOT)
2。我们想要做的是添加一些关于项目许可证,组织以及项目相关开发人员的一些信息。
[xhtml]view plaincopy
3。添加新的依赖
这个项目,我们将使用到: Dom4J 和 Jaxen ,为了格式化这个命令行程序的输出,我们将会使用 Velocity ,我们还需要加入对 Log4j 的依赖,用来做日志。
[xhtml]view plaincopy
可以使用http://www.mvnrepository.com 然后搜索一些常用的类库,如 Hibernate 或者 Spring Framework 。
4。运行mvn install 那么maven将自动下载以来的库文件! 5。编写程序
6。本项目依赖于两个 classpath 资源: Main 类通过 classpath 资源log4j.preoperties 来配置 Log4J , WeatherFormatter 引用了一个在classpath 中的名为output.vm 的 Velocity 模板。为了添加这些资源,我们需要在项目的基础目录下创建一个新的目录—— src/main/resources。由于任务archetype:create 没有创建这个目录,我们需要通过在项目的基础目录下运行下面的命令来创建它: $ cd src/main
$ mkdir resources $ cd resources
maven的一些配置文件如log4j.properties一般放在src/main/resources中,这些配置文件统称为classpath资源,在dos环境下用命令行生成的maven项目没有这个文件夹,需自己手动创建,如 $ cd src/main
$ mkdir resources $ cd resources 7。运行mvn install。
如果出现maven错误(1.3不支持泛型) 请配置pom.xml
[xhtml]view plaincopy
运行项目mvn exec:java -Dexec.mainClass=org.sonatype.mavenbook.weather.Main Exec 插件让我们能够在不往 classpath 载入适当的依赖的情况下,运行这个程序。
8。打印项目列表
mvn dependency:resolve
com.ibm.icu:icu4j:jar:2.6.1:compile
commons-collections:commons-collections:jar:3.1:compile commons-lang:commons-lang:jar:2.1:compile dom4j:dom4j:jar:1.6.1:compile jaxen:jaxen:jar:1.1.1:compile jdom:jdom:jar:1.0:compile junit:junit:jar:3.8.1:test log4j:log4j:jar:1.2.14:compile oro:oro:jar:2.0.8:compile velocity:velocity:jar:1.5:compile xalan:xalan:jar:2.6.0:compile
xerces:xercesImpl:jar:2.6.2:compile xerces:xmlParserAPIs:jar:2.6.2:compile xml-apis:xml-apis:jar:1.0.b2:compile xom:xom:jar:1.0:compile
正如你能看到的,我们项目拥有一个很大的依赖集合。虽然我们只是为四个类库引入了直接的依赖,看来我们实际共引入了15 个依赖。 Dom4J 依赖于 Xerces 和 XML解析器 API ,Jaxen 依赖于 Xalan,后者也就在 classpath 中可用了。 可以用一些命令来查看maven详细的依赖树
9。查看详细的依赖树。
在8中,我们可以查看,4个jar包的依赖jar包,但我们,无法获悉,具体某个jar包依赖那些jar包。如果你想知道你项目的整个依赖树,你可以运行 mvn dependency:tree 目标。
cn.vicky.maven.ch04:simple-weather:jar:1.0 +- log4j:log4j:jar:1.2.14:compile +- dom4j:dom4j:jar:1.6.1:compile
| /- xml-apis:xml-apis:jar:1.0.b2:compile +- jaxen:jaxen:jar:1.1.1:compile
| +- jdom:jdom:jar:1.0:compile
| +- xerces:xercesImpl:jar:2.6.2:compile | /- xom:xom:jar:1.0:compile
| +- xerces:xmlParserAPIs:jar:2.6.2:compile | +- xalan:xalan:jar:2.6.0:compile | /- com.ibm.icu:icu4j:jar:2.6.1:compile +- velocity:velocity:jar:1.5:compile
| +- commons-collections:commons-collections:jar:3.1:compile
| +- commons-lang:commons-lang:jar:2.1:compile | /- oro:oro:jar:2.0.8:compile /- junit:junit:jar:3.8.1:test
如果你还不满足,或者想要查看完整的依赖踪迹,包含那些因为冲突或者其它原因而被拒绝引入的构件,打开 Maven 的调试标记运行:mvn install -X
10。编写单元测试
Maven 内建了对单元测试的支持,测试是 Maven 默认生命周期的一部分. 这部分略过……
11。添加一个测试范围依赖
某些库文件,仅仅是对测试使用的,所以可以为这些库文件,添加范围配置。如
12。打包,发布项目
Maven Assembly 插件是一个用来创建你应用程序特有分发包的插件。要配置 Maven Assembly 插件, 我们需要在pom.xml 中的 build 配置中添加如下的plugin 配置。artifactId为maven-assembly-plugin
[xhtml]view plaincopy
再运行 : mvn install assembly:assembly 构建装配
现在在target/simple-weather-1.0-jar-with-dependencies.jar 装配好了!
不仅仅将此项目装配好了,还将此项目所依赖的一些项目也装配进来了!
13。装配好项目后,我们可以运行项目
cd target
C:/simple-weather/target>java -cp simple-weather-1.0-jar-with-dependencies.jar org.sonatype.mavenbook.weather.Main 10002
由于我们平常将web项目放置于tomcat容器中运行,而不是
maven自带的jetty,故这一章没怎么学!!
我们将创建一个web项目:
1。创建项目mvn archetype:create -DgroupId=org.sonatype.mavenbook.ch05 -DartifactId=simple-webapp -DpackageName=org.sonatype.mavenbook -DarchetypeArtifactId=maven-archetype-webapp
红色部分为,确定该项目为web项目,直接印象结果是,pom.xml文件中
2.你可以使用 Maven Jetty 插件在 Maven 中运行你的 web 应用。为此,你需要在项目的pom.xml 中配置 Maven Jetty 插件。
[xhtml]view plaincopy
使用mvn jetty:run运行项目 Started Jetty Server (在启动 Jetty 插件之前,运行mvn compile 以编译你的项目)
http://localhost:8080/simple-webapp/查看默认生成的index.jsp页面。Hello World。该index.jsp位于webapp下。
添加包,与servlet。但是,使用mvn compile 编译,会失败,因为,目前项目并没有J2EE库!
为了编写一个 servlet ,我们需要添加 Servlet API 作为项目依赖。 Servlet 规格说明是一个 JAR 文件,它能从 Sun Microsystems 的站点下载到
http://java.sun.com/products/servlet/download.html 。JAR 文件下载好之后你需要把它安装到位于~/.m2/repository 的 Maven 本地仓库。
但,现在我们不必如此麻烦:我们可以使用Apache Geronimo。配置如下
[xhtml]view plaincopy
这里还有必要指出的是我们的这个依赖使用了provided 范围。这个范围告诉 Mavenjar 文件已经由容器―提供‖了,因此不再需要包含在 war 中。
[xhtml]view plaincopy
在添加好这个 Servlet 规格说明依赖之后,运行mvn clean install ,然后运行mvn jetty:run 。 运行servlet。。。
一个多模块项目通过一个父POM 引用一个或多个子模块来定义。父项目,通过以下配置,将子项目关联。
[xhtml]view plaincopy
其中值得注意的是
当然,仅仅在父项目,配置子项目是不能够真正实现关联的,因为,这毕竟需要子项目的同意,故!子项目中需要配置:
[xhtml]view plaincopy
现在,通过父pom.xml将2个子项目进行了关联,那么我们需要从simple-parent 项目运行mvn clean install 命令,将2个子项目打包,编译为一个项目!
这一种跟上一种打包发布有什么区别!!!????
当Maven 执行一个带有子模块的项目的时候,Maven 首先载入父POM,然后定位所有的子模块POM。Maven 然后将所有这些项目的POM 放入到一个称为Maven 反应堆(Reactor)的东西中,由它负责分析模块之间的依赖关系。这个反应堆处理组件的排序,以确保相互独立的模块能以适当的顺序被编译和安装。
当,通过父pom.xml进行完成多个子项目的关联后,我们可以像前几章一样,分别进入某个单独的模块,进行运行,以移动程序!
注意:子项目的文件,位于父项目pom.xml同级,也就是,子项目的pom.xml位于父pom.xml的下一级文件中!
因篇幅问题不能全部显示,请点此查看更多更全内容