2012-02-21 10 views
7

Estoy intentando configurar un servicio web simple para mi aplicación incrustando Jetty. Me gustaría tener dos servicios web diferentes disponibles, un servidor HTTP simple que solo sirve contenido estático (que finalmente será una aplicación GWT) y un servlet personalizado que puede escupir los mensajes de estado JSON para la aplicación.¿Cómo configuro recursos estáticos y servicios personalizados con Jetty integrado?

Mi estructura de carpetas de distribución se ve algo como esto:

+ dist/ 
    - MyApp.jar 
    + lib/ 
    + html/ 
    - index.html 

Y esto es lo que tengo hasta ahora para la configuración del servidor incorporado. Obtengo correctamente mi salida de prueba de mi servlet personalizado al visitar http://localhost/data/, pero parece que no puedo conseguir que DefaultServlet encuentre mi archivo index.html.

public Webserver(int port) { 
    server = new Server(port); 

    ServletContextHandler context = new ServletContextHandler(); 
    context.setResourceBase("./html/"); 
    server.setHandler(context); 


    JsonDataApiServlet dataServlet = new JsonDataApiServlet(); 
    DefaultServlet staticServlet = new DefaultServlet(); 

    context.addServlet(new ServletHolder(dataServlet), "/data/*"); 
    context.addServlet(new ServletHolder(staticServlet), "/*"); 
} 

Parece que esta sería una tarea común para las personas que integran Jetty en las cosas ... ¿estoy incluso en el camino correcto?

Editar

Resulta que este problema se debía a una falta de comprensión de la forma en que se calculan las rutas relativas en el interior del embarcadero. Estaba ejecutando esto desde una carpeta encima de la carpeta dist, usando java -jar dist\MyApp.jar, y Jetty estaba buscando dist\..\html en lugar de la dist\html correcta. Ejecutar el jar desde el interior de la carpeta dist corrige el problema. Voy a responder cómo lo hice funcionar sin tener que ejecutar desde el directorio dist.

+1

_ Parece que no puedo obtener DefaultServlet para encontrar mi archivo index.html_ Entonces, ¿qué comportamiento ves cuando visitas "/index.html". ¿Qué salida de registro produce Jetty? – Tim

+0

Gracias Tim, ese comentario me llevó en la dirección correcta. – Collin

Respuesta

6

Como dice la edición, esto era solo un problema con el directorio desde el que ejecutaba el contenedor. Aquí está el método que utilicé para encontrar la carpeta html desde donde se ejecutó el Jar:

Primero, agregué la carpeta html al Jar-Manifest Class-Path. El siguiente código da la carpeta html para dondequiera que el tarro se carga desde:

ClassLoader loader = this.getClass().getClassLoader(); 
File indexLoc = new File(loader.getResource("index.html").getFile()); 
String htmlLoc = indexLoc.getParentFile().getAbsolutePath(); 

Este utiliza el cargador de clases para buscar el archivo de índice en la ruta de clases, luego encuentra el directorio absoluta para pasar al embarcadero:

server = new Server(port); 

ServletContextHandler context = new ServletContextHandler(); 
context.setResourceBase(htmlLoc); 
context.setWelcomeFiles(new String[] { "index.html" }); 
server.setHandler(context); 


JsonDataApiServlet dataServlet = new JsonDataApiServlet(); 
DefaultServlet staticServlet = new DefaultServlet(); 

context.addServlet(new ServletHolder(dataServlet), "/data/*"); 
context.addServlet(new ServletHolder(staticServlet), "/*"); 
Cuestiones relacionadas