我正在尝试使用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类似的类加载?)
例如,我想做类似的事情:
在server.start()之前。
答案 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();
}