软件开发工具:第17章 Maven和Gradle_第1页
软件开发工具:第17章 Maven和Gradle_第2页
软件开发工具:第17章 Maven和Gradle_第3页
软件开发工具:第17章 Maven和Gradle_第4页
软件开发工具:第17章 Maven和Gradle_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、郑州大学信息工程学院第17章 Maven和Gradle点击添加文本郑州大学信息工程学院17.1 初识Maven17.2 Maven的安装和配置17.3 Maven使用17.4 坐标和依赖点击添加文本17.5 构建支持Servlet 3.0的Maven Web应用17.6 Gradle来了17.7 本章小结习题 17本章导读本章导读: Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。本章将介绍Maven这一跨平台的项目管理工具。作为Apache组织中的一个颇为成功的开源项目,Maven主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。无论是小型的开源类库项目

2、,还是大型的企业级应用;无论是传统的瀑布式开发,还是流行的敏捷模式,Maven都能大显身手。本章知识点本章主要知识点有:(1)Maven简介;(2)Maven安装与配置;(3)Maven使用;(4)坐标和依赖;(5)使用Maven构建支持Servlet 3.0的Web应用;(6)Gradle下载、安装与配置;(7)如何使用Gradle创建Java工程。17.1 初识Maven17.1.1 什么是Maven?Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model)、一组标准集合、一个项目生命周期(Project Lifecycle)、一个依赖管理系统(D

3、ependency Management System)和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当使用Maven的时候,可以用一个明确定义的项目对象模型来描述项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。Maven有一个生命周期,当运行mvn install的时候被调用。这条命令告诉Maven执行一系列的有序的步骤,直到到达指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven运行了许多默认的插件目标,这些目标完成了像编译和创建一个JAR文件这样的工作。此外,Maven能够方便于管理项目报告、生成站点、

4、管理JAR文件等。17.1 初识Maven17.1.2 Maven与Ant(1)Maven和Ant针对构建问题的两个不同方面。Ant为Java技术开发项目提供跨平台构建任务。Maven本身描述项目的高级方面,它从Ant借用了绝大多数构建任务。Ant脚本是可以直接运行在Maven中的。Maven和Ant最大差别在于Maven的编译以及所有的脚本都有一个基础,就是POM。这个模型定义了项目的方方面面,然后各式各样的脚本在这个模型上工作,而Ant完全是自己定义。(2)Maven对所依赖的包有明确的定义,如使用那个包,版本是多少,一目了然。而Ant则通常是简单的inclde所有的jar。导致的最终结果

5、就是,你根本无法确定JBoss中的lib下的commonlogging是哪个版本的,唯一方法就是打开METAINF目录下MANIFEST.MF查看。(3)Maven是基于中央仓库的编译,即把编译所需要的资源放在一个中央仓库里,如jar,tld,pom等。当编译的时候,Maven会自动在仓库中找到相应的包,如果本地仓库没有,则从设定好的远程仓库中下载到本地。这一切都是自动的,而Ant需要自己定义了。这个好处导致的结果就是,用maven编译的项目在发布的时候只需要发布源码,小得很,而反之,Ant的发布则要把所有的包一起发布,显然maven又胜了一筹。(4)Ant没有正式的约定如一个一般项目的目录结

6、构,你必须明确的告诉Ant哪里去找源代码,哪里放置输出。Maven拥有约定,因为你遵循了约定,它已经知道你的源代码在哪里。它把字节码放到target/classes,然后在target生成一个JAR文件。17.1 初识Maven(5)Ant是程序化的,你必须明确的告诉Ant做什么,什么时候做。你必须告诉它去编译,然后复制,然后压缩。Maven是声明式的,你需要做的只是创建一个pom.xml文件然后将源代码放到默认的目录。Maven 会帮你处理其它的事情。(6)Ant没有生命周期,你必须定义目标和目标之间的依赖。你必须手工为每个目标附上一个任务序列。Maven有一个生命周期,当你运行mvn in

7、stall的时候被调用。这条命令告诉Maven执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven运行了许多默认的插件目标,这些目标完成了像编译和创建一个JAR文件这样的工作。Maven以插件的形式为一些一般的项目任务提供了内置的智能。(7)Maven有大量的重用脚本可以利用,如生成网站,生成javadoc、sourcecode reference等。而Ant都需要自己去写。对于Maven,有了pom.xml,只要从命令行运行mvn install,就会处理资源文件,编译源代码,运行单元测试,创建一个JAR,然后把这个JAR安装到本地仓库以为其它项目提

