2016-02-04 2 views
0

У меня есть образец проекта Maven в Eclipse (Mars) со встроенным причалом v9. Я определил обработчик ресурсов для статических файлов html/javascript и обработчик сервлета для API REST. Я создаю единый кусок жира (пакет оттенков), и он делает все, что я хочу, когда я запускаю банку из проекта homedir. Он обслуживает остальные API и веб-страницы. Из любого другого каталога он обслуживает только REST API. Для страниц HTML сервер причала дает причину, которая не найдена.Встраиваемый Jetty не обслуживает страницы webapp, звонки REST OK

Обработчики вооружившись таким образом:

//REST handler context 
    ServletContextHandler restHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); 
    restHandler.setContextPath("/"); 

    // Jersey REST handling servlet 
    ServletHolder jerseyServlet = restHandler.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*"); 
    jerseyServlet.setInitOrder(0); 

    // Tell Jersey which REST service class to load.... 
    jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", RestHandler.class.getCanonicalName()); 

    // Handler that will handle the request for a given html page 
    ResourceHandler resourceHandler = new ResourceHandler(); 

    // Configure page handler with login.html as the initial landing page 
    resourceHandler.setDirectoriesListed(true); 
    resourceHandler.setWelcomeFiles(new String[]{ "pages/login.html" }); 
    resourceHandler.setResourceBase("src/main/webapp/"); 

    //Add all handlers to the server 
    Server jettyServer = new Server(8080); 
    //ConstraintSecurityHandler authenticationHandler = authenticationService(jettyServer); 
    //authenticationHandler.setHandler(resourceHandler); 

    HandlerCollection handlerList = new HandlerCollection(); 
    handlerList.setHandlers(new Handler[] { resourceHandler,, 
              restHandler, 
              new DefaultHandler(), 
              }); 

    jettyServer.setHandler(handlerList); 

пункт Построить в pom.xml выглядит так:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 

<build> 
    <resources> 
    <resource> 
     <directory>${project.basedir}/src/main/webapp</directory> 
    </resource> 
    </resources> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>1.6</version> 

     <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
      <goal>shade</goal> 
      </goals> 
      <configuration> 
      <transformers> 
       <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> 
       <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
       <manifestEntries> 
        <Main-Class>com.dastratum.DasConsole.ConsoleMain</Main-Class> 
       </manifestEntries> 
       </transformer> 
      </transformers> 
      <minimizeJar>false</minimizeJar> 
      <createDependencyReducedPom>true</createDependencyReducedPom> 
      <filters> 
      <filter> 
       <artifact>*:*</artifact> 
       <excludes> 
        <exclude>META-INF/*</exclude> 
        <exclude>junit:junit</exclude> 
       </excludes> 
      </filter> 
      </filters> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

</project> 

Любая помощь приветствуется. Благодарю.

ответ

0

Фундаментальная часть этого вопроса (смешение ResourceHandler & ServletContextHandler) был дан ответ ранее.

Однако, добавил морщин здесь является то, что вы используете Джерси, который (исторически) по умолчанию будет служить статические файлы самостоятельно, не позволяя контейнер сервлетов, чтобы служить статические файлы через DefaultServlet.

Рекомендовал бы, что вы уронили ResourceHandler целиком, а установка правильного ResourceBase для вашего ServletContextHandler (то есть Джерси в нем), а затем убедитесь, что вы добавляете DefaultServlet отображается в /. Это, скорее всего, будет работать нормально, а Джерси - статический контент, но если вам нужно больше контролировать статический файл (например, управление кешем, эффективное использование памяти, интеллектуальные фильтры push/push и т. Д.), Тогда вы будете необходимо выполнить дополнительный шаг по настройке Джерси, чтобы не обслуживать статический контент, и пусть Jetty's DefaultServlet выполнит эту работу.