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

时间:2015-05-22 08:03:46

标签: java jetty war web.xml

我正在尝试使用Jetty的自执行WAR包。默认情况下,它使用web.xml进行配置。如果给出了运行时选项,我想通过Java代码级配置使用ServletContextHandler#addServlet,#addEventListener和...来覆盖web.xml。

加载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 /下的类。我可以在WEB-INF /下使用某些类来配置webapp.something()吗? (例如,扩展WebInfConfiguration或执行与WebInfConfiguration类似的类加载?)

例如,我想做类似的事情:

  • webapp.addEventListener(new SomeClassUnderWebInf()));
  • webapp.addEventListener(someInjector.inject(SomeClassUnderWebInf.class));

在server.start()之前。

1 个答案:

答案 0 :(得分:0)

自己处理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();
}