如何使Tomcat与META-INF/context.xml中定义的TomcatInstrumentableClassLoader一起使用WEB-INF/lib/spring-instrument-tomcat.jar

aka*_*_sh 5 tomcat classloader context.xml load-time-weaving spring-data

我构建了一个简单的应用程序,它在服务器端使用Spring Data 3.1.0.RELEASE和Eclipselink 2.4 - 它托管在Tomcat 7.0.27中.在mywebapp/META-INF/context.xml中,我有Spring类加载器

<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
Run Code Online (Sandbox Code Playgroud)

如果我把spring-instrument-tomcat.jar$TOMCAT_HOME/lib则在Tomcat运行mywebapp很好,但如果我把spring-instrument-tomcat.jar$TOMCAT_HOME/webapps/mywebapp/WEB-INF/lib- Tomcat的,出现异常死亡

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
Run Code Online (Sandbox Code Playgroud)

Context loader参数useSystemClassLoaderAsParent设置false也没有帮助.

我不想在Tomcat中拥有任何(自定义)全局库(在现实生产系统中使用全局库并不容易)因此我试图将所有需要的东西本地化(简单)但是很大的战争档案.有关如何实现这种封装的任何想法?

小智 5

好吧,如果您不想在Tomcat的lib文件夹中使用额外的jar,唯一的选择(仍然有Spring/AspectJ LTW工作)是编辑tomcat的运行脚本以将-javaagent:... instrument.jar添加到其JAVA_OPTS或CATALINA_OPTS ,并删除co​​ntext.xml文件(您将不再需要TomcatInstrumentableClassLoad er).