zoukankan      html  css  js  c++  java
  • alitomcat maven以及Autoconfig

    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 FilteringAutoConfig
    如何修改配置文件的参数? 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:workspacessoft aobao-tomcat-7.0.59deployROOT
    2015-08-03 16:40:14,613 com.taobao.tomcat.autoconfig.AutoConfigHelper containsAutoConfigXmlInMetaInf
    INFO: Found auto-config.xml: D:workspacessoft aobao-tomcat-7.0.59deployROOTMETA-INFautoconfigauto-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:workspacessoft aobao-tomcat-7.0.59 oolsauto-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:workspacessoft aobao-tomcat-7.0.59deployROOT
    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实现的功能是参数的替换,可以动态的修改一些配置,例如:服务器的地址,服务的版本等。分两个方面:对于一些常用的静态的配置:服务器,端口,数据库等基本信息无疑是十分方便的。但是如果是想要用来替换和修改服务的版本,可能会有很大的风险,因为服务的接口可能有被重新设计,导致项目无法使用,也就需要重新修改工程,这里的版本替换的作用也就不是很大,相反还有一定的风险性。

    相关资源

  • 相关阅读:
    51 Nod 1013 3的幂的和 矩阵链乘法||逆元+快速幂
    poj3580 序列之王 fhqtreap
    bzoj1503: [NOI2004]郁闷的出纳员 fhqtreap版
    bzoj1251: 序列终结者 fhqtreap写法
    bzoj4864: [BeiJing 2017 Wc]神秘物质
    bzoj3786 星际探索 splay dfs序
    bzoj1861 书架 splay版
    bzoj1503 郁闷的出纳员 splay版
    网络转载:局域网安全:解决ARP攻击的方法和原理
    黑客的故事
  • 原文地址:https://www.cnblogs.com/diegodu/p/7283896.html
Copyright © 2011-2022 走看看