首页 > 解决方案 > 将 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)

标签: jettyweb-deploymentembedded-jettyjetty-9

解决方案


工作解决方案:

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("");
    }

推荐阅读