maven实战
maven实战
一直不懂
笔记
展开
-
【maven实战】46-编写Maven插件
编写Maven插件的的一般步骤:创建一个maven-plugin项目:插件本身也是Maven项目,特殊的地方在于它的packaging必须是maven-plugin,用户可以使用maven-archetype-plugin快捷创建一个Maven插件项目。 为插件编写目标:每个插件都必须包含一个或者多个目标,Maven称之为Mojo。编写插件的时候必须提供一个或者多个继承自AbstractMo...转载 2018-03-03 23:17:54 · 499 阅读 · 0 评论 -
【maven实战】45-使用maven-source-plugin打包源代码,使用maven-javadoc-plugin生成javadoc
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>2.10.2</version> <...转载 2018-02-11 21:53:53 · 637 阅读 · 0 评论 -
【maven实战】44-构件环境的差异
在不同的环境中,项目的源码应该使用不同的方式进行构建。最常见的就是数据库配置了。例如在开发的过程中,有些项目会在src/main/resources/目录下放置带有如下内容的数据库配置文件。开发环境:jdbc.driverClass=com.mysql.jdbc.Driverjdbc.jdbcUrl=jdbc:mysql://localhost:3306/testjdbc.user=...转载 2018-02-10 16:10:09 · 175 阅读 · 0 评论 -
【maven实战】43-Maven属性
通过<properties>元素用户可以自定义一个或多个Maven属性,然后在POM的其他地方使用${属性名称}的方式引用该属性,这种做法的最大意义在于消除重复。这不是Maven属性的全部,事实上这只是6类Maven属性中的一类而已。这6类属性分别为:内置属性:主要有两个常用内置属性——${basedir}表示项目根目录,即包含pom.xml文件的目录;${version}表示...转载 2018-02-10 02:28:52 · 175 阅读 · 0 评论 -
【maven实战】42-使用maven-release-plugin自动化版本发布
maven-release-plugin主要有三个目标,他们分别为:release:prepare准备版本发布,依次执行下列操作:检查项目是否有未提交的代码。 检查项目是否有快照版本依赖。 根据用户的输入将快照版本升级为发布版。 将POM中的SCM信息更新为标签地址。 基于修改后的POM执行Maven构建。 提交POM变更。 基于用户输入为代码打标签。 将代码从发布版升级为新...转载 2018-02-10 01:36:06 · 16970 阅读 · 2 评论 -
【maven实战】41-使用cargo-maven2-plugin实现自动化部署
Cargo是一组帮助用户操作Web容器的工具,能够实现自动化部署,并且支持几乎所有的Web容器,如Tomcat、JBoss、Jetty和Glassfish等。Cargo通过cargo-maven2-plugin提供了Maven集成,可以使用该插件将Web项目部署到Web容器中。cargo-maven2-plugin和jetty-maven-plugin功能相似,但目的不同。cargo-maven2...转载 2018-02-08 15:29:37 · 691 阅读 · 0 评论 -
【maven实战】40-使用jetty-maven-plugin进行测试
传统的Web测试方法要求我们编译,测试,打包及部署,这往往会耗费数分钟的时间,jetty-maven-plugin能够帮助我们节省时间,它能够周期性地检查项目内容,发现变更后自动更新到内置的Jetty Web容器中。换句话说他帮我们省去了打包和部署的步骤。jetty-maven-plugin默认就很好地支持了Maven的项目目录,通常情况下插件发现编译后的变化后,自动将其更新到Jetty容器,就可...转载 2018-02-07 22:46:24 · 1085 阅读 · 0 评论 -
【maven实战】39-构建Web应用
基于java的web应用其标准的打包方式是WAR,WAR与JAR类似,只不过它可以包含更多的内容,如JSP文件,Servlet,Java类,web.xml配置文件,依赖JAR包,静态web资源等,一个WAR包至少包含两个子目录:META-INF和WEB-INF,前者包含了一些打包元数据信息,我们一般不去关心;后者是WAR包的核心,WEB-INF下必须包含一个Web资源表述文件web.xml,它的子...转载 2018-02-07 22:04:09 · 125 阅读 · 0 评论 -
【maven实战】38-重用测试代码
在命令行运行mvn package的时候,Maven会将项目的主代码及资源文件打包,将其安装或部署到仓库之后,这些代码就能为他人使用,从而实现maven项目级别的重用。默认的打包行为是不会包含测试代码的,因此在使用外部依赖的时候,其构件一般都不会包含测试代码。这个时候Maven用户就需要通过配置maven-jar-plugin将测试类打包,如下:<plugin> ...转载 2018-02-06 23:02:19 · 291 阅读 · 0 评论 -
【maven实战】37-maven-surefire-plugin介绍
maven本身并不是一个单元测试框架,java中主流的单元测试框架为JUnit和TestNG。Maven所做的只是在构建执行到特定生命周期阶段的时候通过插件来执行JUnit或TestNG的测试用例。这一插件就是maven-surefire-plugin,可以称之为测试运行器,它能很好地兼容JUnit3,JUnit4以及TestNG。回顾一下default生命周期,其中的test阶段被定义为使用...转载 2018-02-06 22:50:13 · 2044 阅读 · 0 评论 -
【maven实战】36-Nexus的调度任务
Nexus提供了一系列可配置的调度任务来方便用户管理系统。用户可以设定这些任务运行的方式,例如每天、每周等。调度任务会在适当的时候在后台运行。当然用户还是能够在界面观察他们的状态的。要建立一个调度任务,单击左边导航菜单中的Scheduled Tasks链接,然后再右边的界面上单击Add按钮,用户可以根据自己的需要选择任务类型,并配置其运行方式。Nexus包含了以下几种类型的调度任务...转载 2018-02-06 21:43:30 · 740 阅读 · 0 评论 -
【maven实战】35-为项目分配独立的仓库
在组织内部,如果所有项目都部署快照及发布版本构件至同样的仓库,就会存在潜在的冲突及安全问题,我们不想让项目A的部署影响到项目B,反之亦然。解决的方法就是为每个项目分配独立的仓库,并且只将仓库的部署,修改,删除权限赋予该项的成员,其他用户只能读取,下载和搜索该仓库的内容。假设项目名臣为Foo,首先为该项目建立两个宿主仓库Foo Snapshot和Foo Release,分别用来部署快照构件和发布...转载 2018-02-06 21:36:10 · 693 阅读 · 0 评论 -
【maven实战】34-Nexus的权限管理
在组织中使用Nexus的时候往往会有一些安全性需求,例如希望只有管理员才能配置Nexus只有某些团队成员才能部署构件,或者更细一些的要求,例如每个项目都有自己的Nexus宿主仓库,且只能部署项目构件至该仓库中。Nexus提供了全面的权限控制特性,能让用户自由地根据需要配置Nexus用户,角色,权限等。Nexus的访问控制模型:Nexus是基于权限做访问控制的,服务器的每一个资源都有相应的权限来...转载 2018-02-06 14:57:32 · 1568 阅读 · 0 评论 -
【maven实战】33-部署构件至Nexus
使用Maven部署构件至Nexus:日常开发生成的快照版本构件可以直接部署到Nexus中策略为Snapshot的宿主仓库中,项目正式发布的构件应该部署到Nexus中策略为Release的宿主仓库中。POM配置方式如下:<project> ...<distributionManagement> <repository> ...转载 2018-02-06 14:57:17 · 226 阅读 · 0 评论 -
【maven实战】32-配置Maven从Nexus下载构件
在POM中为Maven配置仓库和插件仓库。例如当需要为项目添加Nexus私服上的public仓库时,可以按如下配置:<project> ... <repositories> <repository> <id>nexus</id> &l...转载 2018-02-06 14:57:03 · 262 阅读 · 0 评论 -
【maven实战】31-Nexus的索引与构件搜索
既然Nexus能够维护宿主仓库并代理缓存远程仓库,那么一个简单的需求就自然浮现出来了,这就是搜索。为了能够搜索Maven中央仓库,首先需要设置Nexus中的Central代理仓库下载远程索引。需要注意的是,默认这个配置的值是False。由于中央仓库的内容比较多,因此其索引文件比较大,Nexus下载该文件也需要比较长的时间,可以想象Nexus在后台运行了一个任务来下载中央仓库的索引,幸运的是...转载 2018-02-06 14:56:49 · 642 阅读 · 0 评论 -
【maven实战】30-Nexus仓库分类概念
Maven可以直接从宿主仓库下载构件;Maven也可以从代理仓库下载构件,而代理仓库会间接地从远程仓库下载并缓存构件;最后为了方便,Maven可以从仓库组下载构件,而仓库组没有实际内容,他会转向其他包含的宿主仓库或者代理仓库获得实际构件的内容。创建Nexus宿主仓库:单击界面左边导航栏中的Repositories链接,在右边的面板中选择Add接着在下拉菜单中选择Hosted Reposit...转载 2018-02-05 23:30:59 · 1180 阅读 · 0 评论 -
【maven实战】29-Nexus内置仓库
Nexus私服中包含了所有类型的Nexus仓库,有四种类型:group(仓库组),hosted(宿主),proxy(代理),virtual(虚拟)。仓库还有一个属性为Pilicy(策略),表示该仓库为发布(Release)版本还是快照(Snapshot)版本库。最后两列为仓库的状态和路径。下面解释一下各个仓库的用途,maven1格式的仓库不会介绍。此外由于虚拟类型仓库的作用实际上是动态地将...转载 2018-02-05 21:12:04 · 223 阅读 · 0 评论 -
【maven实战】28-安装Nexus
下载Nexus安装包https://www.sonatype.com/oss-thank-you-tgz,Nexus的Bundle自带了Jetty容器,因此用户不需要额外的web容器就能直接启动Nexus。首先解压Nexus就会得到如下两个子目录:nexus-webapp-2.14.6-02/:该目录包含了Nexus运行所需要的文件,如启动脚本,依赖jar包等。sonatype-work/...转载 2018-02-05 13:12:25 · 200 阅读 · 0 评论 -
【maven实战】27-反应堆
修改account-aggegator的聚合配置如下:<modules> <module>account-email</module> <module>account-persist</module> <module>account-parent</module></modul...转载 2018-02-05 13:12:10 · 534 阅读 · 0 评论 -
【maven实战】26-约定优于配置
maven提倡约定优于配置,使用约定可以大量减少配置。<project><modelVersion>4.0.0</modelVersion><groupId>coom.juvenxu.mvnbook</groupId><artifactId>my-project</artifactId><...转载 2018-02-05 13:11:18 · 267 阅读 · 0 评论 -
【maven实战】25-聚合与继承的关系
多模块中的聚合与继承其实是两个概念,其目的是完全不同的,前者主要是为了方便快速构建项目,后者主要是为了消除重复配置。对于聚合模块来说,它知道有哪些被聚合的模块,但那些被聚合的子模块不知道这个聚合模块的存在。对于继承关系的父POM来说,它不知道哪些子模块继承于它,但那些子模块都必须知道自己的父POM是什么。在现有的实际项目中,往往会发现一个POM即是聚合POM,又是父POM,这么做主要是...转载 2018-02-05 13:11:05 · 248 阅读 · 0 评论 -
【maven实战】24-插件管理
Maven提供了dependencyManagement元素帮忙管理依赖,类似地,Maven也提供了pluginManagement元素帮忙管理插件。该元素中配置的依赖不会造成实际的插件调用行为,当POM中配置了真正的plugin元素,并且其groupId和artifactId与pluginManagement中配置的插件匹配时,pluginManagement的配置才会影响实际的插件行为。前...转载 2018-02-05 13:09:42 · 249 阅读 · 0 评论 -
【maven实战】23-依赖管理
上一节的可继承元素列表包含了dependencies元素,说明了依赖会被继承,这时我们就会很容易想到将这一特性应用到account-parent中。子模块account-email和account-persist同时依赖了很多包,因此可以将这些依赖配置放到父模块account-parent中,两个子模块就能移除这些依赖简化配置。上述做法是可行的,但却存在问题。我们无法确定将来添加的子模块就一定...转载 2018-02-05 13:08:56 · 252 阅读 · 0 评论 -
【maven实战】22-继承
maven聚合特性可以通过一条命令同时构建account-email和account-persist两个模块,但是这两个模块有着很多相同的配置,例如有相同的groupId和version,有相同的spring-core,spring-beans等和相同maven-compiler-plugin与maven-resources-plugin等插件配置。在maven中有机制让我们抽取出重复的配置这就是...转载 2018-02-05 13:08:43 · 172 阅读 · 0 评论 -
【maven实战】21-聚合
假设我们已经有了两个模块account-email和account-persist。这时一个简单的需求就会自然而然地显现出来,我们会想要一次构建两个项目,而不是到两个模块的目录下分别执行mvn命令。maven聚合这一特性就是为该需求服务的。为了能够使用一条命令就能构建 account-email和 account-persist两个模块,我们需要建立一个额外的名为 account-aggreg...转载 2018-02-05 13:08:29 · 224 阅读 · 0 评论 -
【maven实战】20-插件解析机制
插件仓库:与依赖构件一样,插件构件同样基于坐标存储在maven仓库中,在需要的时候maven会从本地仓库中查找插件,如果不存在则从远程仓库查找。找到插件后在下载到本地仓库使用。值得一提的是maven会区别对待依赖的远程仓库与插件的远程仓库。当maven需要的依赖在本地仓库不存在时,他会去所配置的远程仓库查找,可是当maven需要的插件在本地仓库不存在时他就不会去这些远程仓库查找。不同于repo...原创 2018-02-04 19:29:13 · 425 阅读 · 0 评论 -
【maven实战】19-从命令行调用插件
如果在命令行运行mvn -h来显示mvn命令帮助,就可以看到如下的信息:usage: mvn [options] [<goal(s)>] [<phase(s)>]Options: -am,--also-make If project list is specified, also ...转载 2018-02-04 17:44:26 · 1248 阅读 · 0 评论 -
【maven实战】18-使用maven-help-plugin描述插件
除了访问在线的插件文档之外,还可以借助maven-help-plugin来获取插件的详细信息。可以运行如下命令来获取maven-compiler-plugin2.1版本的信息:mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1这里执行的是maven-help-plugin的descri...转载 2018-02-04 16:58:11 · 2156 阅读 · 0 评论 -
【maven实战】17-插件配置
命令行插件配置:在日常的maven使用中我们会经常从命令行输入并执行maven命令。在这种情况下如果能够方便地更改某些插件的行为无疑会十分方便。很多插件目标的参数都会支持从命令行配置,用户可以在maven命令中使用-D参数并伴随一个参数键=参数值的形式,来配置插件目标的参数。例如maven-surefire-plugin提供了一个maven.test.skip参数,当其值为true的时候,就会...转载 2018-02-04 16:48:13 · 294 阅读 · 0 评论 -
【maven实战】16-插件目标与插件绑定
maven的核心仅仅定义了抽象的生命周期,具体的任务是交由插件完成的,插件以独立的构件形式存在,因此maven核心的分发包只有3M左右,maven会在需要的时候下载并使用插件。对于插件本身,为了能够服用代码他往往能够完成多个任务。例如maven-dependency-plugin,它能够基于项目依赖做很多事情。它能够分析项目依赖,帮助找出潜在的无用依赖等等;它能列出项目的依赖树,帮助分析依赖来...转载 2018-02-04 15:43:29 · 881 阅读 · 0 评论 -
【maven实战】15-命令行与生命周期
从命令执行maven任务的最主要方式就是调用maven的生命周期阶段。需要注意的是各个生命周期是相互独立的,而一个生命周期的阶段是有前后依赖关系的。下面以一些常见的maven命令为例,解释其执行的生命周期阶段:mvn clean:该命令调用clean生命周期的clean阶段。实际执行的阶段为clean生命周期的pre-clean和clean阶段。mvn test:该命令调用default生...转载 2018-02-04 15:30:31 · 149 阅读 · 0 评论 -
【maven实战】14-生命周期
maven的生命周期就是为了对所有的构建过程进行抽象和统一。这个生命周期包含了项目的清理,初始化,编译,测试,打包,集成测试,验证,部署和站点生成等几乎所有构建步骤。也就是说几乎所有项目的构建都能映射到这样一个生命周期上。maven的生命周期是抽象的,这意味着生命周期本身不做任何实际工作在maven的设计中,实际人物都交由插件来完成。三套生命周期:maven拥有三套相互独立的生命周期,他们分别...转载 2018-02-04 15:15:58 · 180 阅读 · 0 评论 -
【maven实战】13-仓库镜像
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。举个例子http://maven.aliyun.com/nexus/content/groups/public是中央仓库在中国的镜像,由于地理位置的因素该镜像往往能提供比中央仓库更快。因此可以配置maven使用该镜像来替代中央仓库。编辑settings.xml如下:<mirrors> <mirror...转载 2018-02-04 01:33:00 · 228 阅读 · 0 评论 -
【maven实战】12-从仓库解析依赖的机制
当本地仓库没有依赖构件的时候,maven会自动从远程仓库下载;当依赖版本为快照版本的时候maven会自动找到最新的快照。这背后的依赖解析机制可以概括如下:1当依赖的范围是system的时候maven直接从本地文件系统解析构件。2根据依赖坐标计算仓库路径后,尝试直接从本地仓库寻找构件,如果发现相应构件则解析成功。3在本地仓库不存在相应构件的情况下,如果依赖的版本显示的发布版本构件,如1....转载 2018-02-04 01:14:05 · 298 阅读 · 0 评论 -
【maven实战】11-远程仓库配置
有时候默认的中央仓库无法满足项目的需求,可能项目需要的构件存在与另外一个远程仓库中,如JBoss Maven仓库。这时可以在POM中配置该仓库如下:<repositories> <repository> <id>jboss</id> <name>JBoss Repository...转载 2018-02-04 00:00:12 · 542 阅读 · 0 评论 -
【maven实战】10-仓库分类
maven仓库分为本地仓库和远程仓库。当maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在此构件则直接使用,如果本地仓库不存在此构件或者需要查看是否有更新的构件版本,maven就会去远程仓库查找,发现需要的构件后下载到本地仓库再使用。如果本地仓库和远程仓库都没有需要的构件,maven就会报错。本地仓库:一般来说在maven项目目录下没有诸如lib/这样用来存放依赖文件...转载 2018-02-03 22:16:23 · 209 阅读 · 0 评论 -
【maven实战】09-排除依赖
传递性依赖会给项目隐式地引入很多依赖有些时候这种特性也会带来问题。例如,当前项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另外一个类库的SNAPSHOT版本,那么这个SNAPSHOT就会成为当前项目的传递性依赖,而SNAPSHOT的不稳定会直接影响到当前的项目。这时候就需要排除掉该SNAPSHOT,并且在当前项目中声明该类库的某个正式版本。还有一些情况,你可能也想要替换某个传递性依赖...转载 2018-02-03 21:02:55 · 195 阅读 · 0 评论 -
【maven实战】08-可选依赖
假设有这样一个依赖关系,项目A 依赖于项目B,项目B依赖于项目X和Y,B对于X和Y的依赖都是可选依赖:A->B,B->X(可选),B->Y(可选)。根据传递性依赖的定义,如果所有这三个的范围都是compile那么X,Y就是A的compile范围传递性依赖。然而由于这里X,Y是可选依赖,依赖将不会得以传递。换句话说,X,Y将不会对A有任何影响。为什么要使用可选依赖这一特性呢?可...转载 2018-02-03 19:59:11 · 336 阅读 · 0 评论 -
【maven实战】07-依赖调解
有时候当传递性依赖造成问题的时候,我们就需要清楚地知道该传递性依赖是从哪条依赖路径引入的。加入项目A有这样的依赖关系:A->B->C->X(1.0),A->D->X(2.0),X是A的传递性依赖,但是这两条依赖路径上有两个版本的X,那么哪个X会被maven解析使用呢?两个版本都被解析显然是不对的以为会造成依赖重复,因此必须选择一个。maven依赖调解的第一原则...转载 2018-02-03 19:25:41 · 230 阅读 · 2 评论