使用 Jetty 加载 WAR 文件时忽略 web.xml

Ignoring web.xml when loading a WAR file with Jetty

我正在尝试使用 Jetty 自行执行 WAR 包。它默认配置为 web.xml。如果给出 运行-time 选项,我想通过 Java 代码级配置覆盖 web.xml ServletContextHandler#addServlet、#addEventListener 和 ...

我可以在加载 WAR 包时忽略 web.xml 吗?


% java -jar foobar.jar  # Use web.xml
% java -jar foobar.jar --customize=something  # Use Java code to configure

// Example

WebAppContext webapp = new WebAppContext();
webapp.setWar(warLocation.toExternalForm());
webapp.setContextPath("/");
if ( /* has run-time options */ ) {
  webapp.setWar(warLocation.toExternalForm()); // But, no load web.xml!
  // Emulates web.xml.
  webapp.addEventListener(...);
  webapp.setInitParameter("resteasy.role.based.security", "true");
  webapp.addFilter(...);
} else {
  webapp.setWar(warLocation.toExternalForm()); // Loading web.xml.
}

附加问题:

在调用 server.start() 之前,未加载 WEB-INF/ 下的 classes。我可以在 WEB-INF/ 下用一些 class 做一些配置 webapp.something() 吗? (例如,扩展 WebInfConfiguration 或执行与 WebInfConfiguration 类似的 class 加载?)

例如,我想做这样的事情:

在 server.start() 之前。

自行处理 WebAppContext 配置。

例如:

private static class SelfConfiguration extends AbstractConfiguration
{
    @Override
    public void configure(WebAppContext context) throws Exception
    {
        // Emulates web.xml.
        webapp.addEventListener(...);
        webapp.setInitParameter("resteasy.role.based.security", "true");
        webapp.addFilter(...);
    }
}

public static void main(String[] args) throws Exception
{
    Server server = new Server(8080);

    WebAppContext webapp = new WebAppContext();
    webapp.setContextPath("/");
    if (useWebXml)
    {
        webapp.setConfigurationClasses(WebAppContext.getDefaultConfigurationClasses());
    } 
    else 
    {
        webapp.setConfigurations(new Configuration[] { 
            new SelfConfiguration() 
        });
    }
    webapp.setWar("path/to/my/test.war");
    webapp.setParentLoaderPriority(true);
    server.setHandler(webapp);
    server.start();
    server.join();
}