Overview

以下纪录了实现Maven自动部署的步骤。

修改本地Tomcat端口

为了保持本地环境跟服务器环境一致,方便部署,首先需要修改本地tomcat的默认端口号,将8080改为8888:修改tomcat目录中/conf/server.xml中的Connectorport属性。

    <Connector port="8888" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="UTF-8"/>

修改settings.xml

  • 修改用户当前根目录下~/.m2/settings.xml文件,默认情况下,.m2目录下并不在settings.xml,需要手动把${MAVEN_HOME}/libexec/conf/settings.xml复制到~/.m2/下,比如在我的环境下,执行如下命令:
    cp /usr/local/Cellar/maven/3.2.3/libexec/conf/settings.xml ~/.m2
    有的maven版本位置为${MAVEN_HOME}/conf/settings.xml

  • 添加server信息
    <servers></servers>标签对中,添加如下信息

      <server>
        <id>mytomcat6</id>
        <username>admin</username>
        <password>admin</password>
      </server>
    

修改项目pom.xml

  • 在pom中添加plugin:

       <plugin>
              <groupId>org.codehaus.mojo</groupId>
              <artifactId>tomcat-maven-plugin</artifactId>
              
              <configuration>
                  <server>mytomcat6</server>
                  <update>true</update>
                  <port>${tomcat.port}</port>
                  <path>/${project.artifactId}</path>
                  <uriEncoding>${project.build.sourceEncoding}</uriEncoding>
                  <url>http://localhost:8888/manager</url>
              </configuration>
          </plugin>
    

修改tomcat下的tomcat-users.xml文件

  • 在tomcat文件夹中找到/conf/tomcat-users.xml,比如我的文件地址为:/Library/apache-tomcat-6.0.43/conf/tomcat-users.xml

  • 在tomcat-users.xml中<users></users>对中添加如下信息:

      <role rolename="manager-gui"/>
      <role rolename="manager-script"/>
      <role rolename="manager-jmx"/>
      <user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx"/>
    

自动部署到tomcat

  • 使用 mvn clean tomcat:deploy 命令部署。注意,不是mvn clean deploy命令,deploy命令包含了install命令,会先将项目构件安装到本地maven库中,然后安装到远程配置好的私有仓库上。

  • 需要先启动tomcat,否则会有如下报错信息:

      [ERROR]Failed to execute goal org.apache.tomcat.maven: tomcat7-maven-plugin: 2.0- SNAPSHOT: deploy (default-cli) on project helloworld: Cannot invoke Tomcat manager: Connection refused: connect -> [Help 1]
    

还差一点

此时部署,会报以下错误:

FAIL - Application already exists at path
  • 原因:

    由于tomcat的目录下:/Library/apache-tomcat-6.0.43/conf/server.xml有了重复配置的上下面:

      <Context docBase="jeesite" path="/jeesite_lian"                             reloadable="true" source="org.eclipse.jst.jee.server:jeesite"/>
    <Context docBase="jeesite_lian" path="/jeesite_lian" reloadable="true" source="org.eclipse.jst.jee.server:jeesite_lian"/>
    

path属性配置重复,由于之前有一个相同的本地项目,这次运行的项目是从SVN下载到本地的,但是拥有一样的path属性,因此报错。注释掉这两个Context就可以了。

支持热部署

需要在pomtomcat6插件的configuration配置项中添加一个属性, <update>true</update>,完整的插件如下

    <!-- tomcat6插件 -->
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat6-maven-plugin</artifactId>
            <version>${tomcat.version}</version> 
            <configuration>
                <server>mytomcat6</server>
                <update>true</update>
                <port>${webserver.port}</port>
                <path>/${project.artifactId}</path>
                <uriEncoding>${project.build.sourceEncoding}</uriEncoding>
                <url>http://localhost:8080/manager</url>
            </configuration>
        </plugin>

使用Hudson构建mvn clean tomcat:deploy 并部署到远程服务器Tomcat

  • 报错:JVM虚拟机内存不足,无法分配内存。

  • 解决方案:
    在Hudson设置界面,build选项栏下点击advance按钮
    1.png

    在JVM Options选项中增加-Xmx512m增加JVM虚拟机的内存大小。
    2.png

  • 小插曲
    在修改了JVM内存之后,发现依然报错。使用htop命令查看发现由于阿里云服务器内存太小(1G),导致实际内存被耗尽,Hudson使用的JVM内存无法向上调整。升级配置之后,问题解决。