我正在寻找一种通过java以编程方式管理tomcat(在本地主机上)的方法。我想启动/停止 tomcat 并部署 WAR。
任何帮助表示赞赏。
您可以运行嵌入在您的应用程序中的 Tomcat。
要以编程方式管理 tomcat,您可能需要了解 JMX 和 Tomcat 的内置 MBean 功能。
本质上,您可以编写自己的基于 Java 的 JMX 客户端通过 RMI 与 MBean 通信,或者您可以利用 Manager App 中的 JMX Http 代理并使用普通的旧 http 请求来编写脚本和管理 tomcat 实例。
有关 JMX 和 Tomcat 6 的良好参考: http ://www.datadisk.co.uk/html_docs/java_app/tomcat6/tomcat6_jmx.htm
Manager App和JMX Http Proxy的一个很好的参考:http: //tomcat.apache.org/tomcat-6.0-doc/manager-howto.html#JMX_Set_command
您应该能够相当轻松地部署和取消部署 WAR。
我不认为有一个现有的 MBean 可以让你关闭 tomcat,但是你自己实现一个并调用 System.exit(); 相当容易。
通过java启动/停止tomcat的方法是在bootstrap.jar(使用类Runtime)上调用execute,示例参数:-Dcatalina.home=c:/tomcat/
看ant如何执行tomcat start stop的示例代码:
http://ptrthomas.wordpress.com/2006/03/25/how-to-start-and-stop-tomcat-from-ant
查看如何从 java 执行外部程序的示例代码: http ://www.linglom.com/2007/06/06/how-to-run-command-line-or-execute-external-application-from-java/
您可以使用 java Runtime 类来调用 bat 文件。确保运行 java 进程的用户有权启动和停止 tomcat。
try{
Runtime.getRuntime().exec("c:/program files/tomcat/bin/startup.bat");
} catch(IOException e) {System.out.println("exception");}
您可以使用tomcat manager,或查看其源代码以了解 manager 如何处理部署操作。
您可以重新启动单个 Tomcat 连接器,即端口重新启动,如您的应用程序正在运行的 8843。需要这样做的一种情况是当您通过 API 获取签名证书或修改您的信任库时。
这是我在添加/删除证书后用来重新启动 tomcat 连接器的完整代码/方法。
public void refreshTrustStore() throws Exception
{
try
{
//following line need to be replaced based on where you get your port. It may be passed in as argument
String httpsPort = configurationManager.getHttpsPort();
String objectString = "*:type=Connector,port=" + httpsPort + ",*";
final ObjectName objectNameQuery = new ObjectName(objectString);
for (final MBeanServer server : MBeanServerFactory.findMBeanServer(null))
{
if (server.queryNames(objectNameQuery, null).size() > 0)
{
MBeanServer mbeanServer = server;
ObjectName objectName = (ObjectName) server.queryNames(objectNameQuery, null).toArray()[0];
mbeanServer.invoke(objectName, "stop", null, null);
// Polling sleep to reduce delay to safe minimum.
// Use currentTimeMillis() over nanoTime() to avoid issues
// with migrating threads across sleep() calls.
long start = System.currentTimeMillis();
// Maximum of 6 seconds, 3x time required on an idle system.
long max_duration = 6000L;
long duration = 0L;
do
{
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
duration = (System.currentTimeMillis() - start);
} while (duration < max_duration &&
server.queryNames(objectNameQuery, null).size() > 0);
// Use below to get more accurate metrics.
String message = "TrustStoreManager TrustStore Stop: took " + duration + "milliseconds";
logger.information(message);
mbeanServer.invoke(objectName, "start", null, null);
break;
}
}
}
catch (Exception exception)
{
//Log and throw exception
throw exception
}
}