8、供重用性。不用做任何修改,你可以运行mvn site,然后在target/site目录找到一个index.html文件,这个文件链接了JavaDoc和一些关于源代码的报告。(8)使用Maven还是Ant的决定不是非此即彼的,Ant在复杂的构建中还有它的位置。如果你目前的构建包含一些高度自定义的过程,或者你已经写了一些Ant脚本通过一种明确的方法完成一个明确的过程,而这种过程不适合Maven标准,你仍然可以在Maven 中用这些脚本。作为一个Maven的核心插件,Ant还是可用的。自定义的插件可以用Ant 来实现,Maven项目可以配置成在生命周期中运行Ant的脚本。(9)Maven目前不足的地

9、方就是没有象Ant那样成熟的GUI界面。目前使用Maven最好的方法还是命令行,又快又方便。17.1 初识Maven17.1.3约定优于配置(Convention Over Configuration)约定优于配置是一个简单的概念。系统,类库,框架应该假定合理的默认值,而非要求提供不必要的配置。流行的框架如Ruby on Rails和EJB3已经开始坚持这些原则,以对像原始的EJB 2.1规范那样的框架的配置复杂度做出反应。Maven 通过给项目提供明智的默认行为来融合这个概念。在没有自定义的情况下,源代码假定是在$basedir/src/main/java,资源文件假定是在$basedir/

10、src/main/resources。测试代码假定是在$basedir/src/test。项目假定会产生一个JAR文件。Maven假定你想要把编译好的字节码放到$basedir/target/classes 并且在$basedir/target创建一个可分发的JAR文件。虽然这看起来无关紧要,但是想想大部分基于Ant的构建必须为每个子项目定义这些目录。Maven 对约定优于配置的应用不仅仅是简单的目录位置,Maven的核心插件使用了一组通用的约定,以用来编译源代码,打包可分发的构件,生成web站点,还有许多其他的过程。Maven的力量来自它的“武断”,它有一个定义好的生命周期和一组知道如何构建

11、和装配软件的通用插件。如果你遵循这些约定,Maven只需要几乎为零的工作,仅仅是将你的源代码放到正确的目录,Maven将会帮你处理剩下的事情。使用“遵循约定优于配置”系统的一个副作用是用户可能会觉得他们被强迫使用一种特殊的方法。当然Maven有一些核心观点不应该被怀疑,但是其实很多默认行为还是可配置的。例如项目源码的资源文件的位置可以被自定义,JAR文件的名字可以被自定义,在开发自定义插件的时候,几乎任何行为可以被裁剪以满足你特定的环境需求。如果你不想遵循约定,Maven 也会允许你自定义默认值来适应你的需求。17.2 Maven的安装和配置1安装JDK在安装maven之前,先确保已经安装JD

12、K1.6及以上版本,并且配置好环境变量。2下载Maven在/download.cgi下载apache-maven-3.3.3-bin.zip并解压,我这里是解压到D:apache-maven-3.3.3。3配置环境变量配置maven3的环境变量。先配置M2_HOME的环境变量,新建一个系统变量M2_HOME,路径是:D:apache-maven-3.2.5。如图17-1所示。17.2 Maven的安装和配置 图17-1 配置M2_HOME环境变量 图17-2 输入 mvn version再配置path环境变量,在path值的末尾添加%M2_HOME%bin。打开cmd窗口,输入 mvn ver

13、sion,出现如图17-2所示内容表示安装成功。17.2 Maven的安装和配置4给Maven添加本地仓库默认情况下,不管是在windows还是linux上,每个用户在自己的用户目录下都有一个路径名为.m2/repository/的仓库目录。有时候,因为某些原因(例如C盘空间不够),用户会想要自定义本地仓库目录地址。这时,可以编辑文件/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址。这里指代用户目录,譬如C:UsersAdministrator。例如我的本地仓库配置为: D:my_maven_repositoryworkmaven 这样,该用户的本

