Spring 3.1 WebApplicationInitializer & amp; Embedded Jetty 8 AnnotationConfiguration
Ich bin versucht, zu erstellen eine einfache webapp ohne XML-Konfiguration von Spring 3.1 und einen eingebetteten Jetty 8 server.
Jedoch bin ich kämpfen, um Jetty zu erkennen meine implementaton der Feder WebApplicationInitializer - Schnittstelle.
Projekt Struktur:
src
+- main
+- java
| +- JettyServer.java
| +- Initializer.java
|
+- webapp
+- web.xml (objective is to remove this - see below).
Den Initialisierer Klasse ist eine einfache Implementierung von WebApplicationInitializer:
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.springframework.web.WebApplicationInitializer;
public class Initializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
System.out.println("onStartup");
}
}
Ebenfalls JettyServer ist eine einfache Implementierung eines embedded Jetty-server:
import org.eclipse.jetty.annotations.AnnotationConfiguration;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.Configuration;
import org.eclipse.jetty.webapp.WebAppContext;
public class JettyServer {
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
WebAppContext webAppContext = new WebAppContext();
webAppContext.setResourceBase("src/main/webapp");
webAppContext.setContextPath("/");
webAppContext.setConfigurations(new Configuration[] { new AnnotationConfiguration() });
webAppContext.setParentLoaderPriority(true);
server.setHandler(webAppContext);
server.start();
server.join();
}
}
Mein Verständnis ist, dass beim Start Jetty verwenden AnnotationConfiguration zu Scannen
kommentierte Implementierungen von ServletContainerInitializer; es sollte Initialisierer und Draht...
Allerdings, wenn ich starten Sie den Jetty-server (in Eclipse) sehe ich Folgendes auf der Kommandozeile:
2012-11-04 16:59:04.552:INFO:oejs.Server:jetty-8.1.7.v20120910
2012-11-04 16:59:05.046:INFO:/:No Spring WebApplicationInitializer types detected on classpath
2012-11-04 16:59:05.046:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/,file:/Users/duncan/Coding/spring-mvc-embedded-jetty-test/src/main/webapp/}
2012-11-04 16:59:05.117:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080
Der wichtige Teil ist dieser:
No Spring WebApplicationInitializer types detected on classpath
Beachten Sie, dass src/main/java ist definiert als source folder in Eclipse, so sollte im classpath. Beachten Sie auch, dass die Dynamische Web-Modul Facette festgelegt ist 3.0.
Ich bin sicher, es gibt eine einfache Erklärung, aber ich bin kämpfen, um zu sehen, das Holz für die Bäume! Ich vermute, der Schlüssel ist mit der folgenden Zeile:
...
webAppContext.setResourceBase("src/main/webapp");
...
Dies macht Sinn, mit einem 2,5-servlet mit web.xml (siehe unten), aber was soll es, wenn mit AnnotationConfiguration?
NB: Alles startet korrekt, wenn ich das ändern der Konfigurationen in der folgenden:
...
webAppContext.setConfigurations(new Configuration[] { new WebXmlConfiguration() });
...
In diesem Fall findet die web.xml unter src/main/webapp und verwendet Sie, um Draht-servlet mit DispatcherServlet und AnnotationConfigWebApplicationContext in der üblichen Weise (vollständig unter Umgehung der WebApplicationInitializer Umsetzung oben).
Dieser fühlt sich sehr ähnlich wie ein classpath-problem, aber ich habe Mühe zu verstehen, ganz wie Steg gesellt sich mit Implementierungen von WebApplicationInitializer - irgendwelche Vorschläge wäre sehr dankbar!
Zur info, ich bin mit dem folgenden:
Spring 3.1.1
Jetty 8.1.7
STS 3.1.0
InformationsquelleAutor der Frage Duncan | 2012-11-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass jettys
AnnotationConfiguration
Klasse nicht Scannen nicht-jar-Ressourcen in den Klassenpfad (außer unter WEB-INF/classes).Er findet meine
WebApplicationInitializer
's wenn ich eine Unterklasse vonAnnotationConfiguration
überschriebenconfigure(WebAppContext)
zu Scannen Sie den host-classpath neben die container und web-inf Standorten.Meisten sub-class ist (leider) copy-paste von den Eltern. Es beinhaltet:
parseHostClassPath
) am Ende des configure-Methode;parseHostClassPath
- Methode, die weitgehend copy-paste vonAnnotationConfiguration
'sparseWebInfClasses
;getHostClassPathResource
Methode, die schnappt sich der erste nicht-jar-URLvon den classloader, der die, für mich zumindest, ist die Datei-url zu meinem
classpath in eclipse).
Ich bin mit leicht verschiedenen Versionen von Jetty (8.1.7.v20120910) und der Feder (3.1.2_RELEASE), aber ich Stelle mir die gleiche Lösung funktioniert.
Edit: ich erstellte ein funktionierendes Beispiel-Projekt in github mit einigen änderungen (der code unten funktioniert von Eclipse aber nicht, wenn die Ausführung in einem schattierten Glas) - https://github.com/steveliles/jetty-embedded-spring-mvc-noxml
In den OP ' s JettyServer Klasse, die nötigen änderungen würden ersetzen Sie die Zeile 15 mit:
Update: Jetty 8.1.8 führt interne Veränderungen, die nicht mit dem code oben. Für 8.1.8 Folgendes scheint zu funktionieren:
InformationsquelleAutor der Antwort Stevie
Konnte ich beheben, in einer einfacheren, aber mehr begrenzt nur durch die Bereitstellung ausdrücklich auf die AnnotationConfiguration die Umsetzung Klasse (MyWebApplicationInitializerImpl in diesem Beispiel), dass ich will geladen werden wie diese:
InformationsquelleAutor der Antwort magomarcelo
Steg 9.0.1 enthält eine Erweiterung die es ermöglicht das Scannen von Anmerkungen von nicht-jar-Ressourcen (ie-Klassen) auf den container classpath. Siehe Kommentar #5 auf dem folgenden Problem, wie es zu benutzen:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=404176#c5
Jan
InformationsquelleAutor der Antwort Jan
Den code unten hat den trick in mein maven-Projekt:
InformationsquelleAutor der Antwort Erich Eichinger
Basierend auf meinen Tests und dieser thread http://forum.springsource.org/showthread.php?127152-WebApplicationInitializer-not-loaded-with-embedded-Jetty ich glaube nicht, dass es im moment arbeitet. Wenn man sich in AnnotationConfiguration.konfigurieren:
scheint es gekoppelt ist, um einen Krieg wie Bereitstellung, anstatt eingebettet.
Hier ist ein Beispiel mit Spring MVC und embedded Jetty, die vielleicht nützlicher sein:
http://www.jamesward.com/2012/08/13/containerless-spring-mvc
Schafft es der Spring-servlet direkt anstatt sich auf Anmerkungen.
InformationsquelleAutor der Antwort artbristol
Diejenigen, bei denen dieses in letzter Zeit, es scheint, dieses wird rund um das Thema:
InformationsquelleAutor der Antwort SingleShot
Das es auf den Steg 9 set-Attribut AnnotationConfiguration.CLASS_INHERITANCE_MAP auf WebAppContext
Und hier ist, wie man dieser Karte:
Legte ich, dass die Lösung auf gitHub
InformationsquelleAutor der Antwort marians27
Was nur über die Einstellung der Kontext-Attribut teilt dem scanner mit, welche Dinge gehören auf den container classpath, die gescannt werden müssen?
Kontext-Attribut:
org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern
./servlet-api-[^/].jar$
Es wurde entwickelt, um verwendet werden, um jar-Namen, aber Sie konnte einfach passen alles.
Würden Sie brauchen, um die Nutzung WebInfConfiguration sowie die AnnotationConfiguration Klassen.
cheers
Jan
InformationsquelleAutor der Antwort Jan
In unserem Fall haben diese Zeilen geholfen, in der Jetty-Start-code:
InformationsquelleAutor der Antwort ssasa
Steg 9-version von "magomarcelo" Antwort:
InformationsquelleAutor der Antwort iTake
Für Jetty 9, wenn Sie webjars, die Lösung funktioniert nicht sofort wie diese Gläser müssen im classpath und JAR-Inhalte verfügbar sein müssen als Ressourcen für Ihre webapp. So, für die, die arbeiten zusammen mit webjars, die config müsste:
Hier die Reihenfolge wichtig ist (WebInfConfiguration hat zu kommen, bevor MetaInf).
InformationsquelleAutor der Antwort dontForgetTheJoker
Lösung, die für mich gearbeitet, und impliziert nicht Scannen, sondern verwendet WebApplicationInitializer Klasse, die Sie bieten. Jetty-version: 9.2.20
Quelle (in Russisch) dieser Codeausschnitt ist hier: https://habrahabr.ru/post/255773/
InformationsquelleAutor der Antwort Anton Kushch
haben ein einfaches maven Projekt zu zeigen, wie es getan werden kann, sauber.
und das ist alles - der Frühling WebApplicationInitializer, die Sie verwenden, wird erkannt werden, ohne explizit zu lassen jetty-server wissen, über die Existenz von solch eine app Initialisierung.
InformationsquelleAutor der Antwort maggu