7

Was ich versuche zu tun, ist eine ausführbare JAR Datei zu erstellen, die mein Projekt enthalten wird. Ich habe seine Abhängigkeiten direkt daneben enthalten, auch in JAR Dateien, so dass meine Verzeichnisliste sieht wie folgt aus:Embedded Jetty-Server für eine JAR-Datei starten

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

web-app.jar

dependency1.jar

dependency2.jar

dependency3.jar

Ich weiß und bin sicher, dass mein Problem nicht von Abhängigkeiten nicht entstehen, da meine Anwendung ordnungsgemäß funktioniert , bis zu dem Moment, an dem ich Jetty started.

Der Code verwende ich Jetty zu starten, ist wie folgt:

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);  
    }  

}  

Ich kann bestätigen, dass die „Webapp“ Ordner richtig in meinem JAR /webapp verlagert wird, und dass bei der Ausführung des Codes durch meine IDE (IntelliJ IDEA 11) context.setResourceBase(new PathMatchingResourcePatternResolver().getResource("classpath:/webapp").getURL().toExternalForm()) ist gültig für die betreffende Ressource. Auch kann ich zeigen, dass es in etwas wie folgt:

und ist zugänglich (ich las es).

Allerdings, wenn ich meine Anwendung Hauptverfahren zu starten, und Jetty beginnt, auf http://localhost:8089 ich die folgende:

HTTP ERROR: 503

Problem accessing /. Reason:

Service Unavailable 

Powered by Jetty://

Wohin gehe ich falsch?

Ich weiß das, indem Sie "resourceBase" auf "." die Adresse "http://localhost:8089" wird als Schnittstelle zum Ort "~/Projects/Java/web-app/out/" dienen, wo ich eine Liste aller JAR Dateien sehen kann, einschließlich der "web-app.jar", nach dem Klicken auf den ich angeboten werde, es herunterzuladen.

Ich habe folgende Fragen gesehen, und die Antworten nicht gelten:

  1. Embedded jetty application not working from jar: Ich bekomme seit Nullpointer Start.class.getProtectionDomain().getCodeSource() zu null löst.
  2. Embedded Jetty WebAppContext FilePermission issue: was nicht nur nicht beantwortet wird, aber die Situation trifft eindeutig nicht zu, da ich keine Genehmigungsprobleme habe (die Tatsache, dass ich eine Dateiliste bekommen kann, sollte das beweisen).
  3. embedding jetty server problems: auch unbeantwortet, auch nicht anwendbar, da ich keine Abhängigkeitsprobleme habe (wie bereits oben in meinen Kommentaren erwähnt).

Ich denke, dass ich irgendwie Jetty ermöglichen, die /webapp Ordner zuzugreifen, die unter meinem src/main/resources/ Verzeichnis befinden und in meine Web-Anwendung gebündelt. Sollte ich eine gebündelte Webanwendung aufgeben und stattdessen den explodierten Kontextpfad an einen von Jetty zugänglichen Ort bereitstellen (dies ist überhaupt nicht wünschenswert, da es für mich und meine Kunden eine Vielzahl von Problemen darstellt).

+0

Sie könnten context.setWar (...) mit einer WAR-Datei verwenden. Dies würde nur eine Datei zu Ihrer Distribution hinzufügen. –

+0

Ich bin auch mit einem ähnlichen Problem konfrontiert. Wenn der Server von Eclipse gestartet wird, bekomme ich richtige Antwort für die Anfrage.Aber wenn es aus einer JAR-Datei von cmd ausführen, bekomme ich 404.Any Hilfe ist willkommen. –

Antwort

0

Ich bin mir nicht sicher, ob die WebAppContext von Jetty mit PathMatchingResourcePatternResolver verwendet werden kann!

In einem meiner Projekte löste ich dieses Problem, indem ich meine eigene javax.servlet.Filter schreibe, die die angeforderten Ressourcen durch Class#getResourceAsStream lädt. Class#getResourceAsStream liest Ressourcen aus dem Inneren einer Gläser sowie in einem Ressourcenpfad (z. B. Maven).

Hoffnung dieser Tipp für Sie nützlich ist, prost Thilo