jetty - 将 DeploymentManager 绑定到嵌入式 Jetty 服务器
问题描述
我正在阅读以下有关嵌入式 Jetty 部署架构的文档 ,并尝试配置一个非常简单的码头服务器,该服务器最初加载时没有部署任何 WebApps 或处理程序。服务器应该热部署复制到静态目录的 WAR。
我的代码:
public class JettyServerDeploymentManager implements JettyServer {
private Server server;
private DeploymentManager deployer;
private AppProvider appProvider;
public void start() throws Exception {
server = new Server(8090);
// Setup Connector
ServerConnector connector = new ServerConnector(server);
server.setConnectors(new Connector[] {connector});
// Handler Tree location for all webapps
ContextHandlerCollection contexts = new ContextHandlerCollection();
// Deployment Management
deployer = new DeploymentManager();
deployer.setContexts(contexts);
appProvider = new WebAppProvider();
((WebAppProvider) appProvider).setMonitoredDirName("/mytmpdir");
deployer.addAppProvider(appProvider);
server.addBean(deployer);
// Handler Tree
HandlerCollection handlers = new HandlerCollection();
handlers.addHandler(contexts);
handlers.addHandler(new DefaultHandler());
server.setHandler(handlers);
server.start();
server.join();
}
}
这个 impl 应该等同于上面链接中提供的代码(xml 配置)。
服务器初始化没有任何错误,但是当我将战争文件复制到扫描的目录时,什么也没有发生。
我错过了什么?我什至不确定我的服务器与部署管理器之间的链接是否足够。
更新:
它似乎正在工作,至少是扫描部分,我已经添加了
static
{
// Make jetty's own logging use java.util.logging
org.eclipse.jetty.util.log.Log.setLog(new JavaUtilLog());
}
现在我在日志中看到 appProvider 加载了一个新的战争(它现在在 NullPtr 上失败了)
Apr 08, 2019 2:51:43 PM org.eclipse.jetty.webapp.WebAppContext doStart
WARNING: Failed startup of context o.e.j.w.WebAppContext@19efba8a{/simple1,jar:file:///mytmpdir/simple1.war!/,null}{/mytmpdir/simple1.war}
java.lang.NullPointerException
at org.eclipse.jetty.webapp.MetaInfConfiguration.preConfigure(MetaInfConfiguration.java:77)
at org.eclipse.jetty.webapp.WebAppContext.preConfigure(WebAppContext.java:501)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:539)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:41)
at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:188)
at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:499)
at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:147)
at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:180)
at org.eclipse.jetty.deploy.providers.WebAppProvider.fileAdded(WebAppProvider.java:452)
at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:64)
at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:610)
at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:529)
at org.eclipse.jetty.util.Scanner.scan(Scanner.java:392)
at org.eclipse.jetty.util.Scanner$1.run(Scanner.java:329)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
解决方案
工作解决方案:
public class JettyServerDeploymentManager implements JettyServer {
private static final Logger log = Logger.getLogger(JettyServerDeploymentManager.class.getName());
private Server server;
private DeploymentManager deployer;
private AppProvider appProvider;
static
{
// Make jetty's own logging use java.util.logging
org.eclipse.jetty.util.log.Log.setLog(new JavaUtilLog());
}
public void start() throws Exception {
server = new Server(8090);
// Setup Connector
ServerConnector connector = new ServerConnector(server);
server.setConnectors(new Connector[] {connector});
// Handler Tree location for all webapps
ContextHandlerCollection contexts = new ContextHandlerCollection();
// Handler Tree
HandlerCollection handlers = new HandlerCollection();
handlers.addHandler(contexts);
handlers.addHandler(new DefaultHandler());
server.setHandler(handlers);
// Deployment Manager
DeploymentManager deploymentManager = new DeploymentManager();
deploymentManager.setContexts(contexts);
// App provider
WebAppProvider appProvider = new WebAppProvider();
appProvider.setExtractWars(true); // required for a proper deployment of inner jars
appProvider.setMonitoredDirName("/mytmpdir");
appProvider.setScanInterval(2);
deploymentManager.addAppProvider(appProvider);
server.addBean(deploymentManager);
log.info("starting server");
server.start();
server.join();
}
private static URL findWebAppPath() {
ClassLoader classLoader = SparkApp.class.getClassLoader();
return classLoader.getResource("");
}
推荐阅读
- node.js - 如何使用 socket.io 从 express node.js 服务器发送数据
- android - Android-fitsSystemWindows 属性的问题
- python - 为什么我不需要 "\n" 在文件中添加一行?
- c# - 为什么 .NET Core 5 的 Program.cs 中没有任何类?
- jsf - 有没有办法用 Primefaces 中我的 dataTable 的第一个值替换 headerText?
- c# - 如何将 vanilla C# 代码和测试添加到 Unity 项目?
- php - 参考 - 升级 PHP 后 Composer 错误“您的 PHP 版本不满足要求”
- python - 如何从python中的其他文件调用变量?
- python - Sqlite 磁盘 I/O 错误(python - databricks)
- php - 在php函数中使用sql查询获取结果的问题