2012-10-01 11 views
7

Quello che sto cercando di fare è creare un file eseguibile JAR che conterrà il mio progetto. Ho incluso le sue dipendenze proprio accanto ad esso, anche in JAR file, quindi il mio elenco di directory simile a questa:Avvio del server Jetty incorporato per un file JAR

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

web-app.jar

dependency1.jar

dependency2.jar

dependency3.jar

che conosco e sono sicuro che il mio problema non si pone dalle dipendenze, come le mie funzioni applicative correttamente , fino al momento in cui avvio Jetty embedded.

Il codice che uso per iniziare Jetty è come questo:

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

}  

posso verificare che la cartella "webapp" viene trasferita correttamente all'interno del mio JAR per /webapp, e che quando si esegue il codice attraverso il mio IDE (IntelliJ IDEA 11) context.setResourceBase(new PathMatchingResourcePatternResolver().getResource("classpath:/webapp").getURL().toExternalForm()) mappe valide per la risorsa in questione. Inoltre, posso dimostrare che si risolve in qualcosa di simile:

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

ed è accessibile (l'ho letto).

Tuttavia, quando inizio il metodo principale di mia domanda, e Jetty inizia, sulla http://localhost:8089 ottengo il seguente:

HTTP ERROR: 503

Problem accessing /. Reason:

Service Unavailable 

Powered by Jetty://

Dove sto andando male?

Lo so impostando "resourceBase" su "." l'indirizzo "http://localhost:8089" fungerà da interfaccia per la posizione "~/Projects/Java/web-app/out/" dove posso vedere un elenco di tutti i file JAR, incluso "web-app.jar", dopo aver fatto clic su cui mi viene offerto di scaricarlo.

Ho visto le seguenti domande, e le risposte non si applicano:

  1. Embedded jetty application not working from jar: ricevo NullPointerException dal Start.class.getProtectionDomain().getCodeSource() risolve a null.
  2. Embedded Jetty WebAppContext FilePermission issue: che non solo non viene data risposta, ma la situazione chiaramente non si applica, in quanto non ho problemi di autorizzazione (il fatto che posso ottenere un elenco di file dovrebbe dimostrarlo).
  3. embedding jetty server problems: anche senza risposta, anche non applicabile in quanto non ho alcun problema di dipendenza (come sottolineato in precedenza nei miei commenti sopra).

Penso che avrei dovuto in qualche modo consentire Jetty di accedere alla cartella /webapp, che si trova sotto la mia directory src/main/resources/ ed è fornito in bundle nella mia applicazione web. Devo abbandonare un'applicazione web in bundle e distribuire il percorso di contesto esploso in un posto accessibile da Jetty (non è affatto auspicabile in quanto pone una moltitudine di problemi per me e per i miei clienti).

+0

Si potrebbe utilizzare context.setWar (...) con un file WAR. Ciò aggiungerebbe solo un file alla tua distribuzione. –

+0

Anche io sto affrontando un problema simile. Quando il server viene avviato da eclipse, ricevo la risposta corretta per la richiesta. Ma quando lo eseguo da un file jar da cmd, ottengo 404. Qualsiasi aiuto è apprezzato. –

risposta

0

Non sono sicuro, se il WebAppContext di Jetty può essere utilizzato con PathMatchingResourcePatternResolver!

In uno dei miei progetti ho risolto questo problema scrivendo il mio javax.servlet.Filter, che carica le risorse richieste per Class#getResourceAsStream. Class#getResourceAsStream legge le risorse dall'interno di un contenitore, nonché all'interno di un percorso di risorse (ad esempio, maven).

Spero che questo suggerimento è utile per voi, applausi Thilo

Problemi correlati