最近项目中有个同事启用了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。
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里更为简单的声明性事务配置
JavaEE AspectJ基于注解的配置
2.3.4. 对AspectJ装载时织入(AspectJ load-time weaving)的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. 对Websphere 事务管理的完整支持 2.4.3. JPA 2.4.4. 异步的JMS 2.4.5. JDBC ...
要在 Spring 应用中使用 AspectJ 注解, 必须在 classpath 下包含 AspectJ 类库: aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar等jar包,文件已打包上传。
@AspectJ配置Spring AOP,文档,Aspect jar包, 可运行的demo,
本篇文章主要介绍了AndroidStudio 配置 AspectJ 环境实现AOP的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
AOP 例子
aspectj-1.9.6.jar.7z
aspectj-1.7.0.jar aspectj的包
aspectj
Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动
JavaEE AspectJ基于XML的配置
Aop框架AspectJ 的语法介绍JPoint Pointcut Signature
Aspectj开发指南 博文链接:https://g007n.iteye.com/blog/249602
org.aspectj,aspectj项目库(org.aspectj).zip,建筑物
学习aspectJ,帮助学习面向方面的知识。