我们使用tomcat9和spring/hibernate。很明显,这是一个产品代码,而tomcat管理器不在那里。对于tomcat的强化,我们试图通过代码动态关闭"autoDeploy“。我们可以在server.xml中这样做:
<Host appBase="webapps" autoDeploy="false" name="localhost" unpackWARs="true">这是可以做到的吗?有没有办法通过编程来做到这一点?
编辑:尝试的代码:
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);
}
}发布于 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
发布于 2020-07-30 21:56:52
不,不能,因为你不能从Java代码中设置autoDeploy="false"。
配置它的唯一方法是在server.xml中进行配置。
https://stackoverflow.com/questions/63174182
复制相似问题