maven概述

  Maven的核心是POM(Project Object Model),即项目对象模型。最直观的,maven对项目依赖进行统一的管理,让开发者从纷杂错乱的jar包世界摆脱出来,更加专注于项目构建以及开发。事实上,maven并不止是一个项目构建工具,它还是一个项目管理工具。它提供了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统和用来定义在生命周期阶段中插件目标的逻辑。
  POM文件结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<version>1.0-SNAPSHOT</version>
<groupId>XXX</groupId>
<artifactId>XXX</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<!--jar依赖:包括groupId,artifactId,version-->
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!--插件配置-->
</plugin>
</plugins>
</build>
</project>

  如上所示,定义了一个项目,其中主要元素包括:模型的版本,项目的版本,项目的名称,项目的打包类型,项目依赖,项目的插件配置。

maven指令

1
2
3
4
5
6
7
8
mvn archetype:create //根据指定的类型创建项目框架
mvn clean //清除项目构建,主要是target目录下的文件
mvn install //在本地编译安装,将生成的jar或者其他类型的包安装到本地仓库
mvn package //编译打包
mvn deploy //将最终的包发布到远程仓库
mvn test //执行测试用例
mvn jetty:run/mvn tomcat:run //以mvn插件的形式启动jetty和tomcat服务器
mvn compile //编译项目

  常用的maven命令如上所示。更多命令,参考相关资源

maven多模块

  项目的开展从人员安排上来说,是需要分工协作的,不同的人做不同的事情。从项目的设计角度来讲,项目需要合理的解耦和,维护一定的层次关系和结构。从开发效率角度来讲,当项目到了一定的量级,那就需要分模块开发,集中关注。模块化开发以及层次化设计是现在项目的主要方式,maven的多模块功能提供了项目的分割。一个项目包含若干模块,完成不同的事情,关注不同的层次,各自的实现互不影响。
  maven多模块的使用example,建立一个maven工程,包括三个模块:maven-biz,maven-web.
各工程中pom文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--maven-parent的pom结构-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>XXX.yyy</groupId>
<artifactId>maven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging><!--最上层项目的打包类型为pom-->
<name>maven</name>
<url>http://maven.apache.org</url>
...
<modules>
<module>maven-biz</module>
<module>maven-web</module>
</modules>
...
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!--maven-biz的pom文件-->
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent><!--上层项目-->
<groupId>XXX.yyy</groupId>
<artifactId>maven</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>XXX.yyy</groupId>
<artifactId>maven-biz</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>maven-biz</name>
<url>http://maven.apache.org</url>
...
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!--maven-web的pom文件-->
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>XXX.yyy</groupId>
<artifactId>maven</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>maven-web</artifactId>
<packaging>war</packaging>
<name>maven-web Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>XXX.yyy</groupId><!--子模块依赖-->
<artifactId>maven-biz</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
...
</dependencies>
<build>
<finalName>maven-web</finalName>
</build>
</project>

maven插件

Autoconfig

  在一个项目之中,总会有一些参数在开发环境和生产环境是不同的,或者会根据环境的变化而变化。我们如果通过硬编码的方式,势必要经常性的修改项目代码。经常修改代码的结果不用多说了。那我们可以用一种方式,在项目编译前将可变的参数改为可配置的。如此,灵活性就大大的增加,也减少了经常修改代码可能带来的不稳定风险。
Autoconfig就是这样的一个工具,它通过占位符将需要动态配置的内容替换。Maven Filtering也是这样的一个工具。那么二者的区别在哪里?看下表