14、地仓库地址就被设置成了D:my_maven_repositoryworkmaven。需要注意的是,默认情况下,/.m2/settings.xml文件是不存在的,用户需要从Maven安装目录复制$M2_HOME/conf/settings.xml文件再进行编辑。17.2 Maven的安装和配置一个构件只有在本地仓库中之后,才能由其他Maven项目使用,那么构件如何进入到本地仓库中呢?最常见的是依赖Maven从远程仓库下载到本地仓库中。还有一种常见的情况是,将本地项目的构件安装到Maven仓库中。例如本地有两个项目A和B,两者都无法从远程仓库获得,而同时A又依赖于B,为了能构建A,B就必须首先得以

15、构建并安装到本地仓库中。为了安装项目,我们可以在项目中执行:mvn clean install命令。Install插件的install目标将项目的构建输出文件安装到本地仓库。(安装好Maven后,如果不执行任何Maven命令,本地仓库目录是不存在的。当用户输入第一条Maven命令之后,Maven才会创建本地仓库,然后根据配置和需要,从远程仓库下载构件至本地仓库。由于最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行Maven命令的时候下载到需要的构件。中央仓库就是这样一个默认的远程仓库,Maven的安装文件自带了中央仓库的配置。私服是一种特殊的远程仓库,它是架设在局域

16、网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。此外,一些无法从外部仓库下载到的构件也能从本地上传到私服上供大家使用。)17.2 Maven的安装和配置5配置用户范围settings.xmlMaven用户可以选择配置$M2_HOME/conf/settings.xml或者/.m2/settings.xml。前者是全局范围的,整台机器上的所有用户都会直接受到该配置的影响,而后者是用户范围的,只有当前用户才会受到该配置的影响。

17、具体配置如图17-3所示。 图17-3 配置settings.xml17.2 Maven的安装和配置6错误处理Eclipse中使用Maven插件的时候,运行Run as Maven clean的时候报错,如下所示:-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match. 解决方法:选择Window-Preferences-Java-Installed JREs,如图17-4所示。 图17-4 Installed

18、JREs对话框 图17-5 配置JRE单击Edit,如图17-5所示,在Default VM arguments中设置:-Dmaven.multiModuleProjectDirectory=$M2_HOME17.2 Maven的安装和配置7设置MAVEN_OPTS环境变量前面介绍Maven安装目录时我们了解到,运行mvn命令实际上是执行了Java命令,既然是运行Java,那么运行Java命令可用的参数当然也应该在运行mvn命令时可用。这个时候,MAVEN_OPTS环境变量就能派上用场。我们通常需要设置MAVEN_OPTS的值为:-Xms128m -Xmx512m,因为Java默认的最大可用内

19、存往往不能够满足Maven运行的需要,比如在项目较大时,使用Maven生成项目站点需要占用大量的内存,如果没有该配置,我们很容易得到java.lang.OutOfMemeoryError。因此,一开始就配置该变量是推荐的做法。关于如何设置环境变量,请参考前面设置M2_HOME环境变量的做法,尽量不要直接修改mvn.bat或者mvn这两个Maven执行脚本文件。因为如果修改了脚本文件,升级Maven时你就不得不再次修改,一来麻烦,二来容易忘记。同理,我们应该尽可能地不去修改任何Maven安装目录下的文件。关于Maven中JVM参数的设置:方法1:在系统的环境变量中,设置MAVEN_OPTS,用以

20、存放JVM的参数,具体设置的步骤,参数示例如下:MAVEN_OPTS=-Xms256m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256M 方法2:找到Maven的安装目录,在bin目录下,编辑mvn.bat(linux下,mvn.sh):set MAVEN_OPTS=-Xms256m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256M (这种方法不推荐)。 17.3 Maven使用1生成项目(1)建一个 JAVA 项目:mvn archetype:generate -DgroupId=com.mialab

21、 -DartifactId=Exercise -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=1.0 (2)建一个web项目:mvn archetype:generate -DgroupId=com.mialab -DartifactId=PalmSuda -DarchetypeArtifactId=maven-archetype-webapp -Dversion=1.0 解释:archetype:create,是archetype插件的create 目标。在maven中一个插件可以拥有多个目标。archetype, 是一个

