1、Introduction 在许多生产环境中,具有部署新Web应用程序或取消部署现有Web应用程序的功能非常有用,而且无需关闭并重新启动整个容器。此外,即使您尚未在Tomcat服务器配置文件中声明应用为reloadable,也可以让现有应用程序重新加载。 为了支持这些功能,Tomcat包括一个Web应用程序(默认安装在上下文路径上)/manager)支持以下功能: 默认的Tomcat安装包括Manager。添加Manager Web应用程序的实例Context到新主机安装manager.xml中的上下文配置文件$CATALINA_BASE/conf/[enginename]/[hostname]。这是一个例子: <Context privileged="true" antiResourceLocking="false" docBase="${catalina.home}/webapps/manager"> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.0\.0\.1" /> </Context> 如果您将Tomcat配置为支持多个虚拟主机(网站),则需要为每个虚拟主机配置一个Manager。 有三种方法可以使用Manager应用程序. 2、配置Manager Application Access 下面的描述使用变量名$ CATALINA_BASE来引用解析大多数相对路径的基目录。如果尚未通过设置CATALINA_BASE目录为多个实例配置Tomcat,则$ CATALINA_BASE将设置为$ CATALINA_HOME的值,即已安装Tomcat的目录。 使用默认设置的Tomcat是非常不安全的,这些设置允许Internet上的任何人在您的服务器上执行Manager应用程序。因此,Manager应用程序需要有manager角色的用户使用用户名和密码进行权限验证。此外,默认用户文件中没有用户名($CATALINA_BASE/conf/tomcat-users.xml)分配给这些角色。因此,默认情况下完全禁用对Manager应用程序的访问。 您可以在Manager Web应用程序的web.xml文件中找到角色名称。可用的角色是: HTML接口受到CSRF(跨站点请求伪造)攻击的保护,但文本和JMX接口无法受到保护。这意味着当使用Web浏览器访问Manager应用程序时,允许访问文本和JMX界面的用户必须小心谨慎。为了保持CSRF保护: 注意,JMX代理接口实际上是Tomcat的低级根类管理接口。如果有人知道JMX的命令,那么他可以做很多事情。启用时应该谨慎配置manager-jmx 角色. 要启用对Manager Web应用程序的访问,您必须创建新的用户并关联一个manager-xxx角色,或添加一个manager-xxx角色给某些现有的用户。由于本文档的大部分内容都描述了使用文本界面,因此本示例将使用角色名称manager-script。具体如何配置用户取决于哪个你使用哪种(Realm)实现方式: 第一次尝试操作Manager时,您将使用BASIC身份验证登录。您输入的用户名和密码无关紧要,只要该用户有manager-script这个角色就可以. 除了密码限制之外,还可以限制对Manager Web应用程序的访问IP地址或者通过添加一个主机RemoteAddrValve 或者 RemoteHostValve。以下是通过IP地址限制对localhost的访问的示例: <Context privileged="true"> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.0\.0\.1"/> </Context> 3、HTML用户友好界面 Manager Web应用程序的用户友好HTML界面位于 http://{host}:{port}/manager/html 正如上面已经提到的,你需要拥有manager-gui角色。有一个单独的文档,提供有关此接口的帮助。看到: HTML接口受到CSRF(跨站点请求伪造)攻击的保护。每次访问HTML页面都会生成一个随机令牌,该令牌存储在您的会话中,并包含在页面上的所有链接中。如果您的下一个操作没有正确的令牌值,则该操作将被拒绝。如果令牌已过期,您可以从主页面重新开始。 4、支持的Manager命令 Manager应用程序可以使用的所有命令都在单个请求URI中指定,如下所示: http://{host}:{port}/manager/text/{command}?{parameters} {host} 和 {port}表示运行Tomcat的主机名和端口号,{command}表示您要执行的Manager命令,以及{parameters}表示特定于该命令的查询参数。在下面的插图中,根据您的安装自定义主机和端口。 这些命令通常由HTTP GET请求执行。/deploy命令可以使用HTTP PUT执行。 4.1、Common Parameters 大多数命令接受以下一个或多个查询参数: 每个命令都会返回一个响应text/plain格式(即没有HTML标记的纯ASCII),使人和程序都能轻松阅读。响应的第一行将从OK / FAIL开始,指示请求的命令是否成功。如果失败,第一行的其余部分将包含遇到的问题的描述。一些命令包括如下所述的附加信息行。 国际化说明- Manager应用程序在资源包中查找其消息字符串,因此可能已为您的平台翻译了字符串。以下示例显示了消息的英文版本。 4.2、远程部署新的应用程序存档(WAR) http://localhost:8080/manager/text/deploy?path=/foo 使用HTTP PUT请求通过上面的URL进行部署war文件,这个请求会将war包安装到appBase对应的虚拟主机的目录,并启动。稍后可以通过/undeploy命令使该应用程序取消部署(并删除相应的WAR文件)。 该命令由HTTP PUT请求执行。 .WAR文件可以包括Tomcat特定的部署配置,方法是在/META-INF/context.xml文件中配置Context节点. URL参数包括: NOTE- 这个命令与/undeploy命令逻辑相反 . 如果安装和启动成功,您将收到如下响应: OK - Deployed application at context path /foo 否则,响应将以FAIL开始并包含一条错误消息。可能的问题原因包括: 5、从本地路径部署新应用程序 部署并启动新Web应用程序到指定path(任何其他Web应用程序不得使用它)。这个命令与/undeploy命令逻辑相反. 此命令由HTTP GET请求执行。可以使用许多不同的方法来使用deploy命令。 5.1、部署以前部署的Web应用程序 http://localhost:8080/manager/text/deploy?path=/footoo&tag=footag 这可以用于部署先前部署的Web应用程序,该应用程序已使用tag属性。请注意,Manager webapp的工作目录将包含以前部署的WAR;删除它会使部署失败。 5.2、按URL部署目录或WAR 部署位于Tomcat服务器上的Web应用程序目录或“.war”文件。如果不指定path,则路径和版本派生自目录名称或war文件名。该war参数指定一个URL(包括file:scheme)用于目录或Web应用程序归档(WAR)文件。 在此示例中,Web应用程序位于/path/to/foo目录中,在Tomcat服务器上部署为名为/footoo的Web应用程序. http://localhost:8080/manager/text/deploy?path=/footoo&war=file:/path/to/foo 在此示例中/path/to/bar.war文件在Tomcat服务器上部署为名为/bar的Web应用程序。请注意,没有path参数,因此上下文路径默认用bar.war解压后的名称。 http://localhost:8080/manager/text/deploy?war=file:/path/to/bar.war 5.3、从主机appBase部署目录或war 部署位于Host appBase目录中的Web应用程序目录或“.war”文件。路径和可选版本派生自目录或war文件名。 在此示例中,Web应用程序位于名为foo的子目录中,在Tomcat服务器的Host appBase目录中部署为名为foo的Web应用程序。请注意,使用的上下文路径是Web应用程序目录的名称。 http://localhost:8080/manager/text/deploy?war=foo 在此示例中bar.war位于Tomcat服务器上的Host appBase目录中,将其部署为名为/bar的Web应用程序上下文. http://localhost:8080/manager/text/deploy?war=bar.war 5.4、使用Context配置“.xml”文件进行部署 如果Host的 deploy标志设置为true,则可以使用Context配置“.xml”文件和可选的“.war”文件或Web应用程序目录来部署Web应用程序。上下文path使用上下文“.xml”配置文件部署Web应用程序时不使用。 Context配置“.xml”文件可以包含Web应用程序的有效XML,就像它在Tomcat中配置一样server.xml配置文件。这是一个例子: <Context path="/foobar" docBase="/path/to/application/foobar"> </Context> When the optional war参数设置为Web应用程序“.war”文件或目录的URL,它将覆盖在上下文配置“.xml”文件中配置的任何docBase。 以下是使用Context配置“.xml”文件部署应用程序的示例。 http://localhost:8080/manager/text/deploy?config=file:/path/context.xml 以下是使用Context配置“.xml”文件和位于服务器上的Web应用程序“.war”文件部署应用程序的示例。 http://localhost:8080/manager/text/deploy ?config=file:/path/context.xml&war=file:/path/bar.war 5.5、Deployment Notes 如果主机配置了unpackWARs = true并且您部署了war文件,则war将被解压缩到Host appBase目录中的目录中。 如果应用程序war或目录安装在Host appBase目录中,并且Host配置了autoDeploy = true,或者Context路径必须与没有“.war”扩展名的目录名或war文件名匹配。 为了在不受信任的用户可以管理Web应用程序时的安全性,可以将Host deployXML标志设置为false。这可以防止不受信任的用户使用配置XML文件部署Web应用程序,还可以防止他们部署位于其主机appBase之外的应用程序目录或“.war”文件。 5.6、Deploy Response 如果安装和启动成功,您将收到如下响应: OK - Deployed application at context path /foo 否则,响应将从FAIL开始并包含一条错误消息。可能的问题原因包括: 5.7、列出当前部署的应用程序 http://localhost:8080/manager/text/list 列出上下文路径,当前状态(running or stopped),以及所有当前部署的Web应用程序的活动会话数。启动Tomcat后立即执行的典型响应可能如下所示: OK - Listed applications for virtual host localhost /webdav:running:0:webdav /examples:running:0:examples /manager:running:0:manager /:running:0:ROOT /test:running:0:test##2 /test:running:0:test##1 5.8、重新加载现有应用程序 http://localhost:8080/manager/text/reload?path=/examples 发信号通知现有应用程序关闭并重新加载。当Web应用程序上下文不可重新加载并且您已更新了/WEB-INF/classes目录中的类或属性文件时,或在/WEB-INF/lib文件夹添加或更新jar文件时 ,这个功能很有用. 如果此命令成功,您将看到如下响应: OK - Reloaded application at context path /examples 否则,响应将从FAIL并包含一条错误消息。可能的问题原因包括: 列出OS和JVM属性 http://localhost:8080/manager/text/serverinfo 列出有关Tomcat版本,操作系统和JVM属性的信息。 如果发生错误,响应将以响应开始FAIL并包含一条错误消息。可能的问题原因包括: 列出可用的全局JNDI资源 http://localhost:8080/manager/text/resources[?type=xxxxx] 列出可在上下文配置文件的资源链接中使用的全局JNDI资源。如果你指定type请求参数,该值必须是您感兴趣的资源类型的完全限定Java类名称(例如,您将指定javax.sql.DataSource获取所有可用JDBC数据源的名称)。如果你没有指定type请求参数,将返回所有类型的资源。 取决于是否type请求参数是否指定,正常响应的第一行将是: OK - Listed global resources of all types or OK - Listed global resources of type xxxxx 每个资源后跟一行。每行由冒号字符(“:”)分隔的字段组成,如下所示: 如果发生错误,响应将以响应开始FAIL并包含一条错误消息。可能的问题原因包括: Session Statistics http://localhost:8080/manager/text/sessions?path=/examples 显示Web应用程序的默认会话超时,以及在实际超时时间的一分钟范围内的当前活动会话数。例如,重新启动Tomcat然后执行其中一个JSP示例/examples网络应用程序,你可能得到这样的东西: OK - Session information for application at context path /examples Default maximum session inactive interval 30 minutes <1 minutes: 1 sessions 1 - <2 minutes: 1 sessions Expire Sessions http://localhost:8080/manager/text/expire?path=/examples&idle=num 显示会话统计信息(如上所示)/sessions命令)并使空闲时间超过的会话到期num分钟。要使所有会话到期,请使用&idle=0 . OK - Session information for application at context path /examples Default maximum session inactive interval 30 minutes 1 - <2 minutes: 1 sessions 3 - <4 minutes: 1 sessions >0 minutes: 2 sessions were expired Actually /sessions and /expire是同一命令的同义词。区别在于存在idle parameter. 启动现有应用程序 http://localhost:8080/manager/text/start?path=/examples 发出停止的应用程序信号以重新启动,并使其自身再次可用例如,如果应用程序所需的数据库暂时不可用,则停止和启动很有用。通常最好停止依赖此数据库的Web应用程序,而不是让用户不断遇到数据库异常。 如果此命令成功,您将看到如下响应: OK - Started application at context path /examples 否则,响应将从FAIL并包含一条错误消息。可能的问题原因包括: 停止现有的应用程序 http://localhost:8080/manager/text/stop?path=/examples 发信号通知现有应用程序使其自身不可用,但将其部署。应用程序停止时进入的任何请求都将看到HTTP错误404,此应用程序将在列表应用程序命令中显示为“已停止”。 如果此命令成功,您将看到如下响应: OK - Stopped application at context path /examples 否则,响应将从FAIL并包含一条错误消息。可能的问题原因包括: 取消部署现有应用程序 http://localhost:8080/manager/text/undeploy?path=/examples WARNING- 此命令将删除其中存在的任何Web应用程序工件appBase此虚拟主机的目录(通常为“webapps”)。这将删除应用程序.WAR(如果存在),应用程序目录来自解压缩形式的部署或.WAR扩展以及来自的XML上下文定义$CATALINA_BASE/conf/[enginename]/[hostname]/目录。如果您只想让应用程序停止服务,您应该使用/stop command instead. 发信号通知现有应用程序正常关闭自身,并将其从Tomcat中删除(这也使得此上下文路径可供以后重用)。此外,如果文档根目录中存在,则将其删除appBase此虚拟主机的目录(通常为“webapps”)。这个命令与逻辑相反/deploy command. 如果此命令成功,您将看到如下响应: OK - Undeployed application at context path /examples 否则,响应将从FAIL并包含一条错误消息。可能的问题原因包括: 发现内存泄漏 http://localhost:8080/manager/text/findleaks[?statusLine=[true|false]] 查找泄漏诊断会触发完整的垃圾回收。它应该在生产系统中极其谨慎地使用。 查找泄漏诊断尝试识别在停止,重新加载或取消部署时导致内存泄漏的Web应用程序。应始终使用分析器确认结果。诊断使用StandardHost实现提供的其他功能。如果使用不扩展StandardHost的自定义主机,它将无法工作。 从Java代码中明确触发完整的垃圾收集被记录为不可靠。此外,根据所使用的JVM,还有禁用显式GC触发的选项,例如-XX:+DisableExplicitGC。如果要确保诊断程序成功运行完整的GC,则需要使用GC日志记录,JConsole或类似工具进行检查。 如果此命令成功,您将看到如下响应: /leaking-webapp 如果您希望在响应中看到状态行,请包括statusLine请求中的查询参数,值为true. 已停止,重新加载或取消部署的Web应用程序的每个上下文路径,但先前运行的哪些类仍然加载到内存中,从而导致内存泄漏,将在新行上列出。如果应用程序已多次重新加载,则可能会多次列出。 如果命令不成功,响应将以响应开始FAIL并包含一条错误消息。 连接器SSL / TLS密码信息 http://localhost:8080/manager/text/sslConnectorCiphers SSL Connector / Ciphers诊断列出了当前为每个连接器配置的SSL / TLS密码。对于NIO和NIO2,列出了各个密码套件的名称。对于APR,返回SSLCipherSuite的值。 响应将如下所示: OK - Connector / SSL Cipher information Connector[HTTP/1.1-8080] SSL is not enabled for this connector Connector[HTTP/1.1-8443] TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA TLS_DHE_RSA_WITH_AES_128_CBC_SHA TLS_ECDH_RSA_WITH_AES_128_CBC_SHA TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA ... 连接器SSL / TLS证书链信息 http://localhost:8080/manager/text/sslConnectorCerts SSL Connector / Certs诊断列出了当前为每个虚拟主机配置的证书链。 响应将如下所示: OK - Connector / Certificate Chain information Connector[HTTP/1.1-8080] SSL is not enabled for this connector Connector[HTTP/1.1-8443]-_default_-RSA [ [ Version: V3 Subject: CN=localhost, OU=Apache Tomcat PMC, O=The Apache Software Foundation, L=Wakefield, ST=MA, C=US Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11 ... 连接器SSL / TLS可信证书信息 http://localhost:8080/manager/text/sslConnectorTrustedCerts SSL Connector / Certs诊断列出了当前为每个虚拟主机配置的可信证书。 响应将如下所示: OK - Connector / Trusted Certificate information Connector[HTTP/1.1-8080] SSL is not enabled for this connector Connector[AJP/1.3-8009] SSL is not enabled for this connector Connector[HTTP/1.1-8443]-_default_ [ [ Version: V3 Subject: CN=Apache Tomcat Test CA, OU=Apache Tomcat PMC, O=The Apache Software Foundation, L=Wakefield, ST=MA, C=US ... 重新加载TLS配置 http://localhost:8080/manager/text/sslReload?tlsHostName=name 重新加载TLS配置文件(证书和密钥文件,这不会触发重新解析server.xml)。要为所有主机重新加载文件,请不要指定tlsHostName parameter. OK - Reloaded TLS configuration for [_default_] Thread Dump http://localhost:8080/manager/text/threaddump 编写JVM线程转储。 响应将如下所示: OK - JVM thread dump 2014-12-08 07:24:40.080 Full thread dump Java HotSpot(TM) Client VM (25.25-b02 mixed mode): "http-nio-8080-exec-2" Id=26 cpu=46800300 ns usr=46800300 ns blocked 0 for -1 ms waited 0 for -1 ms java.lang.Thread.State: RUNNABLE locks java.util.concurrent.ThreadPoolExecutor$Worker@1738ad4 at sun.management.ThreadImpl.dumpThreads0(Native Method) at sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:446) at org.apache.tomcat.util.Diagnostics.getThreadDump(Diagnostics.java:440) at org.apache.tomcat.util.Diagnostics.getThreadDump(Diagnostics.java:409) at org.apache.catalina.manager.ManagerServlet.threadDump(ManagerServlet.java:557) at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:371) at javax.servlet.http.HttpServlet.service(HttpServlet.java:618) at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) ... VM Info http://localhost:8080/manager/text/vminfo 编写有关Java虚拟机的一些诊断信息。 响应将如下所示: OK - VM info 2014-12-08 07:27:32.578 Runtime information: vmName: Java HotSpot(TM) Client VM vmVersion: 25.25-b02 vmVendor: Oracle Corporation specName: Java Virtual Machine Specification specVersion: 1.8 specVendor: Oracle Corporation managementSpecVersion: 1.2 name: ... startTime: 1418012458849 uptime: 393855 isBootClassPathSupported: true OS information: ... Save Configuration http://localhost:8080/manager/text/save 如果指定不带任何参数,则此命令将服务器的当前配置保存到server.xml。如果需要,现有文件将重命名为备份。 如果指定了path与已部署的Web应用程序的路径匹配的参数,然后该Web应用程序的配置将保存到中的适当命名的context.xml文件中xmlBase对于当前的主持人。 要使用该命令,必须存在StoreConfig MBean。通常使用。配置StoreConfigLifecycleListener. 如果命令不成功,响应将以响应开始FAIL并包含一条错误消息。 Server Status 从以下链接中,您可以查看有关服务器的状态信息。任何一个manager-xxx角色允许访问此页面。 http://localhost:8080/manager/status http://localhost:8080/manager/status/all 以HTML格式显示服务器状态信息。 http://localhost:8080/manager/status?XML=true http://localhost:8080/manager/status/all?XML=true 以XML格式显示服务器状态信息。 首先,您拥有服务器和JVM版本号,JVM提供程序,操作系统名称和编号,后跟体系结构类型。 其次,有关于JVM的内存使用情况的信息。 然后,有关于Tomcat AJP和HTTP连接器的信息。两者都有相同的信息: If you are using /status/all命令,将提供有关每个已部署的Web应用程序的其他信息。 使用JMX代理Servlet 什么是JMX代理Servlet JMX代理Servlet是一个轻量级代理,用于获取和设置tomcat内部。 (或者通过MBean公开的任何类)它的用法不是非常用户友好,但UI对于集成命令行脚本以监视和更改tomcat的内部非常有用。您可以使用代理执行两项操作:获取信息和设置信息。为了让您真正了解JMX代理Servlet,您应该对JMX有一个大致的了解。如果您不知道JMX是什么,那么请准备好混淆。 JMX Query command 采取以下形式: http://webserver/manager/jmxproxy/?qry=STUFF Where STUFF是您希望执行的JMX查询。例如,以下是您可能希望运行的一些查询: 您需要对此进行试验以真正了解其功能。如果您提供否qry参数,然后将显示所有MBean。我们真的建议查看tomcat源代码并理解JMX规范,以便更好地理解您可能运行的所有查询。 JMX Get command JXMProxyServlet还支持“get”命令,您可以使用该命令获取特定MBean属性的值。一般形式的get command is: http://webserver/manager/jmxproxy/?get=BEANNAME&att=MYATTRIBUTE&key=MYKEY 您必须提供以下参数: 如果一切顺利,那么它会说OK,否则将显示错误消息。例如,假设我们希望获取当前堆内存数据: http://webserver/manager/jmxproxy/?get=java.lang:type=Memory&att=HeapMemoryUsage 或者,如果您只想要“使用”密钥: http://webserver/manager/jmxproxy/ ?get=java.lang:type=Memory&att=HeapMemoryUsage&key=used JMX Set command 现在你可以查询一个MBean,它是时候去挖掘Tomcat的内部了! set命令的一般形式是: http://webserver/manager/jmxproxy/?set=BEANNAME&att=MYATTRIBUTE&val=NEWVALUE 所以你需要提供3个请求参数: 如果一切正常,那么它会说OK,否则将显示错误消息。例如,假设我们希望立即启动调试ErrorReportValve。以下将调试设置为10。 http://localhost:8080/manager/jmxproxy/ ?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost &att=debug&val=10 我的结果是(YMMV): Result: ok 如果我传入一个错误的值,这就是我所看到的。这是我使用的URL,我尝试设置调试等于'cow': http://localhost:8080/manager/jmxproxy/ ?set=Catalina%3Atype%3DValve%2Cname%3DErrorReportValve%2Chost%3Dlocalhost &att=debug&val=cow 当我尝试时,我的结果是 Error: java.lang.NumberFormatException: For input string: "cow" JMX Invoke command The invokecommand允许在MBean上调用方法。该命令的一般形式是: http://webserver/manager/jmxproxy/ ?invoke=BEANNAME&op=METHODNAME&ps=COMMASEPARATEDPARAMETERS 例如,要打电话给findConnectors() method of the Service use: http://localhost:8080/manager/jmxproxy/ ?invoke=Catalina%3Atype%3DService&op=findConnectors&ps= 使用Ant执行Manager命令 除了通过HTTP请求执行Manager命令的能力之外,如上所述,Tomcat包含一组方便的任务定义Ant(1.4或更高版本)构建工具。要使用这些命令,必须执行以下设置操作: 要在Ant中使用自定义任务,必须首先使用<import>元件。所以,你的build.xml文件可能看起来像这样: <project name="My Application" default="compile" basedir="."> <!-- Configure the directory into which the web application is built --> <property name="build" value="${basedir}/build"/> <!-- Configure the context path for this application --> <property name="path" value="/myapp"/> <!-- Configure properties to access the Manager application --> <property name="url" value="http://localhost:8080/manager/text"/> <property name="username" value="myusername"/> <property name="password" value="mypassword"/> <!-- Configure the path to the Tomcat installation --> <property name="catalina.home" value="/usr/local/apache-tomcat"/> <!-- Configure the custom Ant tasks for the Manager application --> <import file="${catalina.home}/bin/catalina-tasks.xml"/> <!-- Executable Targets --> <target name="compile" description="Compile web application"> <!-- ... construct web application in ${build} subdirectory, and generated a ${path}.war ... --> </target> <target name="deploy" description="Install web application" depends="compile"> <deploy url="${url}" username="${username}" password="${password}" path="${path}" war="file:${build}${path}.war"/> </target> <target name="reload" description="Reload web application" depends="compile"> <reload url="${url}" username="${username}" password="${password}" path="${path}"/> </target> <target name="undeploy" description="Remove web application"> <undeploy url="${url}" username="${username}" password="${password}" path="${path}"/> </target> </project> 注意:通过上面的导入定义资源任务将覆盖Ant 1.7中添加的资源数据类型。如果您希望使用资源数据类型,则需要使用Ant的命名空间支持进行修改catalina-tasks.xml将Tomcat任务分配给自己的命名空间。 现在,您可以执行类似命令ant deploy将应用程序部署到正在运行的Tomcat实例,或ant reload告诉Tomcat重新加载它。还要注意大多数有趣的值build.xmlfile被定义为可替换属性,因此您可以从命令行覆盖它们的值。例如,您可能会认为将真实管理员密码包含在您的帐户中会带来安全风险build.xml文件的源代码。要避免这种情况,请省略password属性,并从命令行指定它: ant -Dpassword=secret deploy 任务输出捕获 Using Ant version 1.6.2或者以后,Catalina任务提供了在属性或外部文件中捕获其输出的选项。它们直接支持以下子集<redirector> type attributes: AttributeDescriptionRequiredoutput要写入输出的文件的名称。如果错误流也未重定向到文件或属性,则它将显示在此输出中。Noerror应重定向命令标准错误的文件。NologError当您希望在Ant的日志中看到错误输出并且您将输出重定向到文件/属性时,将使用此属性。错误输出将不包含在输出文件/属性中。如果你重定向错误error or errorProperty属性,这将没有任何效果。Noappend是否应附加或覆盖输出和错误文件。默认为false.Nocreateemptyfiles是否应该创建输出和错误文件,即使是空的。默认为true.Nooutputproperty应存储命令输出的属性的名称。除非将错误流重定向到单独的文件或流,否则此属性将包含错误输出。Noerrorproperty应存储命令标准错误的属性的名称。No 还可以指定一些其他属性: AttributeDescriptionRequiredalwaysLog当您希望查看正在捕获的输出时,将使用此属性,该属性也显示在Ant的日志中。除非您正在捕获任务输出,否则不得使用它。默认为false. 此属性将直接受支持<redirector> in Ant 1.6.3Nofailonerror当您希望避免任何管理器命令处理错误终止ant执行时,将使用此属性。默认为true。它必须设置为false,如果要捕获错误输出,否则执行将在捕获任何内容之前终止。此属性仅作用于管理器命令执行,任何错误或缺少的命令属性仍将导致Ant执行终止。No 他们也支持嵌入式<redirector>您可以在其中指定其完整属性集的元素,但是input, inputstring and inputencoding即使被接受,也不会被使用,因为它们在这种情况下没有任何意义。参考ant manual for details on <redirector>元素属性。 下面是一个示例构建文件摘录,显示了如何使用此输出重定向支持: <target name="manager.deploy" depends="context.status" if="context.notInstalled"> <deploy url="${mgr.url}" username="${mgr.username}" password="${mgr.password}" path="${mgr.context.path}" config="${mgr.context.descriptor}"/> </target> <target name="manager.deploy.war" depends="context.status" if="context.deployable"> <deploy url="${mgr.url}" username="${mgr.username}" password="${mgr.password}" update="${mgr.update}" path="${mgr.context.path}" war="${mgr.war.file}"/> </target> <target name="context.status"> <property name="running" value="${mgr.context.path}:running"/> <property name="stopped" value="${mgr.context.path}:stopped"/> <list url="${mgr.url}" outputproperty="ctx.status" username="${mgr.username}" password="${mgr.password}"> </list> <condition property="context.running"> <contains string="${ctx.status}" substring="${running}"/> </condition> <condition property="context.stopped"> <contains string="${ctx.status}" substring="${stopped}"/> </condition> <condition property="context.notInstalled"> <and> <isfalse value="${context.running}"/> <isfalse value="${context.stopped}"/> </and> </condition> <condition property="context.deployable"> <or> <istrue value="${context.notInstalled}"/> <and> <istrue value="${context.running}"/> <istrue value="${mgr.update}"/> </and> <and> <istrue value="${context.stopped}"/> <istrue value="${mgr.update}"/> </and> </or> </condition> <condition property="context.undeployable"> <or> <istrue value="${context.running}"/> <istrue value="${context.stopped}"/> </or> </condition> </target> WARNING:即使它没有多大意义,并且总是一个坏主意,不止一次调用Catalina任务,严重设置Ant任务取决于链可能导致在同一个Ant运行中多次调用任务,即使不是打算。当您从该任务捕获输出时,应该谨慎行事,因为这可能会导致意外情况: