gpt4 book ai didi

java - 将 Web 应用程序部署到已启动的 jetty

转载 作者:行者123 更新时间:2023-11-30 06:07:08 24 4
gpt4 key购买 nike

如果我使用 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去掉,应用程序会被添加到已经存在的5701 jetty服务器上吗?

最佳答案

您的代码在端口 5701 上启动自己的 Jetty 服务器,该代码不会添加到不同的 Jetty 服务器。

假设您的端口 5701 上的 ServerFoo 已经启动并在其自己的 JVM 中运行。

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

您将启动一个新的 JVM(我们将其称为 DeployerBar)来控制/操作 ServerFoo 实例。

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

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

如果这正是您想要做的,请考虑修改 ServerFoo 以使用 Jetty DeploymentManager 来监视公共(public) webapps 目录。

然后,您的部署过程只需将所有文件(classes/jars/libs/configuration)放入此公共(public) 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);

关于java - 将 Web 应用程序部署到已启动的 jetty ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51074321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com