Maven 配置文件 生命周期 常用命令详解
当前,JVM生态圈主要的三大构建工具:
对于初学者,Ant是最清晰的,只要读懂Xml配置文件你就能够理解它干了什么,但是ant文件很容易变的更加复杂。Maven有自己的工程目录规则和内置的构建生成周期,从而使构建文件更加简单。gradle有很多开箱即用的插件,语法更加短小精悍,易于理解。 在讲解maven之前这里我们先简单比较下Maven和Ant。下面是一个简单的Ant例子。这个例子可以看出我们需要明确的告诉Ant。我们想让他做什么。有一个包含javac任务的编译目标来讲src/main/java的源码编译至target、class目录。需要明确的告诉ant源码在哪里,结果字节码存储在哪里。如何将这些字节码打包成jar文件。 <?xml version="1.0" encoding="UTF-8"?> <project name="test_HelloWorld" basedir="." default=""> <property name="test" location="test"/> <target name="init"> <mkdir dir="${test}/classess/com/test"/> </target> <target name="compile" depends="init"> <javac srcdir="${test}" destdir="${test}/classess/com/test"/> </target> <target name="dist" depends="compile"> <mkdir dir="${test}/classess/com/test/lib"/> <jar jarfile="${test}/classess/com/test/lib/test.jar" basedir="${test}/classess/com/test"/> </target> <target name="run" depends="compile"> <java classname="HelloWorld" classpath="${test}/classess/com/test"/> </target> <target name="clean"> <delete dir="${test}/classess"/> </target> </project> 在Maven中你只需要创建一个简单的pom.xml。将你的源码放在指定目录下。然后运行mvn install 。就能完成和ant同样的事情。从命令行运行mvn install会处理资源文件,编译源代码,运行单元测试,创建一个jar。然后把这个jar安装到本地仓库为其他项目提供重用性。不用做任何修改,运行mvn site然后在target/site目录找到一个Index.html。这个文件链接了javaDoc和一些关于源代码的报告。 为什么maven运行一个命令就能实现ant定义的一大堆的事情? Ant
Maven
接下来我们从以下三个方面讲解Maven
maven的Settings.xml解析 对Maven本身行为的定制 <?xml version="1.0" encoding="UTF-8"?> <settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <localRepository/> <interactiveMode/> <offline/> <servers/> <mirrors/> <proxies/> <profiles/> <activeProfiles/> <pluginGroups/> </settings>
mvn org.mortbay.jetty:jetty-maven-plugin:run 如果在settings.xml文件中配置了如下<pluginGroup>: <pluginGroups> <pluginGroup>org.mortbay.jetty</pluginGroup> </pluginGroups > 则可以直接执行如下命令: mvn jetty:run servers,给出用以下载或部署类库的服务器信息 mirrors <mirror> <id>mirrorId</id> <mirrorOf>repositoryId</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://my.repository.com/repo/path</url> </mirror>
对于mirrorOf参数,如果该镜像库的目标远程库不止一个,则可以使用 * 表示任意远程库; 此外,定义镜像库还可以提供 layout(默认default),mirrorOfLayouts(默认default,legacy)。 Servers 远程库通常在POM中定义,但是远程库所在的服务器信息,如访问用户名、密码等,往往因为不适合与POM一起发布,所以需要在settings.xml文件中设置。 <server> <id>deploymentRepo</id> <username>repouser</username> <password>repopwd</password> <id>siteServer</id> <privateKey>/path/to/private/key</privateKey> <passphrase>optional; leave empty if not used.</passphrase> </server> id,服务器的ID,Maven在连接一个库或者镜像的时候,通过id匹配要连接的服务器; username,password,连接服务器所需的认证信息; privateKey,passphrase,连接服务器所需的认证信息。privateKey默认位于${user.home}/.ssh/id_dsa; configuration,访问服务器辅助要传递的参数,通常不必要; Proxies <proxy> <id>optional</id> <active>true</active> <protocol>http</protocol> <username>proxyuser</username> <password>proxypass</password> <host>proxy.host.net</host> <port>80</port> <nonProxyHosts>local.net|some.host.com</nonProxyHosts> </proxy>
Pom.xml解析 Maven的pom.xml文件简称POM (Project Object Model),是Maven项目的配置和管理核心。 1.POM的模型版本 <modelVersion>4.0.0</modelVersion> //说明:在Maven2和Maven3中,只支持4.0.0版本。 2.基本配置 <groupId>...</groupId> <artifactId>...</artifactId> <version>...</version> <packaging>...</packaging> <dependencies>...</dependencies> <parent>...</parent> <dependencyManagement>...</dependencyManagement> <modules>...</modules> <properties>...</properties> 3.Build配置 <build>...</build> <reporting>...</reporting> 4.环境配置 <issueManagement>...</issueManagement> <ciManagement>...</ciManagement> <mailingLists>...</mailingLists> <distributionManagement>...</distributionManagement> <scm>...</scm> <prerequisites>...</prerequisites> <repositories>...</repositories> <pluginRepositories>...</pluginRepositories> <profiles>...</profiles>
system
system notifiers,集成过程中发生事件,以某种方式(如mail)通知开发人员
connection,用户使用的URI,能够只读地访问版本控制系统
maven
name 5.其他信息 <name>...</name> <description>...</description> <url>...</url> <inceptionYear>...</inceptionYear> <licenses>...</licenses> <organization>...</organization> <developers>...</developers> <contributors>...</contributors>
name,license的名称 developers,其中的developer包含id,name,email,url,organization,organizationUrl,roles,timezone,properties属性(properties是可以自定义的各种必要属性) contributors,其中的contributor包含与developer基本相同的属性,除了没有id属性之外 packaging packaging给出了项目的打包类型,即作为项目的发布形式,其可能的类型。在Maven 3中,其可用的打包类型如下: • jar,默认类型 multi-modules Maven 3支持Maven项目的多模块(multi-modules)结构。这样的Maven项目也被称为聚合项目,通常由一个父模块和若干个子模块构成。 其中,父模块必须以pom打包类型,同时以<modules>给出所有的子模块。父模块的POM示例(其中的每个module,都是另外一个Maven项目) ... <packaging>pom</packaging> <modules> <module>my-frontend-project</module> <module>my-service-project</module> <module>my-backend-project</module> </modules> ... Maven项目的继承 Maven项目之间不仅存在多模块的聚合关系,而且Maven项目之间还可以存在相互继承的关系。Maven项目之间的继承关系通过<parent>表示,在子Maven项目的POM中配置示例如下: <parent> <groupId>com.ericsson.jcat</groupId> <artifactId>jcat-bundle</artifactId> <version>2.0</version> <relativePath>../jcat-bundle</relativePath> </parent> 其中的relativePath给出父项目相对于子项目的路径,这样在构件子项目时首先从该相对路径查找父项目,如果没有才会从本地库或进而远程库中查找父项目。 在子项目中,能够继承父项目的如下配置: • dependencies dependencies Maven项目的构建往往要依赖于第三方的类库。通过<dependencies>可以给出Maven项目所依赖的第三方类库 <dependencies> <dependency> <groupId>org.gitlab</groupId> <artifactId>java-gitlab-api</artifactId> <version>1.2.6</version> </dependency> </dependencies> 对于一个依赖<dependency>,首先要给出被依赖的Maven构件(被依赖的只能是Maven构件)的具体标识信息,如groupId、artifactId和version(可以是一个范围)。为了进一步区分Maven构件的内容(如source、bin和doc),往往还会给出Maven构件的classifier。 type,打包类型,默认jar scope,被依赖的Maven构件在classpath中的可访问范围 在Maven的pom.xml文件中,<properties>用于定义全局变量,在POM中通过${property_name}的形式引用变量的值。 Maven生命周期 http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html(官网解说) Maven强大的一个重要的原因是它有一个十分完善的生命周期模型(lifecycle),这个生命周期可以从两方面来理解,第一,顾名思义,运行Maven的每个步骤都由它来定义的,这种预定义的默认行为使得我们使用Maven变得简单,相比而言,Ant的每个步骤都要你手工去定义。第二,这个模型是一种标准,在不同的项目中,使用Maven的接口是一样的,这样就不用去仔细理解每个项目的构建了,一般情况下,mvn clean install 这样的命令是通用的。 Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,很多人容易将Maven的生命周期看成一个整体,其实不然。这三套生命周期分别是: Clean Lifecycle 在进行真正的构建之前进行一些清理工作。 每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。 Clean生命周期一共包含了三个阶段: • pre-clean 执行一些需要在clean之前完成的工作 mvn clean 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。 下面看一下Site生命周期的各个阶段: • pre-site 执行一些需要在生成站点文档之前完成的工作 这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。 Maven的最重要的Default生命周期 • validate 记住,运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。 Maven参数 -D 传入属性参数 Maven常用命令 创建Maven的普通java项目: mvn archetype:create -DgroupId=packageName -DartifactId=projectName 创建Maven的Web项目: mvn archetype:create -DgroupId=packageName -DartifactId=webappName-DarchetypeArtifactId=maven-archetype-webapp 编译源代码:mvn compile 编译测试代码:mvn test-compile 运行测试:mvn test 产生site:mvn site 打包:mvn package 在本地Repository中安装jar:mvn install 清除产生的项目:mvn clean 生成eclipse项目:mvn eclipse:eclipse 生成idea项目:mvn idea:idea 组合使用goal命令,如只打包不测试:mvn -Dtest package 编译测试的内容:mvn test-compile 只打jar包: mvn jar:jar 只测试而不编译,也不测试编译: mvn test -skipping compile -skipping test-compile 清除eclipse的一些系统设置:mvn eclipse:clean ps:一般使用情况是这样,首先通过cvs或svn下载代码到本机,然后执行mvn eclipse:eclipse生成ecllipse项目文件,然后导入到eclipse就行了;修改代码后执行mvn compile或mvn test检验,也可以下载eclipse的maven插件。 mvn -version/-v 显示版本信息 mvn archetype:generate 创建mvn项目 mvn archetype:create -DgroupId=com.oreilly -DartifactId=my-app 创建mvn项目 mvn package 生成target目录,编译、测试代码,生成测试报告,生成jar/war文件 mvn jetty:run 运行项目于jetty上, mvn compile 编译 mvn test 编译并测试 mvn clean 清空生成的文件 mvn site 生成项目相关信息的网站 mvn -e 显示详细错误 信息. mvn validate 验证工程是否正确,所有需要的资源是否可用。 mvn test-compile 编译项目测试代码。 。 mvn integration-test 在集成测试可以运行的环境中处理和发布包。 mvn verify 运行任何检查,验证包是否有效且达到质量标准。 mvn generate-sources 产生应用需要的任何额外的源代码,如xdoclet。 发布第三方Jar到本地库中: mvn install:install-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:client-0.1.0.jar -DdownloadSources=true -DdownloadJavadocs=true 总结 以上所述是小编给大家介绍的Maven 配置文件 生命周期 常用命令详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |