【问题标题】:Ignoring web.xml when loading a WAR file with Jetty使用 Jetty 加载 WAR 文件时忽略 web.xml
【发布时间】:2015-08-04 03:57:20
【问题描述】:

我正在尝试使用 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() 之前。

【问题讨论】:

  • 在 stackoverflow 上将“附加问题”作为另一个问题提出,不要在此处使原始问题复杂化。 (它也让那些追随你的人更好地找到相关的问题和答案)
  • 啊,有道理。谢谢你的建议。我会再问一个问题!
  • stackoverflow.com/questions/31192270/…发布了另一个问题。

标签: java jetty war web.xml


【解决方案1】:

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

【讨论】:

  • 谢谢!虽然我不能立即尝试,但我会尽快尝试。
  • 谢谢,乔金。很长一段时间后,我可以在没有 web.xml 配置的情况下启动 Jetty 服务器。但是,我还有另一个问题。有谁知道如何在 WEB-INF/ 下手动加载类?
猜你喜欢
  • 2013-05-16
  • 2012-11-23
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2017-02-25
  • 2017-02-01
相关资源
最近更新 更多