如果我使用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码头服务器中?
答案 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);