如果我使用java -jar从外部jar启动jetty服务器,那么如何将另一个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();
}
}
}
如果我使用try/catch out,应用程序会被添加到已经存在的5701 jetty服务器上吗?
发布于 2018-06-28 20:20:37
您的代码在端口5701上启动自己的Jetty服务器,该代码不会添加到不同的Jetty服务器。
假设您已经在端口5701上启动了ServerFoo,并在它自己的JVM中运行。
现在,您有了另一个要添加到该ServerFoo实例的now应用程序。
您将启动一个新的JVM,让我们称其为DeployerBar,以控制/操作ServerFoo实例。
为此,您需要与该ServerFoo实例通信,并首先为其提供启动WebApp本身所需的一切(所有类、配置等)。
然后,ServerFoo将需要一个自定义的ClassLoader来加载这些刚刚收到的新类和配置,从而使它能够启动这个新的webapp。
如果这就是你想要做的,考虑改为修改ServerFoo,使用Jetty DeploymentManager来监控一个常见的webapps目录。
然后,您的部署过程就是将所有的文件(classes/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);
https://stackoverflow.com/questions/51074321
复制相似问题