使用 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 加载?)
例如,我想做这样的事情:
- webapp.addEventListener(new SomeClassUnderWebInf()));
- webapp.addEventListener(someInjector.inject(SomeClassUnderWebInf.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();
}
我正在尝试使用 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 加载?)
例如,我想做这样的事情:
- webapp.addEventListener(new SomeClassUnderWebInf()));
- webapp.addEventListener(someInjector.inject(SomeClassUnderWebInf.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();
}