Struts 1.3.10 во встроенной пристани. ActionServlet не может найти /WEB-INF/web.xml - PullRequest
0 голосов
/ 19 сентября 2011

Состояние:

  • У меня есть веб-приложение на базе 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;
            }
        }
    }


}

Ответы [ 2 ]

0 голосов
/ 10 февраля 2013

Я смог решить эту проблему для моего приложения Struts 1.3, используя метод setWar() WebAppContext.Моя версия обычного пристани имеет вид:

public class JettyRunner {
    private static final Logger logger = Logger.getLogger(JettyRunner.class);

    public static void main(String[] args) throws Exception {

        WebAppContext context = new WebAppContext();
        context.setWar(System.getProperty("user.dir") + "/src/main/webapp/");
        context.setContextPath("/");
        logger.debug(context.dump());

        Server server = new Server(8080);
        server.setHandler(context);

        server.start();
        server.join();

    }
}
0 голосов
/ 19 сентября 2011

Struts был разработан для запуска как веб-приложение, а не как отдельное приложение.В вашем классе JettyRunner у вас есть метод main для запуска Jetty.Это не будет работать со Struts.Вам нужно создать веб-приложение, если вы хотите использовать Struts 1.x.

...