Состояние:
- У меня есть веб-приложение на базе Struts 1.3, которое прекрасно разворачивается в Tomcat (войной или взрывом).
- Я объединяю веб-приложение с классом для запуска встроенной пристани 7.x. Все это входит в один файл JAR.
- Я использую maven-assembly-plugin для упаковки всех зависимостей, разнесенных в один jar-файл. Я заглянул внутрь фляги, и все было так, как вы ожидаете. Стандартный макет веб-приложения, за исключением всех зависимых классов, находится в стандартном макете пакета. WEB-INF / web.xml именно там, где вы этого ожидаете.
- Jetty запускается нормально и запускает мой первый загрузочный сервлет, который выполняет некоторую инициализацию базы данных. Моя JspConfiguration использует путь «WEB-INF / web.xml» для получения файла web.xml (обратите внимание, что отсутствует косая черта).
Проблема
Когда инициализируется сервлет действия Struts, он, в частности, выполняет следующий вызов:
InputStream input = getServletContext (). GetResourceAsStream ("/ WEB-INF / web.xml");
, что приводит к:
javax.servlet.ServletException: The /WEB-INF/web.xml was not found.
at org.apache.struts.action.ActionServlet.initServlet(ActionServlet.java:1781)
at org.apache.struts.action.ActionServlet.init(ActionServlet.java:349)
at javax.servlet.GenericServlet.init(GenericServlet.java:212)
at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:432)
at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:260)
Вопрос:
Я предполагаю, что это происходит из-за того, что распорки используют косую черту при запросе ресурса.
- Должен ли я упаковать по-другому?
- Должен ли я иметь код, который захватывает этот запрос и настраивает URI для удаления начального слеша? Как?
- Я бы лучше не настраивал код распорок, если это возможно ....
- Если вы решили помочь, спасибо!
Информация:
Вот класс, который я использую для запуска пристани вместе с двумя зависимыми классами.
public class JettyRunner {
public static void main(String[] args) throws Exception {
if (args == null) {
args = new String[0];
}
// Construct the new arguments for jetty-runner
boolean transientState = false;
int port = 8070;
Server server = new Server(port);
WebAppContext webapp = new WebAppContext(".", "");
webapp.setConfigurations(new Configuration[]{new JspConfiguration()});
ClassPathResourceHandler resourceHandler = new ClassPathResourceHandler();
resourceHandler.setContextPath("");
ContextHandlerCollection contexts = new ContextHandlerCollection();
contexts.addHandler(resourceHandler);
contexts.addHandler(webapp);
server.setHandler(contexts);
//server.setHandler(webapp);
URL jettyXmlURL = new JettyRunner().getClass().getClassLoader().getResource("jetty.xml");
XmlConfiguration configuration = new XmlConfiguration(jettyXmlURL); //or use new XmlConfiguration(new FileInputStream("myJetty.xml"));
//XmlConfiguration configuration = new XmlConfiguration(new FileInputStream("jetty.xml"));
configuration.configure(server);
server.start();
server.join();
}
}
public class JspConfiguration extends WebXmlConfiguration {
@Override
public Resource findWebXml(WebAppContext webAppContext) throws IOException, MalformedURLException {
URL path = getClass().getClassLoader().getResource("WEB-INF/web.xml");
return Resource.newResource(path);
}
}
public class ClassPathResourceHandler extends ContextHandler {
Logger log = Logger.getLogger(startupServlet.class.getName());
private ResourceHandler realResourceHandler = null;
public ClassPathResourceHandler() {
realResourceHandler = new ResourceHandlerImplementation();
}
@Override
public void doHandle(String s, Request request, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException, ServletException {
realResourceHandler.handle(s, request, httpServletRequest, httpServletResponse);
}
private class ResourceHandlerImplementation extends ResourceHandler {
@Override
protected Resource getResource(HttpServletRequest httpServletRequest) throws MalformedURLException {
String requestedFile = httpServletRequest.getRequestURI();
log.debug("getResource(): " + requestedFile);
URL path = getClass().getResource(requestedFile);
try {
Resource resource = Resource.newResource(path);
if (resource != null && resource.exists() && !resource.isDirectory()) {
return resource;
}
else {
return null;
}
}
catch (IOException e) {
return null;
}
}
}
}