Maven
Maven是一个强大的构建工具,可以帮助我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。我们只需要输入简单的命令(如mvn干净安装),Maven将帮助我们处理繁琐的任务;它最大限度地消除了重复构建,抽象了构建生命周期,并为大多数构建任务提供了已实现的插件例如,测试,我们只需要根据Maven的协议编写测试用例,当我们运行构建时,这些测试将自动运行。此外,Maven可以帮助我们标准化构建过程。在Maven之前,十个项目可能有十种构建方法,但是对于Maven,所有项目的构建命令都是简单且一致的。有利于促进项目团队的标准化构建工具比较
是作者接触到的第一个独立于IDE的命令行构建工具。作者以前一直在开发基于Visual Studio的Windows驱动程序,对构建器和IDE之间的区别不是很清楚。依靠大量的人工操作编译、测试、代码生成和其他工作是相互独立的,很难用一个键完成所有的工作。体力劳动通常意味着低效率和容易出错很难在一个项目中统一所有的集成开发环境配置。每个人都有自己的偏好。也是因为这个原因,在机器A上成功运行的任务可能在机器B的集成开发环境中失败
在Linux C开发中,我们经常使用Make来构建,但是Make将自己绑定到操作系统。换句话说,使用Make无法实现跨平台构建(至少很难),这对Java非常不友好。此外,Makefile的语法也是一个问题。许多人抱怨Make构造的失败通常是由难以找到的空格或制表符错误引起的。Java开发过程中常见的自动化构建工具有Ant、Maven和Gradle。整个自动化过程通常包括以下步骤:编译源代码、运行单元测试和集成测试、执行静态代码分析、生成分析报告、创建发布版本、部署到目标环境、部署交付过程以及执行烟雾测试和自动功能测试
,像Make一样,Ant也是程序性的。开发人员明确指定每个目标和完成目标所需的任务。对于每个项目,开发人员需要重写这个过程,这意味着大量的重复。Maven是声明性的,项目构建过程和过程每个阶段所需的工作都是由插件实现的,大多数插件都是现成的。开发人员只需要声明项目的基本元素,Maven执行内置的完整的构建过程。这在很大程度上消除了重复
此外,Ant不依赖管理,因此Ant用户不得不长时间手动管理依赖关系,这是一个令人头痛的问题幸运的是,蚂蚁用户现在可以管理与艾薇的依赖关系对于Maven用户来说,依赖管理是理所当然的。Maven不仅有内置的依赖管理,而且还有一个中央仓库,里面可能有世界上数量最多的Java开源软件包。Maven用户无需任何配置就可以直接享受它。
和格雷尔放弃了马文基于XML的复杂配置;众所周知,对XML的阅读体验相对较差。虽然机器很容易识别,但毕竟是由人维护的。相反,Gradle使用特定领域语言Groovy的配置,极大地简化了构建的代码行数。Maven设计的核心——配置之上的约定——是由Gradle进一步开发的,他的配置,即代码,超过了Maven。Gradle中的任何配置都可以作为代码执行。我们还可以使用现有的Ant脚本(Ant task是Gradle中的一级公民)、Java类库和Groovy类库来随时帮助编写构建任务。在关于现代Java开发的基本系列文章中,也有专门的章节来解释Gradle。作者还将在安卓和Spring项目的建设中优先考虑Gradle。环境配置
aven的安装也非常方便。您可以从Apache政府下载最新的Maven压缩包并解压缩它。您也可以使用SDK手册来执行安装。如果是手动配置,我们还需要在以下设置下配置系统的环境变量:
M2HOME:指向Maven安装目录
Path:在Maven安装目录下添加bin目录
。在用户目录下,我们可以找到。m2文件夹默认情况下,Maven本地仓库。m2/存储库位于此文件夹下所有Maven工件都存储在仓库中以供重用。默认情况下,除了存储库,在~/.m2目录中没有其他目录和文件,但是大多数Maven用户需要将M2HOME/conf/settings.xml文件复制到~/.m2/settings.xml。第
部分常用的Maven命令如下:mvn-v # view Maven version mvn compile # compile mvn test # test mvn package # package mvn clean # delete target mvn Install # Install jar package to local warehouse mvnarchetype:generate-dgrouid = co . Hou team-dartifactid = ZigBee-darchetypeartifactid = Maven-prototype-quick start-dinteractivemood = false #创建新工程网络代理的众所周知的原因是
我们通常需要访问国内镜像地址:
cn
OS China central
http://maven . OS China . net/content/groups/public/
central
或edit ~/.m2/ Settings.xml文件(如果它不存在,请复制$M2HOME/conf/settings.xml),添加代理配置如下:
...
my-proxy
true
http
proxy主机名
端口号
...
如果您不能尝试重新启动机器或ide(如eclipse ),您不能尝试以下方法:windows->首选项-> maven->安装add
在此配置之后,将使用指定目录中的maven代替eclipse的maven内置插件其他错误处理
(1)有时当执行mvn编译时,会暴露出找不到junit的错误。可能的解决方案包括:
在Eclipse的“项目”选项中使用项目清理
在pom.xml中引入junit依赖关系。并确保其作用域是编译的:
JUnit
JUnit
4.11
tes
(2)有时在Eclipse下执行mvn编译或相关命令时,它会报告某些文件具有无法识别的字符或非UTF字符此时,可以进行几项检查:
检查相应的Java文件是否具有Bom头
检查相应Java文件的编码
是否没有问题。如果没有问题,首先在Eclipse中将文件编码设置为GBK,然后尝试将其更改回UTF-8。项目配置
就像蚂蚁的Makefile和build.xml。Maven项目的核心是pom.xml首先,创建一个名为hello-world的文件夹,打开该文件夹,并创建一个名为pom.xml的新文件。输入以下内容:
4 . 0 . 0
com . wx . mvn
hello-world
1 . 0-snapshot
aven hello world project
文件结构
代码的第一行是xml标头,指定版本接下来是项目元素。项目是所有pom.xml的根元素,它还声明了一些与pom相关的命名空间和xsd元素。虽然这些属性不是必需的,但是使用这些属性可以使第三方工具(如集成开发环境中的XML编辑器)帮助我们快速编辑POM。
元素下的第一个子元素模型版本指定了当前POM模型的版本,对于Maven 2和Maven 3只能是4.0.0这段代码中最重要的行是组标识、artifactId和版本这三个元素定义了项目的基本坐标。在Maven的世界里,任何罐子、弹珠或战争都是基于这些基本坐标来区分的。
groupId定义项目属于哪个组。该组通常与项目所在的组织或公司相关联。例如,如果您在googlecode上设置了一个名为myap的项目,那么groupId应该是com.googlecode.myapp。如果您的公司是mycom,而一个项目是myap,那么groupId应该是com.mycom.myapp
artifactId定义了组中当前Maven项目的唯一标识。我们将artifactId定义为这个Hello World项目的hello-world。在本书的其他章节中,将为代码分配其他的artifactIds。在前面的groupId为com.googlecode.myapp的示例中,您可以将artifactId分配给不同的子项目(模块),如myapp-util、myapp-domain、myapp-web等。
版本指定Hello World项目1.0快照的当前版本快照意味着快照,这表明项目仍在开发中,是一个不稳定的版本。随着项目的发展,版本将不断更新,如升级到1.0、1.1-SNAPSHOT、1.1、2.0等。
的姓氏元素声明了一个更加用户友好的项目名称。虽然这不是必须的,但我建议为每个POM声明名称以方便信息交换。没有任何实际的Java代码,我们可以定义一个Maven项目的POM,这体现了Maven的一大优势。它可以使项目对象模型在最大程度上独立于实际代码。我们可以称之为解耦或正交,这在很大程度上避免了Java代码和POM代码之间的交互。例如,当项目需要升级版本时,只需要修改POM,不需要修改Java代码。然而,在POM稳定之后,日常的Java代码开发基本上不涉及POM的修改。pom.xml定义属性选项卡
utf-8
1 . 2 . 6
中的变量替换
上述内容更改为
org。spring framework
spring-core
$ { spring . version }
org . spring framework
spring-AOP
$ { spring . version }
还可以使用maven-properties插件来支持外部变量目录结构
Project的主代码不同于测试代码。项目的主代码将被打包到最终组件(如jar)中,而测试代码仅在运行测试时使用,不会被打包。默认情况下,Maven假设项目的主代码位于src/main/java目录中。我们遵循Maven的协议创建目录,然后在目录下创建文件com/wx/mvn/hello world/hello world . Java,如下所示:package com . wx . mvn . hello world;公共类HelloWorld {公共字符串sayHello(){返回“Hello Maven”;公共静态void main (string
)下面描述了一些Maven仓库如何工作。典型的maven依赖于这三个文件:Maven元数据。xmlmaven-元数据。xml。MD5 aven-元数据。xml。sha 1
aven-元数据。xml记录上次部署的版本和时间。
io。github。hengyunabc
mya tis-ehcache-spring
0 . 0 . 1-snapshot
20150804.095005
201508040950505
,其中MD5和sha1 mcrc用于确保此元文件的完整性当Maven编译一个项目时,他将首先尝试请求maven-metadata.xml。如果没有找到,他将直接尝试请求jar文件,并且当下载jar文件时,他还将尝试下载jar的md5、sha1文件。Maven的存储库没有优先级配置,也不能为某些依赖关系单独配置。因此,如果项目配置了多个存储库,它将在第一次编译时尝试一个接一个地下载依赖项。如果没有找到,试试下一个,整个过程会很长。因此,尽可能多的人依赖同一个仓库,而不是每个项目都有自己的仓库。如果要使用本地文件仓库,请在项目的pom.xml中配置它,例如:
hengyunaabc-maven-repo
file:/home/hengyunaabc/code/maven-repo/repository/