22、内建插件,它的create任务将建立项目骨架。archetypeArtifactId,项目骨架的类型。groupId,项目的java包结构,可修改。artifactId,项目的名称,生成的项目目录也是这个名字,可修改。Version,项目的版本。 17.3 Maven使用2Maven常用命令常用命令为:mvn archetype:create :创建 Maven 项目。mvn compile :编译源代码。mvn test-compile :编译测试代码。mvn test :运行应用程序中的单元测试。mvn site :生成项目相关信息的网站。mvn clean :清除目标目录中的生成结果。m

23、vn package :依据项目生成 jar文件。mvn install :在本地 Repository 中安装jar。mvn deploy :将jar包发布到远程仓库。mvn eclipse:eclipse :生成Eclipse项目文件。 17.3 Maven使用3Maven常用项目骨架如果是Maven3,可简单运行: mvn archetype:generate(1)internal - appfuse-basic-jsf :创建一个基于Hibernate,Spring和JSF的Web应用程序的原型。(2)internal - appfuse-basic-spring :创建一个基于Hib

24、ernate,Spring和Spring MVC的Web应用程序的原型。(3)internal - appfuse-basic-struts :创建一个基于Hibernate,Spring和Struts 2的Web应用程序的原型。(4)internal - appfuse-modular-spring :创建一个基于Hibernate,Spring 和 Spring MVC 的模块化应用原型。(5)internal - appfuse-modular-struts :创建一个基于 Hibernate, Spring 和 Struts 2 的模块化应用原型) (6)internal - mave

25、n-archetype-j2ee-simple :一个简单的J2EE的Java应用程序。(7)internal - maven-archetype-marmalade-mojo :创建一个Maven的插件开发项目 using marmalade。(8)internal - maven-archetype-mojo :一个Maven的Java插件开发项目。(9)internal - maven-archetype-portlet :一个简单的portlet应用程序。(10)internal - maven-archetype-site-simple :简单的网站生成项目。(11)internal

26、 - maven-archetype-site :更复杂的网站项目。(12)internal - maven-archetype-webapp :一个简单的Java Web应用程序。 17.3 Maven使用4Eclipse导入已存在的maven项目在导入之前需要在项目根目录下面执行如下命令。普通 Eclipse 项目执行:mvn eclipse:eclipse Eclipseweb 项目执行:mvn eclipse:eclipse Dwtpversion=1.0然后通过Eclipse的maven插件中选择导入已存在的maven项目即可将其导入。17.4 坐标和依赖1坐标 maven 的所有构

27、件均通过坐标进行组织和管理。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,po

28、m,zip,默认为 jar。classifier:定义项目的附属构件,如hibernate-core-3.6.6.Final-sources.jar,hibernate-core-3.6.6.Final-javadoc.jar,其中sources和javadoc就是这两个附属构件的 classifier。classifier不能直接定义,通常由附加的插件帮助生成。17.4 坐标和依赖2依赖使用Maven可以方便地管理依赖,如下是一段在pom.xml文件中声明依赖的代码示例: org.springframework spring-test 3.2.0.RELEASE jar test $java

29、.home/lib/rt.jar false type:依赖类型,对应构件中定义的packaging,可不声明,默认为 jar;scope:依赖范围;optional:依赖是否可选;exclusions:排除传递依赖。17.4 坐标和依赖执行不同的Maven命令(mvn package,mvn test,mvn install ),会使用不同的 classpath,Maven对应的有三套classpath:编译classpath、测试classpath和运行classpath。scope选项的值,决定了该依赖构件会被引入到哪一个classpath中。 compile:编译依赖范围,默认值。此选

30、项对编译、测试、运行三种 classpath 都有效,如 hibernate-core-3.6.5.Final.jar,表明在编译、测试、运行的时候都需要该依赖; test:测试依赖范围。只对测试有效,表明只在测试的时候需要,在编译和运行时将无法使用该类依赖,如junit; provided:已提供依赖范围。编译和测试有效,运行无效。如servlet-api,在项目运行时,tomcat 等容器已经提供,无需Maven重复引入; runtime:运行时依赖范围。测试和运行有效,编译无效。如jdbc驱动实现,编译时只需接口,测试或运行时才需要具体的jdbc驱动实现; system:系统依赖范围。和