问题 Maven Filtering AutoConfig
如何修改配置文件的参数? Maven Filtering必须获得源码并重新build 而AutoConfig不需要提取源码,也不需要重新build,即可改变目标文件中所有配置文件中placeholders的值
如何确保placeholder替换的正确性? Maven Filtering不能验证placeholder值的缺失和错误 AutoConfig可以对placeholder及其值进行检查

  解释下:autoconfig为什么不需要提取源码就可以改变目标文件中的待替换值。观察Ali-Tomcat的启动流程,我们可以发现,Ali-Tomcat在Tomcat基本组件启动完全之后,部署项目之前会再次去寻找项目中的auto-config.xml文件,然后完成对placeholder的再次替换,与autoconfig不同的是,maven编译后不可更改,因为它无法再build之后、正式运行前再次进行替换。然而autoconfig的这种优势是依赖于Ali-Tomcat的,从服务器的启动日志就可以看出。以下为Ali-Tomcat的启动日志。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
INFO: Starting Servlet Engine: Apache Tomcat/7.0.59.429
2015-08-03 16:40:14,569 com.taobao.tomcat.container.host.AliHostConfigHelper parseJbossWebXml
INFO: Get contextPath: '/' from WEB-INF/jboss-web.xml
2015-08-03 16:40:14,572 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory D:\workspaces\soft\taobao-tomcat-7.0.59\deploy\ROOT
2015-08-03 16:40:14,613 com.taobao.tomcat.autoconfig.AutoConfigHelper containsAutoConfigXmlInMetaInf
INFO: Found auto-config.xml: D:\workspaces\soft\taobao-tomcat-7.0.59\deploy\ROOT\META-INF\autoconfig\auto-config.xml
2015-08-03 16:40:14,614 com.taobao.tomcat.autoconfig.AutoConfigHelper doAutoConfigIfNecessary
INFO: We are in develop mode, and auto-config.xml exists under META-INF, therefore auto config will be executed.
2015-08-03 16:40:14,615 com.taobao.tomcat.autoconfig.AutoConfigHelper getAutoConfigClassLoader
INFO: Auto config jar path: D:\workspaces\soft\taobao-tomcat-7.0.59\tools\auto-config.jar
2015-08-03 16:40:14,623 com.taobao.tomcat.autoconfig.AutoConfigFilter doFilter
INFO: Starting auto config...
2015-08-03 16:40:14,633 com.taobao.tomcat.autoconfig.AutoConfigFilter initAutoConfigRuntime
INFO: Doing auto config on doc base: D:\workspaces\soft\taobao-tomcat-7.0.59\deploy\ROOT
2015-08-03 16:40:14,634 com.taobao.tomcat.autoconfig.AutoConfigFilter initAutoConfigRuntime
INFO: Auto config interactive mode: off
2015-08-03 16:40:19,915 com.taobao.tomcat.autoconfig.AutoConfigFilter doFilter
INFO: Auto config completed.
2015-08-03 16:40:20,314 org.apache.catalina.loader.WebappClassLoader validateJarFile

  关于这个好处,就不多说了。说一下个人的想法吧,Autoconfig实现的功能是参数的替换,可以动态的修改一些配置,例如:服务器的地址,服务的版本等。分两个方面:对于一些常用的静态的配置:服务器,端口,数据库等基本信息无疑是十分方便的。但是如果是想要用来替换和修改服务的版本,可能会有很大的风险,因为服务的接口可能有被重新设计,导致项目无法使用,也就需要重新修改工程,这里的版本替换的作用也就不是很大,相反还有一定的风险性。

相关资源

