将Web应用程序部署到已经开始的码头

时间:2018-06-28 03:34:12

标签: java jetty

如果我使用java -jar从外部jar启动码头服务器,然后如何将另一个Java Web应用程序添加到已经启动的特定端口?例如,此代码:

public class Main {
    private static Logger logger = Logger.getLogger(Main.class);

    public static void main(String[] args) throws Exception {
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");

        Server jettyServer = new Server(5701);
        jettyServer.setHandler(context);

        ServletHolder jerseyServlet = context.addServlet(
                org.glassfish.jersey.servlet.ServletContainer.class, "/*");
        jerseyServlet.setInitOrder(0);

        jerseyServlet.setInitParameter(
                "jersey.config.server.provider.classnames",
                Calculator.class.getCanonicalName());

        try {
            jettyServer.start();
            jettyServer.join();
          } catch (Exception e){
                        logger.error("error during server starting",e);
              jettyServer.stop();
              jettyServer.destroy();
          }

    }
}

如果我尝试/赶上,是否将应用程序添加到已经存在的5701码头服务器中?

1 个答案:

答案 0 :(得分:1)

您的代码在端口5701上启动其自己的Jetty服务器,关于该代码的内容并没有添加到其他Jetty服务器上。

让我们说您已经在端口5701上启动了ServerFoo并正在其自己的JVM中运行。

您现在有另一个要添加到该ServerFoo实例的Web应用。

您将启动一个新的JVM,将其称为DeployerBar,以控制/操作ServerFoo实例。

为此,您需要与该ServerFoo实例进行通信,并为其提供启动WebApp本身所需的一切(所有类,配置等)。

然后ServerFoo将需要一个自定义的ClassLoader来加载刚刚接收的这些新类和配置,从而使其能够启动此新的Web应用程序。

如果这只是您要执行的操作,请考虑改为修改ServerFoo以使用Jetty DeploymentManager监视公用的webapps目录。

然后,您的部署过程只是将所有文件(类/ jars / libs / configuration)放入此公共webapps目录中,以便ServerFoo DeploymentManager可以选择并开始使用。

请参见LikeJettyXml.java,以了解其工作原理。

    DeploymentManager deployer = new DeploymentManager();
    DebugListener debug = new DebugListener(System.err,true,true,true);
    server.addBean(debug);        
    deployer.addLifeCycleBinding(new DebugListenerBinding(debug));
    deployer.setContexts(contexts);
    deployer.setContextAttribute(
            "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
            ".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/[^/]*taglibs.*\\.jar$");

    WebAppProvider webapp_provider = new WebAppProvider();
    webapp_provider.setMonitoredDirName(jetty_base + "/webapps");
    webapp_provider.setDefaultsDescriptor(jetty_home + "/etc/webdefault.xml");
    webapp_provider.setScanInterval(1);
    webapp_provider.setExtractWars(true);
    webapp_provider.setConfigurationManager(new PropertiesConfigurationManager());

    deployer.addAppProvider(webapp_provider);
    server.addBean(deployer);