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. asp.net 将repeater上数据导出到excel

    1,首先得到一个DataTable public DataTable GetTable(string sql) { SqlConnnection con=new SqlConnection(Confi ...

  2. Educational Codeforces Round 11 D. Number of Parallelograms 暴力

    D. Number of Parallelograms 题目连接: http://www.codeforces.com/contest/660/problem/D Description You ar ...

  3. PAT甲级1066. Root of AVL Tree

    PAT甲级1066. Root of AVL Tree 题意: 构造AVL树,返回root点val. 思路: 了解AVL树的基本性质. AVL树 ac代码: C++ // pat1066.cpp : ...

  4. MySQL5.7添加授权账号及修改默认端口

    1.修改默认端口 打开配置文件 vim /etc/my.cnf 分别添加端口在client.mysql节点 [client] port=15099 [mysqld] port=15099 需要注意se ...

  5. java类中元素初始化顺序详解

    父类静态变量父类静态块子类静态变量子类静态块父类普通变量父类普通块父类构造方法子类普通变量子类普通块子类构造方法

  6. URAL 1099. Work Scheduling (一般图匹配带花树)

    1099. Work Scheduling Time limit: 0.5 secondMemory limit: 64 MB There is certain amount of night gua ...

  7. CMOS DACs act as digitally controlled voltage dividers

    Digital potentiometers, such as Analog Devices’ AD5160, make excellent digitally controlled voltage ...

  8. [转].net reactor 学习系列(四)---.net reactor应用场景

    前面已经学习了.net reactor一些基础知识,现在准备学习下实际的应用场景,只是简单的保护和许可证发放场景.如果想应用更高级的场景比如自动化程序许可证的发放及自定义客户端的过期提示等等就需要自己 ...

  9. erlang 大神

    http://blog.csdn.net/erlib/article/details/46655905

  10. .NET:用T4消除代码重复,对了,也错了

    背景 我需要为int.long.float等这些数值类型写一些扩展方法,但是我发现他们不是一个继承体系,我的第一个思维就是需要为每个类型重复写一遍扩展方法,这让我觉得非常不爽,但是我还是不情愿的写了, ...