1

我正在寻找一种通过java以编程方式管理tomcat(在本地主机上)的方法。我想启动/停止 tomcat 并部署 WAR。

任何帮助表示赞赏。

4

6 回答 6

2

您可以运行嵌入在您的应用程序中的 Tomcat。

于 2012-04-06T22:01:27.730 回答
1

要以编程方式管理 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(); 相当容易。

于 2012-04-06T18:57:45.020 回答
1

通过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/

于 2012-04-06T16:50:59.947 回答
1

您可以使用 java Runtime 类来调用 bat 文件。确保运行 java 进程的用户有权启动和停止 tomcat。

try{
Runtime.getRuntime().exec("c:/program files/tomcat/bin/startup.bat");
} catch(IOException e) {System.out.println("exception");}
于 2012-04-06T17:16:28.553 回答
0

您可以使用tomcat manager,或查看其源代码以了解 manager 如何处理部署操作。

于 2012-04-06T18:20:49.027 回答
0

您可以重新启动单个 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
}

}

于 2015-10-13T17:13:47.277 回答