2012-10-01 17 views
7

Lo que intento hacer es construir un archivo ejecutable JAR que contendrá mi proyecto. He incluido sus dependencias junto a él, también en JAR archivos, por lo que mi listado de directorios es como la siguiente:Iniciar el servidor de embarcadero incrustado para un archivo JAR

~/Projects/Java/web-app/out:

web-app.jar

dependency1.jar

dependency2.jar

dependency3.jar

que sé y estoy seguro de que mi problema no surge de las dependencias, como mis funciones de aplicación adecuada , hasta el momento en que empiezo Jetty embedded.

El código que utilizo para iniciar Jetty es así:

public class ServerExecutionGoal implements ExecutionGoal {  

    private final static Logger logger = Logger.getLogger(ServerExecutionGoal.class);  

    private WebAppContext getWebAppContext() throws IOException {  
     WebAppContext context = new WebAppContext();  
     System.out.println("context = " + context);  
     context.setResourceBase(new PathMatchingResourcePatternResolver().getResource("classpath:/webapp").getURL().toExternalForm());  
     context.setContextPath("/");  
     context.setLogger(new StdErrLog());  
     return context;  
    }  

    @Override  
    public void execute(Map<String, Object> stringObjectMap) throws ExecutionTargetFailureException {  
     logger.info("Instantiating target server ...");  
     final Server server = new Server(8089);  
     final ContextHandlerCollection handlerCollection = new ContextHandlerCollection();  
     try {  
      handlerCollection.setHandlers(new Handler[]{new RequestLogHandler(), getWebAppContext()});  
     } catch (IOException e) {  
      throw new ExecutionTargetFailureException("Could not create web application context", e);  
     }  
     server.setHandler(handlerCollection);  
     try {  
      logger.info("Starting server on port 8089 ...");  
      server.start();  
      server.join();  
      logger.info("Server started. Waiting for requests.");  
     } catch (Exception e) {  
      throw new ExecutionTargetFailureException("Failed to properly start the web server", e);  
     }  
    }  

    public static void main(String[] args) throws ExecutionTargetFailureException {  
     new ServerExecutionGoal().execute(null);  
    }  

}  

puedo validar que la carpeta "aplicación web" se trasladó correctamente dentro de mi JAR a /webapp, y que cuando se ejecuta el código a través de mi IDE (IntelliJ IDEA 11) context.setResourceBase(new PathMatchingResourcePatternResolver().getResource("classpath:/webapp").getURL().toExternalForm()) mapas válidamente para el recurso en cuestión. Además, puedo demostrar que resuelve algo así como:

jar:file:~/Projects/Java/web-app/out/web-app.jar!/webapp 

y es accesible (Lo leí).

Sin embargo, cuando comienzo método principal de mi solicitud, y embarcadero aperturas, en http://localhost:8089 me sale el siguiente:

HTTP ERROR: 503

Problem accessing /. Reason:

Service Unavailable 

Powered by Jetty://

Dónde estoy haciendo mal?

Lo sé estableciendo "resourceBase" en "." la dirección "http://localhost:8089" actuará como una interfaz para la ubicación "~/Projects/Java/web-app/out/" donde puedo ver una lista de todos los archivos JAR, incluido el "web-app.jar", al hacer clic en el que me ofrecen para descargarlo.

he visto las siguientes preguntas, y las respuestas no se aplican:

  1. Embedded jetty application not working from jar: Me NullPointerException desde Start.class.getProtectionDomain().getCodeSource() resuelve a null.
  2. Embedded Jetty WebAppContext FilePermission issue: que no solo no se responde, pero la situación claramente no se aplica, ya que no tengo problemas de permisos (el hecho de que pueda obtener una lista de archivos debería probar eso).
  3. embedding jetty server problems: también sin respuesta, tampoco aplicable ya que no tengo ningún problema de dependencia (como se señaló anteriormente en mis comentarios anteriores).

creo que de alguna manera yo debería permitir embarcadero para acceder a la carpeta /webapp, que se encuentra bajo mi directorio src/main/resources/ y se metieron en mi aplicación web. ¿Debo abandonar una aplicación web incluida y desplegar la ruta de contexto explotada en algún lugar accesible por Jetty en su lugar (esto no es deseable en absoluto, ya que plantea una multitud de problemas para mí y para mis clientes).

+0

Usted podría utilizar context.setWar (...) con un archivo WAR. Esto solo agregaría un archivo a su distribución. –

+0

También estoy enfrentando un problema similar. Cuando el servidor se inicia desde eclipse obtengo la respuesta adecuada para la solicitud. Pero cuando lo ejecuto desde un archivo jar de cmd, obtengo 404. Cualquier ayuda es apreciada. –

Respuesta

0

No estoy seguro, si el WebAppContext de Jetty se puede utilizar con PathMatchingResourcePatternResolver!

En uno de mis proyectos resolví este problema escribiendo mi propio javax.servlet.Filter, que carga los recursos solicitados por Class#getResourceAsStream. Class#getResourceAsStream lee recursos del interior de un jars y dentro de una ruta de recursos (por ejemplo, maven).

Esperanza este consejo es útil para usted, aplausos Thilo

Cuestiones relacionadas