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:
- Embedded jetty application not working from jar: Ich bekomme seit Nullpointer
Start.class.getProtectionDomain().getCodeSource()
zunull
löst. - 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).
- 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).
Sie könnten context.setWar (...) mit einer WAR-Datei verwenden. Dies würde nur eine Datei zu Ihrer Distribution hinzufügen. –
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. –