31、provided 依赖范围一致,需要通过显示指定,且可以引用环境变量; import:导入依赖范围。使用该选项,通常需要pom,将目标pom的 dependencyManagement配置导入合并到当前pom的dependencyManagement元素。17.5 构建支持Servlet 3.0的Maven Web应用1创建工程mavenweb 在Eclipse中创建Maven Project,如图17-6所示,选择maven-archetype-webapp,Group ID中输入:com.mialab.app,Artifact ID输入:mavenweb。(此处所用的Eclipse版本,详

32、见教学资源光盘tools文件夹下eclipse-jee-kepler-R-win32.zip) 图17-6在Eclipse中创建maven-archetype-webapp此时mavenweb工程默认生成的web.xml内容如下:Archetype Created Web Application17.5 构建支持Servlet 3.0的Maven Web应用2完善src目录结构mavenweb工程默认是没有java目录和test目录的,如下图所示,我们须补全。 图17-7 mavenweb工程默认目录 图17-8 mavenweb工程添加java目录和test目录我们在src/main目录下创

33、建Java文件夹,再在src目录下创建test文件夹,src/test文件夹下创建java和resources文件夹,如图17-8所示。17.5 构建支持Servlet 3.0的Maven Web应用3修改webapp的版本mavenweb工程默认创建的webapp的版本为2.3,这里需要修改成支持Servlet3.0的webapp3.0。我们在工作区文件夹中找到mavenweb工程,编辑/mavenweb/.settings文件夹下的ject.facet.core.xml,如图17-9所示:图17-9 编辑ject.facet.core.xml文件将 和分别改为 和。17.5 构建支持Ser

34、vlet 3.0的Maven Web应用再重新启动Eclipse打开项目的pom.xml文件,在节点下添加如下配置: maven-compiler-plugin 3.0 1.6 1.6 保存更改后,在Problems标签下会出现错误提示:Project configuration is not up-to-date with pom.xml. Run Maven-Update Project or use Quick Fix.我们选中mavenweb工程,右键打开mavenweb工程的快捷菜单,选择MavenUpdate Project,更新项目。17.5 构建支持Servlet 3.0的Ma

35、ven Web应用然后在mavenweb工程Properties对话框左侧选择Project Facets,将对话框右侧的Dynamic Web Module改为3.0,Java改为1.6,最右边Runtimes选择Tomcat7.0(Servlet3.0需要Tomcat7.0+),如17-10所示。 图17-10 配置Project Facets 图17-11 运行index.jsp最后删掉src/main/webapp/WEB-INF/web.xml,再次右键mavenweb工程MavenUpdate Project,更新项目。这时错误全消失了。这时我们再在Eclipse中建立一个Dyna

36、mic Web Project,譬如名称为Hello,选择Dynamic web module version为3.0。Hello工程创建成功后把所得到的web.xml文件拷贝到WEB-INF目录下即可。这时我们可顺利运行index.jsp,如图17-11所示。17.5 构建支持Servlet 3.0的Maven Web应用4创建Servlet并测试如图17-12和图17-13所示,创建HelloMavenServlet,并进行测试。 图17-12 创建HelloMavenServlet 图17-13 浏览器中调用HelloMavenServletHelloMavenServlet.java主

37、要代码如下:public class HelloMavenServlet extends HttpServlet protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.getWriter().println(Get:/helloMaven); 17.6 Gradle来了1什么是GradleGradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而

38、代之的是一种基于Groovy的内部领域特定(DSL)语言。2Gradle下载与安装下载地址:/downloads。笔者下载的是gradle-2.6-bin.zip,详见教学资源光盘tools文件夹下gradle-2.6-bin.zip,属于Binary only distribution (no documentation or source code)。解压缩后得到gradle-2.6文件夹,笔者把它拷贝到电脑的D盘。环境变量配置较为简单,与Maven类似。设置GRADLE_HOME:D:gradle-2.6;设置Path:%GRADLE_HOME%bin。在Win7的命令提示符界面,输入gradle v,出现如图17-14所示界面,证明安装成功。图17-14 输入gradle v 17.6 Gradle来了3创建一个Java项目笔者建立的项目文件夹名为ghello,在D盘的gradle_prj目录下。在ghello目录下建立build.gradle文件和srcmainjavacommialabhello目录,在hello目录下建立HelloGradle.java文件,如下图所示。 图17-15 build.gradle文件存储位置 图17-16 HelloGradle.java存储位置HelloGradle.java内容为:package com.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论