2016-07-12 21 views
0

In einer Testumgebung versuche ich, einen eingebetteten Jetty mit einigen Anwendungen auszuführen. Die Anwendung hängt von some-dependency ab, die eine web-fragemnt.xml in ihrem Ordner META-INF angibt. Ich versuche, das Fragment wie folgt zu laden:Laden eines Webfragments beim Ausführen eines eingebetteten Jettys

public static void someMain(...) { 
    server = new Server(port); 
    final WebAppContext context = new WebAppContext(); 
    addFragmentIfExists(context); 
    context.setContextPath("/"); 
    context.setParentLoaderPriority(true); 
    context.setResourceBase(pathToWebapp); 
    server.setHandler(context); 
} 

private void addFragmentIfExists(final WebAppContext context) { 
    final Optional<URL> url = Stream.of(((URLClassLoader) ClassLoader.getSystemClassLoader()).getURLs()) 
      .filter(u -> u.toString().contains("some-dependency")).findFirst(); 
    url.ifPresent(u -> { 
     try { 
      context.getMetaData().addFragment(newResource(u), 
        newResource(new File(u.getPath(), "META-INF/web-fragment.xml"))); 
     } catch (Exception e) { 
      ... 
     } 
    }); 
} 

beim Debuggen kann ich das Fragment sehen unter server.handler.metadata.webFragments{Roots,NameMap,ResourceMap} geladen, aber unter server.handler.{filters,servlets} Ich sehe nicht, den Filter und Servlets in diesem Fragment erklärt Was soll ich tun falsch? Gibt es auch einen weniger hacky Weg, um das Fragment zu laden? Ich habe auch ein Spring-Web-Fragment im Classpath, wenn ich gerade versuche, aus dem Klassenpfad lädt die

Antwort

0

Legen Sie die Web-Fragment-Glas in Ihrem Verzeichnis pathToWebapp + "/WEB-INF/lib/", und legen Sie die Konfigurationen Webfragmente zu verwenden.

zB:

Server server = new Server(8080); 

    Configuration.ClassList classlist = Configuration.ClassList 
      .setServerDefault(server); 
    classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", 
      "org.eclipse.jetty.plus.webapp.EnvConfiguration", 
      "org.eclipse.jetty.plus.webapp.PlusConfiguration"); 
    classlist.addBefore(
      "org.eclipse.jetty.webapp.JettyWebXmlConfiguration", 
      "org.eclipse.jetty.annotations.AnnotationConfiguration"); 

    WebAppContext context = new WebAppContext(); 
    context.setContextPath("/"); 
    // ... etc ... 
+0

Danke, ich werde es versuchen, ich bin nicht sicher, warum sollte die Konfigurationsklassen geändert werden, ihre sowieso alle geladen, gibt es neue Klassen hier drin? Auch diese Lösung ist nicht allgemein genug, da das Jar bereits in diesem Verzeichnis in diesem Verzeichnis ist, aber beim Ausführen eines Tests in der IDE ist das Fragment in einem Klassenverzeichnis in einem Zielordner des Abhängigkeitsprojekts – sagioto

+0

Ich verwende Jetty : '8.1.5.v20120716' Ich habe diese Konfigurationsklassen nicht in meinem Klassenpfad – sagioto