5

Ich habe eine einfache App erstellt, die Spring Data 3.1.0.RELEASE verwendet und Eclipselink 2.4 auf der Serverseite - die im Tomcat 7.0.27 gehostet wird. In MyWebApp/META-INF/context.xml habe ich Frühlings-ClassloaderWie Tomcat mit TomcatInstrumentableClassLoader arbeitet, das in META-INF/context.xml zusammen mit WEB-INF/lib/spring-instrument-tomcat.jar definiert ist

<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/> 

Wenn ich spring-instrument-tomcat.jar in $TOMCAT_HOME/lib setzen dann Tomcat läuft MyWebApp gut, aber wenn ich spring-instrument-tomcat.jar in die $TOMCAT_HOME/webapps/mywebapp/WEB-INF/lib setzen - Tomcat stirbt mit Ausnahme

java.lang.IllegalStateException: ClassLoader [org.apache.catalina.loader.WebappClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar 

Context loader Parameter useSystemClassLoaderAsParent auf false gesetzt ist auch nicht hilfreich.

Ich möchte keine (benutzerdefinierte) globale Lib in Tomcat haben (und es wird nicht einfach sein, die globale in unserem realen Produktionssystem zu haben), also versuche ich, alle benötigten zu lokalisieren Zeug in einfacher (noch großer) Kriegsakte. Irgendwelche Gedanken darüber, wie man eine solche Kapselung erreicht?

Antwort

5

Nun, wenn Sie nicht zusätzliche Gläser in Tomcat-Ordner lib wollen, ist die einzige Option (haben noch Frühjahr/AspectJ LTW Arbeit) ist die Tomcats Lauf Skript zu bearbeiten -javaagent hinzufügen :. ..instrument.jar zu seinen JAVA_OPTS oder CATALINA_OPTS, und entfernen Sie die context.xml-Datei (Sie werden TomcatInstrumentableClassLoad nicht mehr benötigen).

+0

Ich muss Ihre Antwort als richtig behandeln, weil es die beste Lösung ist, die bisher gefunden wurde. Vielen Dank! –

0

Vielleicht ist Ihre context.xml nicht richtig. Versuchen Sie folgendes:

<?xml version="1.0" encoding="UTF-8" ?> 
<Context> 
    <Loader 
    loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader" 
    useSystemClassLoaderAsParent="false" /> 
</Context> 
+1

Ich habe Ihren Vorschlag mit ** useSystemClassLoaderAsParent ** versucht, aber auf Tomcat 7 habe ich 'WARNING: [SetPropertiesRule] {Context/Loader} Einstellungseigenschaft 'useSystemClassLoaderAsParent' auf 'false' hat keine passende Eigenschaft gefunden erwartet, der 'java.lang.ClassNotFoundException: org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader' war der nächste Fehler. –

+0

Ich benutze tomcat7 auch, aber ich successed.the Frühling-Instrument-tomcat.jar sollte in tomcat/lib.Ich glaube nicht, dass Sie den richtigen Platz.und ich sage, ich benutze die intellij Idee zu entwickeln, ich lege die context.xml im Verzeichnis tomcat7utf8 \ conf \ Catalina \ localhost \ yourwebappnameDirectory \ hier, und zwar vollständig wie folgt: ' ' Web-App nicht in dem tomcat \ webapp Verzeichnis . – flym

+0

Ok, wenn ich dich richtig verstanden habe, schlage ich vor tomcat-instrumental.jar in Tomcat/lib zu speichern, aber das ist genau das, was ich nicht machen will (aber ich habe keine anderen Möglichkeiten, es im Moment funktionieren zu lassen Frage ist, wie man Tomcat/lib unberührt lässt und meine App mit eigenen Bibliotheken zufriedenstellt. –

Verwandte Themen