2017-06-24 3 views
1

Ich habe Spring Boot + Jsp, und von this post Ich weiß, wenn JSP-Dateien in src/main/resources/META-INF/resources/ auch als ausführbares Glas verpackt.Über Modify Spring Boot 1.5.3 zur Unterstützung erkennen JSP-Dateien

Leider, wenn ich Frühling Boot Version von 1.4.2 zu 1.5.3 ändern, kann es 404 nicht unterstützen und zurückgeben. Nach Stunden, die ihre Quellcodes verfolgen und vergleichen, weiß ich, warum 1.5.3 es nicht unterstützen kann.

Spring boot 1.4.2

//org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.StoreMergedWebXmlListener#onStart 
private void onStart(Context context) { 
    ServletContext servletContext = context.getServletContext(); 
    if(servletContext.getAttribute("org.apache.tomcat.util.scan.MergedWebXml") == null) { 
     servletContext.setAttribute("org.apache.tomcat.util.scan.MergedWebXml", this.getEmptyWebXml()); 
    } 
    // only 1.4.2 has this line and with this code could recognise jsp files in /META-INF/resources/ 
    TomcatResources.get(context).addClasspathResources(); 
} 

Frühling Boot 1.5.3

private void onStart(Context context) { 
    ServletContext servletContext = context.getServletContext(); 
    if (servletContext.getAttribute(MERGED_WEB_XML) == null) { 
     servletContext.setAttribute(MERGED_WEB_XML, getEmptyWebXml()); 
    } 
} 

Deshalb möchte ich wissen, warum nach 1.4.2 diesen Code zu entfernen haben?

TomcatResources.get(context).addClasspathResources(); 

Und weil ich immer noch 1.5.3 verwenden möchten, so habe ich manuell von unten Art und Weise Code

1.Kopieren Quelle TomcatEmbeddedServletContainerFactory zu aktuellen Classpath enter image description here

2 diesen Code hinzuzufügen. Do unten ändern

private void onStart(Context context) { 
    ServletContext servletContext = context.getServletContext(); 
    if (servletContext.getAttribute(MERGED_WEB_XML) == null) { 
     servletContext.setAttribute(MERGED_WEB_XML, getEmptyWebXml()); 
    } 
    // Add below code 
    ClassLoader loader = getClass().getClassLoader(); 
    URL[] urLs = ((URLClassLoader) loader).getURLs(); 
    List<URL> list = new ArrayList<>(); 
    //String file = "file:/Users/zhugw/workspace/boot-jar-serving-jsp/boot-jar-serving-jsp-1.0-SNAPSHOT.jar!/"; 
    String file = urLs[0].getFile().replaceFirst("BOOT-INF/classes!/", ""); 
    URL jar = new URL("jar", "", file); 
    list.add(0,jar); 
    TomcatResources.get(context).addResourceJars(list); 
} 

und es funktioniert. Und ich möchte wissen, ob das so geht?

Antwort

1

Wir haben die gleiche PB hier.

  1. Wir haben Ihre Lösung aber erfolglos versucht. Die folgende Ausnahme ausgelöst wurde beim Start der Anwendung:

...

Caused by: java.lang.IllegalAccessError: tried to access class org.springframework.boot.context.embedded.tomcat.TldSkipPatterns from class org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.(TomcatEmbeddedServletContainerFactory.java:130)

...

  1. Endlich ist es den Anruf scheint "TomcatResources.get (Kontext) .addClasspathResources();" wurde nicht entfernt, sondern umstrukturiert.

Jetzt in SpringBoot 1.5.8.RELEASE, haben Sie die folgenden Zeilen in TomcatEmbeddedServletContainerFactory.prepareContext():

context.addLifecycleListener(new LifecycleListener() { 
    @Override 
    public void lifecycleEvent(LifecycleEvent event) { 
     if (event.getType().equals(Lifecycle.CONFIGURE_START_EVENT)) { 
      TomcatResources.get(context) 
        .addResourceJars(getUrlsOfJarsWithMetaInfResources()); 
     } 
    } 
}); 
  1. In unserem Fall waren wir mit eine angepasste EmbeddedServletContainerFactory (überschreiben einiger Methoden von TomcatEmbeddedServletContainerFactory) und aus einem unbekannten Grund war der in getUrlOfJarsWithMetaInfResources() abgerufene Klassenlader fast leer (nur der Klassenordner ohne JAR-Datei).

Lösung: Wir haben diese Überschreibung einfach entfernt. Jar-Dateien sind im Classloader zurück und folglich werden JSP-Dateien, die in diesen JAR-Dateien gespeichert sind, jetzt von der App korrekt erkannt.

+0

aber ich denke, Sie könnten diese Problemumgehung für Legacy-Projekt, aber wenn es ein neues Projekt ist, schlage ich vor, Sie verwenden erweiterte Template-Engine, z. B. "Thymeleaf" und ich fühle das Kostenlernen ist nicht sehr hoch. – zhuguowei

Verwandte Themen