alitomcat maven以及Autoconfig的更多相关文章

  1. AutoConfig工具使用指南

    转载:http://blog.csdn.net/fighterandknight/article/details/70245905 13.1. 需求分析 13.1.1. 解决方案 13.2. Auto ...

  2. maven auto-config 多环境自动打包

    摘自:http://doc.okbase.net/bjhecwq/archive/118121.html maven有许多优秀的插件,最近在研究打包中替换多重环境的配置,同事介绍使用阿里的auto-c ...

  3. Maven插件实现的autoconfig机制(转)

    autoconfig这种机制在软件开发和发布的过程中是非常方便也是非常必要的一种动态替换配置信息的一种手段,一种很贴切的比喻:这个就像在windows下面安装一个软件时,我们按照安装向导给我们弹出提示 ...

  4. maven 插件之 AutoConfig 工具使用笔记

    AutoConfig 是一款 maven 插件,主要用于 Maven 项目打包使用.在我们的工作中,会将自己写的代码打成 jar 包或者 war 包发布到各种环境上.一般地,不用的环境所使用的数据库. ...

  5. maven pom.xml加载不同properties配置[转]

    可以参考http://www.openwebx.org/docs/autoconfig.html 1.pom.xml =========================== <!-- 不同的打包 ...

  6. intellij idea使用配置jetty maven 插件

    pom.xml中更改或则添加: <build> <finalName>mall</finalName> <plugins> <plugin> ...

  7. 关于 Maven 的插件maven-war-plugin

    在进行项目发布的时候,可能会碰到这样的情况, 希望在保持项目源代码不变的前提下,希望能够针对不同的运行环境获得相应的运行包.(比如war包) 基本配置 :(包括排除 不想打进war包的jar 的配置) ...

  8. 《Maven实战》阅读笔记

    java -versionmvn -vmvn help:system m2eclipse maven->install MAVEN_OPTS: -Xms128m -Xmx512mmvn clea ...

  9. Maven开发环境的搭建,含jetty调试[简单明了]

    之前的一片老文,搬过来. 1. Maven的开发环境需要哪些部件a) Maven.去http://maven.apache.org/ 下载.将其bin目录加入进系统PATH.测试方法:用命令mvn – ...

随机推荐

  1. 【原创】LogCat信息演示Activity生命周期

    界面如下:注意:这是在手机.竖屏状态下! (一)1个Activity     /**     * 7个方法     * 测试1个Activity的生命周期     *      * LogCat:   ...

  2. hihocoder编程收割赛20

    hihocoder编程收割赛20 hihocoder1542 : 无根数变有根树 hihocoder1542 思路: 树的遍历 ac代码: // hihocompete20_01.cpp : 定义控制 ...

  3. JAVA容器-浅谈HashMap的实现原理

    概述 HashMap是通过数组+链表的方式实现的,由于HashMap的链表也是采用数组方式,我就修改直接利用LinkedList实现,简单模拟一下. 1.Key.Value的存取方式. 2.HashM ...

  4. CentOS下KVM克隆完成后修改MAC地址/VMware复制虚拟机修改MAC地址

    克隆完成之后可能mac地址会有冲突,进入KVM删除/etc/udev/rules.d/70-persistent-net.rules中的eth0的配置,接着把eth1改成eth0,并且修改/etc/s ...

  5. TEA加密算法java版

    这个算法简单,而且效率高,每次可以操作8个字节的数据,加密解密的KEY为16字节,即包含4个int数据的int型数组,加密轮数应为8的倍数,一般比较常用的轮数为64,32,16,推荐用64轮. 源代码 ...

  6. chrome插件开发-----------将网址转化成二维码website2QRcode

    微信自带的浏览器无法输入链接,仅仅能通过扫描二维码实现.可是有时候看到一个有趣的站点,想分享,还得先去将链接转化成二维码的站点.先转成二维码.再扫描.有点麻烦.所以写了一个插件.直接生成二维码. 须要 ...

  7. Effective JavaScript Item 51 在类数组对象上重用数组方法

    Array.prototype对象上的标准方法被设计为也能够在其他对象上重用 - 即使不是继承自Array的对象. 因此,在JavaScript中存折一些类数组对象(Array-like Object ...

  8. [翻译] TLMotionEffect 重力感应

    TLMotionEffect  重力感应 https://github.com/jvenegas/TLMotionEffect This category adds a motion effect t ...

  9. jQuery EasyUI API 中文文档 - Panel面板

    <html> <head> <title>布局管理器--控制面板</title> <script src="jquery-easyui/ ...

  10. [Android Studio] Android Studio快速定位当前打开的文件在哪个目录(package)下

    转载自:http://blog.csdn.net/hyr83960944/article/details/38067499 在Eclipse中有一个很好的功能,就是比如我打开一个AActivity,左 ...