在许多生产环境中,具有部署新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应用程序 .
下面的描述使用变量名 $ 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>
Manager Web应用程序的用户友好HTML界面位于
http://{host}:{port}/manager/html
正如上面已经提到的,你需要拥有 manager-gui角色 。有一个单独的文档,提供有关此接口的帮助。看到:
HTML接口受到CSRF(跨站点请求伪造)攻击的保护。每次访问HTML页面都会生成一个随机令牌,该令牌存储在您的会话中,并包含在页面上的所有链接中。如果您的下一个操作没有正确的令牌值,则该操作将被拒绝。如果令牌已过期,您可以从主页面重新开始。
Manager应用程序可以使用的所有命令都在单个请求URI中指定,如下所示:
http://{host}:{port}/manager/text/{command}?{parameters}
{host} 和 {port}表示运行Tomcat的主机名和端口号,{command}表示您要执行的Manager命令,以及{parameters}表示特定于该命令的查询参数。在下面的插图中,根据您的安装自定义主机和端口。
这些命令通常由HTTP GET请求执行。/deploy命令可以使用HTTP PUT执行。
大多数命令接受以下一个或多个查询参数:
每个命令都会返回一个响应text/plain格式(即没有HTML标记的纯ASCII),使人和程序都能轻松阅读。响应的第一行将从OK / FAIL开始,指示请求的命令是否成功。如果失败,第一行的其余部分将包含遇到的问题的描述。一些命令包括如下所述的附加信息行。
国际化说明- Manager应用程序在资源包中查找其消息字符串,因此可能已为您的平台翻译了字符串。以下示例显示了消息的英文版本。
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开始并包含一条错误消息。可能的问题原因包括:
部署并启动新Web应用程序到指定path(任何其他Web应用程序不得使用它)。这个命令与/undeploy命令逻辑相反.
此命令由HTTP GET请求执行。可以使用许多不同的方法来使用deploy命令。
http://localhost:8080/manager/text/deploy?path=/footoo&tag=footag
这可以用于部署先前部署的Web应用程序,该应用程序已使用tag属性。请注意,Manager webapp的工作目录将包含以前部署的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
部署位于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
如果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
如果主机配置了unpackWARs = true并且您部署了war文件,则war将被解压缩到Host appBase目录中的目录中。
如果应用程序war或目录安装在Host appBase目录中,并且Host配置了autoDeploy = true,或者Context路径必须与没有“.war”扩展名的目录名或war文件名匹配。
为了在不受信任的用户可以管理Web应用程序时的安全性,可以将Host deployXML标志设置为false。这可以防止不受信任的用户使用配置XML文件部署Web应用程序,还可以防止他们部署位于其主机appBase之外的应用程序目录或“.war”文件。
如果安装和启动成功,您将收到如下响应:
OK - Deployed application at context path /foo
否则,响应将从FAIL开始并包含一条错误消息。可能的问题原因包括:
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
http://localhost:8080/manager/text/reload?path=/examples
发信号通知现有应用程序关闭并重新加载。当Web应用程序上下文不可重新加载并且您已更新了/WEB-INF/classes目录中的类或属性文件时,或在/WEB-INF/lib文件夹添加或更新jar文件时 ,这个功能很有用.
如果此命令成功,您将看到如下响应:
OK - Reloaded application at context path /examples
否则,响应将从FAIL并包含一条错误消息。可能的问题原因包括:
http://localhost:8080/manager/text/serverinfo
列出有关Tomcat版本,操作系统和JVM属性的信息。
如果发生错误,响应将以响应开始FAIL并包含一条错误消息。可能的问题原因包括:
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并包含一条错误消息。可能的问题原因包括:
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
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并包含一条错误消息。
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
...
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
...
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
...
http://localhost:8080/manager/text/sslReload?tlsHostName=name
重新加载TLS配置文件(证书和密钥文件,这不会触发重新解析server.xml)。要为所有主机重新加载文件,请不要指定tlsHostName parameter.
OK - Reloaded TLS configuration for [_default_]
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)
...
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:
...
http://localhost:8080/manager/text/save
如果指定不带任何参数,则此命令将服务器的当前配置保存到server.xml。如果需要,现有文件将重命名为备份。
如果指定了path与已部署的Web应用程序的路径匹配的参数,然后该Web应用程序的配置将保存到中的适当命名的context.xml文件中xmlBase对于当前的主持人。
要使用该命令,必须存在StoreConfig MBean。通常使用。配置 StoreConfigLifecycleListener .
如果命令不成功,响应将以响应开始FAIL并包含一条错误消息。
从以下链接中,您可以查看有关服务器的状态信息。任何一个 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是一个轻量级代理,用于获取和设置tomcat内部。 (或者通过MBean公开的任何类)它的用法不是非常用户友好,但UI对于集成命令行脚本以监视和更改tomcat的内部非常有用。您可以使用代理执行两项操作:获取信息和设置信息。为了让您真正了解JMX代理Servlet,您应该对JMX有一个大致的了解。如果您不知道JMX是什么,那么请准备好混淆。
采取以下形式:
http://webserver/manager/jmxproxy/?qry=STUFF
Where STUFF是您希望执行的JMX查询。例如,以下是您可能希望运行的一些查询:
您需要对此进行试验以真正了解其功能。如果您提供否qry参数,然后将显示所有MBean。我们真的建议查看tomcat源代码并理解JMX规范,以便更好地理解您可能运行的所有查询。
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
现在你可以查询一个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"
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=
除了通过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.3 Nofailonerror当您希望避免任何管理器命令处理错误终止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运行中多次调用任务,即使不是打算。当您从该任务捕获输出时,应该谨慎行事,因为这可能会导致意外情况: