2016-05-06 13 views
2

Ich verstehe nicht warum im folgenden minimalen Projekt meine Implementierung von Spring WebApplicationInitializer Schnittstelle gefunden wird, wenn Tests innerhalb von Eclipse und IntelliJ, aber nicht bei Verwendung von Maven (mvn clean test).Spring WebApplicationInitializer (ServletContainerInitializer, @HandlesTypes) mit eingebettetem Tomcat

Mit Eclipse und IntelliJ Ich sehe INFO: Spring WebApplicationInitializers detected on classpath: [[email protected]]

Mit mvn clean test ich INFO: No Spring WebApplicationInitializer types detected on classpath sehen.

Im Test leite ich eine Embedded Tomcat:

String pathToWebXML = new File("src/main/webapp/").getAbsolutePath(); 
tomcat = new Tomcat(); 
tomcat.setBaseDir("embedded_tomcat"); 
tomcat.setPort(0); 
tomcat.addWebapp("", pathToWebXML); 
tomcat.start(); 

Die web.xml verweist auf eine ServletContextListener Implementierung, die ein neues (und leer) AnnotationConfigWebApplicationContext schafft.

ich das Beispielprojekt auf GitHub hochgeladen: https://github.com/C-Otto/webapplicationinitializer

+0

Welche Version von Java verwenden Sie in IntelliJ? Verwenden Sie Java 8? Ich habe festgestellt, dass in der Pom-Datei Java 8 –

+0

@Periklis Ja verwende ich Java 8. Haben Sie einen Hinweis, dass ich Java 8 nicht ausführen? Ich bin verwirrt über deine Frage. –

+0

Sorry für die Verwirrung, ich wollte nur sicherstellen, dass die Java-Version, die Sie in IntelliJ verwenden, dieselbe Version ist, die Sie in pom.xml definiert haben. Wann immer ich Zeit habe, würde ich Ihre Anwendung herunterladen und ich werde es versuchen –

Antwort

0

Wie in den Kommentaren angegeben, wird der Classpath, die von Maven todsicherem (und Maven Failsafe) in der Standardeinstellung von Tomcat nicht gescannt. Die meisten Klassen werden mithilfe einer MANIFEST.MF-Datei in einer JAR-Datei referenziert.

Eine Option ist die useSystemClassLoader Einstellung der Maven-Plugins zu deaktivieren. Dies ändert jedoch die Details des Klassenladeprogramms, was zu anderen Problemen führen kann.

Als eine andere Option könnte man useManifestOnlyJar deaktivieren, was Probleme auf Windows-Rechner verursachen kann.

In unserem Projekt haben wir uns dafür entschieden, die Initialisierungsklassen zu entfernen, und stattdessen registrieren, was sie manuell tun sollten. In einem konkreten Beispiel, wie unsere Implementierung von AbstractSecurityWebApplicationInitializer nicht gefunden wurde, registrieren wir jetzt die Sicherheitsfilter manuell innerhalb der contextInitialized Methode:

String filterName = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME); 
servletContext.addFilter(filterName, new DelegatingFilterProxy(filterName)).addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/*"); 
+0

Eine weitere Option besteht darin, Tomcat auch die Gläser, die über die Manifest-Datei referenziert sind, in das jar zu stellen, das von todsicheren erstellt wurde. Dies kann in context.xml erfolgen, indem das Attribut scanManifest des Jar-Scanners auf true gesetzt wird – user1304680

0

Sie können Tomcat sagen die Gläser enthalten, die über die Manifest-Datei in der referenzierten Glas von todsicheren erstellt. Dies kann unter context.xml erfolgen, indem das Jar Scanner-Attribut scanManifest auf true gesetzt wird. Dies ist der Standard in neueren Versionen von Tomcat, wie hier angegeben: https://bz.apache.org/bugzilla/show_bug.cgi?id=59961.