美文网首页服务端开发实战IDEA
使用tomcat7插件将项目一键部署到远程tomcat服务器-热

使用tomcat7插件将项目一键部署到远程tomcat服务器-热

作者: Crocutax | 来源:发表于2017-09-19 20:20 被阅读162次

    版权声明:本文来自 Crocutax 的博客 , 转载请注明出处 http://www.crocutax.com

    现在用maven管理J2EE项目应该是常态了,在开发阶段我们经常需要经历反复的"修改代码->部署->测试"过程。如果每次修改完代码,都通过maven先clean->package,再手动到输出目录把打好的war包copy到tomcat的webapps下,多次的重复这种无意义的体力活会让人烦躁,而且显得没有程序员精神。

    不得不说,有些时候“懒”还是有很多正面意义的。这篇文章就是介绍下如何通过tomcat7插件将项目一键部署到tomcat服务器的webapps目录下。命令很简单,主要是环境配置,以及踩坑记录。

    实现tomcat热部署用到了:

    • maven (项目构建和依赖管理)
    • tomcat7插件 (部署到tomcat的插件)
    • tomcat服务器 (web服务器)

    1.添加tomcat用户及权限

    由于涉及到tomcat的自动部署,所以需要具备tomcat的管理权限,而普通的tomcat用户是没有管理权限的,比如通过{TOMCAT_HOME}/bin/startup.bat启动tomcat之后,在首页右侧的Manager App中,需要先输入管理员账户和密码才能进行项目服务器上项目的管理,否则根本无法进入管理页面。

    添加用户和权限也很简单,在{TOMCAT_HOME}/conf/tomcat-users.xml 文件中,</tomcat-users>节点下添加如下内容,创建管理角色和用户,并授权用户管理角色:

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

    之后进入tomcat首页->Manager App测试管理员账号是否创建成功

    注:

    • username和password可以自定义,这里为了简单记忆使用了tomcat同时作为用户名和密码。
    • 网上有的博客这里配置了大量的权限,但是目前并没有发现其在这个阶段的作用和意义。

    2.配置tomcat允许远程访问

    默认tomcat只允许本地部署,如果是要部署到远程服务器上,那么需要在远程服务器的{TOMCAT_HOME}conf/Catalina/localhost/目录下创建一个manager.xml文件,配置如下内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <Context privileged="true" antiResourceLocking="false" docBase="${catalina.home}/webapps/manager">
             <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
    </Context>
    

    如果只想允许部分IP拥有访问权限,那么可以配置allow节点,比如

    allow="127.0.0.1,192.168.1.*"
    

    代表只允许主机拥有访问权限。

    注意:

    如果没有这一步的配置,本地tomcat服务器部署正常,但是远程tomcat服务器会报出下方常见问题中提到的Cannot invoke Tomcat manager: Connection reset by peer: socket write error异常

    3.为maven添加tomcat管理员账号

    由于需要使用maven来构建和部署项目,所以maven就需要拥有tomcat的管理员账号信息。
    {MAVEN_HOME}/conf/settings.xml文件中<servers>节点下添加如下内容:

    <!-- 配置可以操作tomcat的用户名和密码 -->
    <server>
        <id>crocutax</id>
        <!-- server login name -->
        <username>tomcat</username>
        <!-- server login password -->
        <password>tomcat</password>
    </server>
    

    4.配置tomcat7插件

    在项目的pom.xml中配置tomcat7 plugin,具体节点的意义看注释或下方清单

    <!-- 配置Tomcat插件 -->
    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
    
        <configuration>
            <!-- 此处的名字必须和{MAVEN_HOME}/conf/settings.xml中配置的server节点的id一致-->
            <server>crocutax</server>
            <!--服务器端口号-->
            <port>8080</port>
            <!-- 项目发布的路径,默认就是tomcat/webapps目录,可以指定深层次目录,留"/",则默认在webapps目录下部署ROOT.war包-->
            <path></path>
            <!-- 注意tomcat7此处的url,不能随意修改,后缀必须是text,不能是html. 如果是本地tomcat部署,用localhost和ip都可以 -->
            <url>http://localhost:8080/manager/text</url>
            <!--<url>http://117.62.110.110:8080/manager/text</url>-->
            <!--解决中文参数乱码问题-->
            <uriEncoding>UTF-8</uriEncoding>
            <update>true</update>
            <!--配置在tomcat\conf\tomcat-users.xml中定义的用户名-->
            <username>tomcat</username>
            <password>tomcat</password>
        </configuration>
    </plugin>
    

    节点清单

    • server : 名字必须和{MAVEN_HOME}/conf/settings.xml中配置的server节点的id一致
    • port : 服务器端口号
    • path :项目发布的路径,默认就是tomcat/webapps目录,可以指定深层次目录,留"/",则默认在webapps目录下部署ROOT.war包
    • url : 注意tomcat7此处的url,不能随意修改,后缀必须是text,不能是html. 如果是本地tomcat部署,用localhost和ip都可以
    • uriEncoding :解决中文参数乱码问题
    • update : 热部署,否则后期会报错
    • username :配置{TOMCAT_HOME}\conf\tomcat-users.xml中定义的用户名
    • password :同上

    5.启动tomcat服务器

    先通过{TOMCAT_HOME}/bin/startup.bat启动tomcat,启动完毕之后再进行部署,否则会报出如下异常

    Cannot invoke Tomcat manager: Connection refused: connect -> [H
    elp 1]
    

    6.maven命令部署

    在IDE->Terminal 或 项目根目录打开dos窗口,输入maven命令

    • mvn clean package tomcat:deploy (使用的是插件1.1版本,如果pom.xml中配置的是2.2版本,那么使用这么命令会报错)
    • mvn clean package tomcat7:deploy (使用的是插件2.2版本,自己用的这个)

    然后看着命令行歇一会吧

    ...
    [INFO] --- maven-war-plugin:2.2:war (default-war) @ cmw ---
    [INFO] Packaging webapp
    [INFO] Assembling webapp [cmw] in [D:\code\server\chinesemedicine\target\cmw]
    [INFO] Processing war project
    [INFO] Copying webapp resources [D:\code\server\chinesemedicine\src\main\webapp]
    [INFO] Webapp assembled in [887 msecs]
    [INFO] Building war: D:\code\server\chinesemedicine\target\cmw.war
    [INFO] WEB-INF\web.xml already added, skipping
    [INFO]
    [INFO] <<< tomcat7-maven-plugin:2.2:deploy (default-cli) < package @ cmw <<<
    [INFO]
    [INFO]
    [INFO] --- tomcat7-maven-plugin:2.2:deploy (default-cli) @ cmw ---
    [INFO] Deploying war to http://localhost:8080/cmw
    Uploading: http://localhost:8080/manager/text/deploy?path=%2Fcmw&update=true
    Uploaded: http://localhost:8080/manager/text/deploy?path=%2Fcmw&update=true (45960 KB at 40564.5 KB/sec)
    
    [INFO] tomcatManager status code:200, ReasonPhrase:OK
    [INFO] OK - Deployed application at context path /cmw
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 18.075 s
    [INFO] Finished at: 2017-09-17T11:31:21+08:00
    [INFO] Final Memory: 20M/293M
    [INFO] ------------------------------------------------------------------------
    
    

    出现 BUILD SUCCESS,就部署成功了!

    常见的部署命令,在Tomcat7 Plugin Documentation 中有详细介绍,这里罗列几个常用的:

    • tomcat7:run 运行当前项目
    • tomcat7:deploy 部署当前项目
    • tomcat7:redeploy 重新部署项目
    • tomcat7:undeploy 取消部署当前项目

    常见问题

    Tomcat return http status error: 401, Reason Phrase: Unauthorized

    未授权访问tomcat,即没有tomcat的管理权限,如果没有进行步骤1中的"添加tomcat用户及权限"操作,远程部署时就会报此异常。

    还有一种情况,已经在conf/tomcat-users.xml中配置了用户和权限

    <!-- 创建用户,并授权 -->
    <role rolename="manager-gui" />
    <role rolename="manager-script" />
    <user username="tomcat" password="tomcat" roles="manager-gui, manager-script"/>
    

    但是还是有这个异常信息,于是在服务器tomcat首页测试Manager App,发现定义的tomcat管理员角色无法正常登陆。这说明配置的用户和角色出问题了,继续排查,在tomcat启动日志中,发现了如下异常信息:

    警告: Unexpected exception resolving reference
    com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字节的 UTF-8 序列的字节 1 无效。
    

    于是怀疑是有中文字符造成的影响,删掉了在tomcat-users.xml中的中文注释,即

    <!-- 创建用户,并授权 -->
    

    再次部署,tomcat Manager App 测试成功,远程一键部署成功!

    注:

    虽然这里是WARN而不是ERROR,但是还是有可能造成一些内部程序的加载失败导致功能缺失,比如这里的tomcat启动成功,但是内部管理权限却配置失败,进而导致远程部署因没有权限而失败。所以,从严谨性角度出发,如果精力足够,那么所有的WARN都不容忽视。

    Connection reset by peer: socket write error

    异常信息:[ERROR] Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy (default-cli) on project cmw: Cannot invoke Tomcat manager: Connection reset by peer: socke
    t write error -> [Help 1]

    这个应该是部署的时候最容易出现的异常了,在这里卡了很久。网上查了一大圈。根本原因是:当客户端发出请求(request)后,如果还没有完全获得服务端的响应(response),客户端与服务器段的连接断开(例如断网、按了“停止”按钮、或者客户端浏览器关闭等),服务器端就会抛出此Exception。

    这个问题需要从多方面排查。

    1.如果是远程服务器,需要配置tomcat允许远程访问,见步骤2

    2.有的说tomcat9在步骤1中配置用户权限时,同一个用户不能同时拥有manager-guimanager-script权限,但是我分开了之后,依然没有解决这个问题。最终放弃使用tomcat9,使用tomcat7,一切正常了。

    3.如果tomcat上已经部署了该项目,那么需要使用redeploy命令,即mvn tomcat7:redeploy

    部署后的项目404

    以下3种原因都有可能造成部署后的项目无法正常访问,报404:

    1. 如果是远程服务器,请确保8080端口已经添加到入网规则中
    2. pom.xml中tomcat7插件的path节点配置的有问题
    3. 项目本身404

    tomcat内存泄漏

    tomcat日志中报出

    The web application [/appStore] appears to have started a thread named [Thread-2],but has failed to stop it ,this is very likely to create a memory leak

    等有时间了再研究,http://www.cnblogs.com/xyb930826/p/5725340.html 中有提到

    参考链接

    相关文章

      网友评论

      本文标题:使用tomcat7插件将项目一键部署到远程tomcat服务器-热

      本文链接:https://www.haomeiwen.com/subject/squgsxtx.html