最近项目中有个同事启用了AspectJ的Load Time Weaving,通过在Maven中打包部署在Weblogic完全没问题,但是在我的Tomcat 7中无法启动应用的情况,会出现类似“Can't Add Transfomer”以及采用-javaagent:spring-instructment.jar来避免该错误的提示,导致每次出现问题时,只能通过maven打包部署或者事先在代码加入日志来定位问题,极度不爽。
在使用Google大神在StackOverflow上找了一堆文章查看后发现两种解决方案:
1)通过配置在启动tomcat的脚本中配置-javaagent:spring-instrument.jar来解决。spring-instrument.jar在Spring各版本中名称不一样。在项目使用的最新的Spring4.0.2中名称为:spring-instrument-4.0.2.RELEASE.jar。在早期的spring版本中可能是spring-ageng.jar。发现通过设置该属性在tomcat7中完全不起作用。
2)通过将spring-instrument-tomcat-4.0.2.RELEASE.jar的jar包放置在Tomcat安装目录的lib下,同时将context.xml文件,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>
放置在Web项目的root目录(webapp或者WebContent目录,也就是与WEB-INF目录平行)下。在使用Eclipse自带的Server插件可以成功启动项目。
如果放置在TOMCAT安装目录的conf目录的context.xml文件(该文件的配置信息将对Tomcat中所有的web app起作用)中,发现启动项目仍然会出现上述错误。
由于在开发项目的过程中一直sysdeo的Tomcat插件,想通过该插件来启动web项目,发现还是抛出了上述错误。为什么要使用这个插件?因为这个插件比起自身的Eclipse的插件有很多好处,启动快速,不需要发布文件(因为直接加载编译好的class文件),修改文件不重启。经发现tomcat7一直采用自身的WebappClassLoader来加载class文件而不是上述配置的TomcatInstrumentableClassLoader来加载,初步怀疑可能是sysdeo的tomcat插件的DevLoader类实现无法识别上述的配置的类TomcatInstrumentableClassLoader,而采用Tomcat默认的WebappClassLoader类。
查看了DevLoader类的实现发现该类继承了WebappLoader,结合了
《深入剖析Tomcat 》第8章 Loader 这篇文章,发现WebappLoader类中实例化了WebappClassLoader。
现在目标就很明确了,只要让WebappLoader类中采用TomcatInstrumentableClassLoader而不是Tomcat默认的WebappClassLoader。需要将spring-instrument-tomcat-4.0.2.RELEASE.jar包放置在Tomcat安装目录的lib下,否则加载不到TomcatInstrumentableClassLoader类。
下载tomcat7对应版本的源代码,找到WebappLoader类将
private String loaderClass =
"org.apache.catalina.loader.WebappClassLoader";
修改为
private String loaderClass =
"org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader";
,重新编译该类,将该类的class文件替换到Tomcat安装目录下的catalina.jar即可。编译WebappClassLoader需要依赖:
catalina.jar
tomcat-coyote.jar
tomcat-util.jar
tomcat-juli.jar
其中最后一个jar包在bin目录下,而不是在lib目录下。
附件为:apache-tomcat-7.0.52的catalina.jar(WebappLoader.class文件loaderClass属性已更新为org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader)
最后,祝各位喜欢折腾的朋友好运。
分享到:
相关推荐
代理根据名为aop.xml的元文件中包含的AspectJ定义,对被拦截的类进行检测(修改字节码)。 aop.xml文件应位于类路径中,以便代理可以接收。 什么时候需要加载时编织? 当在某些时间(但不是所有时间)都需要方面时...
spring-aspectj-compiletime-weaving 这是一个示例项目,说明了如何在 java 8 环境中结合 spring 使用 aspectj。 UnmanagedClass 类用于说明如何在非托管 bean 中自动装配 bean。
AspectJ提供了一种称为编译时织入(Compile-time Weaving)和加载时织入(Load-time Weaving)的方法来实现切面的插入。编译时织入是在Java源代码被编译成.class文件时完成的,这可以通过使用AspectJ的编译器ajc实现...
此外,书中可能还提到了AspectJ的开发和调试工具,如AspectJ Weaver和LTW(Load-Time Weaving),它们可以帮助开发者在运行时动态地编织切面。 压缩包内的"Manning@2003 - AspectJ In Action.pdf"是该书的电子版,...
AspectJ支持静态织入,可以在编译时就将切面代码整合到目标类中,这使得应用的性能更好,但部署过程可能较为复杂。 **切面(Aspect)与通知(Advice)** 在AOP中,切面是封装了一组相关横切关注点的模块。它由一个...
Table of Contents 前言 1. 简介 1.1. 概览 1.1.1. 使用场景 2. Spring 2.0和 2.5的新特性 ...2.3.4. 对AspectJ装载时织入(AspectJ load-time weaving)的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置
- **LTW(Load-Time Weaving)**:在程序加载时进行织入,适用于无法修改源代码或者无法使用编译时织入的情况。AspectJ的LTW可以通过Java代理机制实现。 - **CTW(Compile-Time Weaving)**:在编译阶段进行织入,...
AspectWeaver 有两种主要模式:一种是LTW(Load-Time Weaving),它在类加载到JVM时进行织入;另一种是AJDT(AspectJ Development Tools)在Eclipse IDE中的支持,可以进行编译时织入。在Spring中,通常会使用LTW ...
JavaEE AspectJ基于注解的配置是Java企业级开发中的一种高级切面编程技术,它允许开发者通过注解来定义切面,实现模块化的代码管理,提高代码的可复用性和可维护性。AspectJ是一种面向切面的编程(AOP)框架,它扩展了...
此外,理解如何在IDE如Eclipse或IntelliJ IDEA中配置AspectJ支持,以便获得更好的开发体验和实时反馈。 总的来说,AspectJ 1.9.6.jar作为Java AOP的重要实现,为开发者提供了一种优雅的方式来管理横切关注点,提高...
AspectJ 是一个强大的面向切面编程(AOP)的开源框架,它允许开发者在Java应用程序中引入额外的关注点,如日志、事务管理、性能监控等,而无需侵入到核心业务逻辑代码中。"aspectj-1.9.6.jar.7z" 文件是一个包含了...
为了使@AspectJ切面生效,需要在Spring配置中启用@AspectJ支持,并扫描包含切面的包。这通常在XML配置中完成: ```xml <aop:aspectj-autoproxy /> ``` 或者在Java配置中: ```java @Configuration @...
在Spring中使用AspectJ,我们通常有两种方式:一种是使用AspectJ的编译时或加载时织入,这需要配置AspectJ的编译器或加载器;另一种是通过Spring的注解驱动的AOP,它利用AspectJ的编译器或 weaving工具来生成代理类...
而加载时织入则是在运行时由类加载器完成切面的织入,这通常需要额外的配置,如使用AspectJ的LTW(Load-Time Weaving)代理。 "AspectJ.rar"这个压缩包可能包含了AspectJ的相关库文件,用于在Spring项目中实现AOP...
3. **LTW(Load-Time Weaving)**:AspectJ Weaver支持加载时织入,无需修改应用服务器配置,即可实现AOP功能,这为基于Java EE的应用提供了便利。 4. **强大的切点表达式(Pointcut Expressions)**:AspectJ提供...
2. **加载时织入(Load-time weaving)**:在JVM加载类时,通过AspectJ的类加载器进行切面织入。 为了在Spring应用中使用AspectJ,我们需要在配置文件中启用AspectJ自动代理,并添加相关的依赖。例如,在Spring XML...
3. **配置AspectJ**:在Spring框架中,需要配置AspectJ的自动代理,使切面生效。 ```xml <aop:aspectj-autoproxy /> ``` **四、AspectJ的应用场景** 1. **日志记录**:在方法调用前后记录日志,便于追踪程序...
在Spring框架中,AspectJ的使用通常分为两种方式:编译时织入(Compile-time weaving)和运行时织入(Runtime weaving)。"aspectjtools.jar"是AspectJ的编译工具,它允许我们在编译阶段就将切面代码与主程序代码...