首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Tomcat9中,可以通过编程关闭AutoDeploy吗

在Tomcat9中,可以通过编程关闭AutoDeploy吗
EN

Stack Overflow用户
提问于 2020-07-30 21:24:36
回答 2查看 842关注 0票数 0

我们使用tomcat9和spring/hibernate。很明显,这是一个产品代码,而tomcat管理器不在那里。对于tomcat的强化,我们试图通过代码动态关闭"autoDeploy“。我们可以在server.xml中这样做:

代码语言:javascript
复制
<Host appBase="webapps" autoDeploy="false" name="localhost" unpackWARs="true">

这是可以做到的吗?有没有办法通过编程来做到这一点?

编辑:尝试的代码:

代码语言:javascript
复制
package test.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.tomcat.util.modeler.Registry;

public class TestServlet extends HttpServlet {
    ObjectName oname = null;
    MBeanServer mBeanServer = null;

    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

        String name = request.getParameter("app");

        PrintWriter writer = response.getWriter();

        try {
            oname = new ObjectName("Catalina:type=Deployer,host=localhost");
            mBeanServer = Registry.getRegistry(null, null).getMBeanServer();
            if (!isDeployed(name) && !isServiced(name)) {
                writer.println("deploying application -> " + name);
                addServiced(name);
                try {
                    // Perform new deployment
                    check(name);
                } finally {
                    removeServiced(name);
                }
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    protected void check(String name) throws Exception {
        String[] params = { name };
        String[] signature = { "java.lang.String" };
        mBeanServer.invoke(oname, "check", params, signature);
    }

    protected void addServiced(String name) throws Exception {
        String[] params = { name };
        String[] signature = { "java.lang.String" };
        mBeanServer.invoke(oname, "addServiced", params, signature);
    }

    protected boolean isDeployed(String name) throws Exception {
        String[] params = { name };
        String[] signature = { "java.lang.String" };
        Boolean result = (Boolean) mBeanServer.invoke(oname, "isDeployed", params, signature);
        return result.booleanValue();
    }

    protected boolean isServiced(String name) throws Exception {
        String[] params = { name };
        String[] signature = { "java.lang.String" };
        Boolean result = (Boolean) mBeanServer.invoke(oname, "isServiced", params, signature);
        return result.booleanValue();
    }

    protected void removeServiced(String name) throws Exception {
        String[] params = { name };
        String[] signature = { "java.lang.String" };
        mBeanServer.invoke(oname, "removeServiced", params, signature);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2020-07-30 21:51:35

我猜你必须同时禁用deployOnStartup和autoDeploy。

Tomcat9文档中对主机的引用:

autoDeploy :此标志值指示Tomcat在运行时是否应定期检查新的或更新的web应用程序。如果为真,Tomcat会定期检查appBase和xmlBase目录,并部署任何新的web应用程序或上下文XML描述符。更新的web应用程序或上下文XML描述符将触发web应用程序的重新加载。该标志的值默认为true。deployOnStartup:该标志值指示当Tomcat启动时,是否应该自动部署来自该主机的web应用程序。该标志的值默认为true。

如果禁用deployOnStartup和autoDeploy,则需要通过server.xml中的上下文元素显式配置管理器应用程序,然后使用它来部署其他WAR文件/目录。

注意:您可以通过在server.xml文件中设置- autodeploy="false"来禁用自动部署。

有关更多信息,请访问:Apache Tomcat 9 Configuration Reference

票数 0
EN

Stack Overflow用户

发布于 2020-07-30 21:56:52

不,不能,因为你不能从Java代码中设置autoDeploy="false"

配置它的唯一方法是在server.xml中进行配置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63174182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档