以前就发现通过eclipse上面的m2e插件不能将spring-asm模块的源代码取下来,从search.maven.org中搜索也发现,并没有提供source.jar,观察spring-asm模块具体的类名发现,它们都是来源于ASM这个项目,后来发现SpringSource官方博客上的这篇文章,Juergen Hoeller说他们基于ASM 2.2.3重新打包了spring-asm,包名变成org.springframework.asm.*,为什么呢?我将这些类都用ASM 2.2.3提供的类还原掉,相应依赖spring-asm模块的代码也更改后,测试没有任何问题。我当时想,Spring是觉得把别人的代码放到自己项目里,感到不好意思,才不提供源代码的吧。
但今天的测试让我发现,spring这样改还是有原因的。在Spring 3特别是3.1版本发布后,java-based的配置得到了极大的增强,而基于注释的这种配置(@Configuration)需要依赖cglib,而cglib依赖asm,于是问题来了,前文提到spring-asm基于asm-2.2.3,这个版本比较古老,而像cglib-2.2则依赖asm-3.1,测试时就发现有些类中的方法找不到。类似:
13:00:21,854 INFO main support.ClassPathXmlApplicationContext:508 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@65faba46: startup date [Tue Mar 06 13:00:21 CST 2012]; root of context hierarchy
13:00:21,917 INFO main xml.XmlBeanDefinitionReader:317 - Loading XML bean definitions from class path resource [prospringintegration/ticket-receiver.xml]
13:00:22,207 INFO main annotation.ClassPathBeanDefinitionScanner:209 - JSR-330 'javax.inject.Named' annotation found and supported for component scanning
Exception in thread "main" java.lang.IllegalStateException: Cannot load configuration class: com.apress.prospringintegration.messaging.rabbitmq.jms.adapter.RabbitmqConfiguration
at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:313)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:197)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:696)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:635)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:452)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:141)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.apress.prospringintegration.messaging.rabbitmq.jms.adapter.TicketReceiverMain.main(TicketReceiverMain.java:26)
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.java:47)
at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.java:30)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:24)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:144)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:116)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)
at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
at org.springframework.context.annotation.ConfigurationClassEnhancer.newEnhancer(ConfigurationClassEnhancer.java:136)
at org.springframework.context.annotation.ConfigurationClassEnhancer.enhance(ConfigurationClassEnhancer.java:109)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:303)
... 7 more
即使我们在classpath下也加入了asm-3.1的依赖,但是在classloader时,先找到的是我们改写的同名类,而不是asm-3.1的jar包中的类,如果是spring自己的重新打包的就没有此问题。
因此SpringSource是考虑到spring-asm给spring-core提供服务的独立性,及容易与asm类名冲突的原因才重新打包的。
另:使用@Configuration时,需要使用javax.inject-1.jar包。
再另:spring中依赖的cglib对应的maven实际上是cglib-nodep,如果我直接依赖cglib的话,org.springframework.scripting.support.ScriptFactoryPostProcessor需要import的net.sf.cglib.asm.Type就会找不到。
再再另:哪些类使用asm?
org.springframework.core.type.classreading.SimpleMetadataReader
org.springframework.scritpting.support.ScriptFactoryPostProcessor
分享到:
相关推荐
spring-cglib-repack-3.1.jar是CGLIB的一个打包版本,包含了必要的类和资源,专为Spring框架定制。 描述中提到,这些jar文件是在构建3.2版本Spring源码项目时可能会缺失的部分,特别是如果你是通过`git clone ...
"spring-cglib-repack-3.2.5.jar"是Spring项目对CGLIB的一个打包版本,方便在阅读源码时直接引入。 其次,"Objenesis"是一个用于创建实例的Java库,尤其适用于无参构造函数的类。在某些情况下,如测试或AOP场景,...
`repack`这个词缀可能表示这些jar文件是经过重新打包的版本,可能是为了适应特定的环境或者修复某些问题。这通常意味着原始的CGlib和Objenesis库已经被调整以更好地与Spring框架集成。 **Spring框架的依赖管理**:...
- **org.springframework.asm-3.0.0.RELEASE**:Spring内部使用的ASM库,用于字节码操作。 - **org.springframework.aspects-3.0.0.RELEASE**:提供与AspectJ的集成支持。 - **org.springframework.beans-3.0.0....
将这两个库一起打包成合集,是为了方便开发者一次性获取并集成到项目中,避免了分别寻找和管理依赖的问题。如果你的项目中需要动态生成类或者需要深度操作字节码,那么Cglib和ASM的组合将是必不可少的工具。 总结...
ASM-all-repackaged.jar.zip是ASM库的一个特殊版本,它包含了所有ASM相关的组件,经过重新打包,方便开发者一次性引入所有必要的依赖。 在Java开发中,ASM库主要应用于以下几个方面: 1. **动态代理**:ASM允许...
- **框架实现**:许多Java框架,如Spring,使用ASM来实现底层的元数据处理和动态类生成。 在使用asm-analysis-3.0.jar时,开发者通常需要将其添加到项目构建路径,以便在运行时能够加载和使用其中的类。同时,理解...
ASM作为一个Java库,其编译后的二进制形式就是JAR文件,而这里提供的"asm-2.2.2-sources.jar"很可能是ASM源代码打包成的JAR格式,以便于用户查看和使用。 在压缩包子文件的名称列表中,有两个文件:"asm-2.2.2-...
Cglib和ASM是Java开发中的两个重要库,主要用于动态代码生成和字节码操作。在Java中,当你需要在运行时创建新类或者增强已有类的功能时,这两个库就能发挥巨大作用。以下是对这两个库及其相关文件的详细解释: **...
- **org.springframework.asm**:Spring独立的ASM程序库,用于字节码操作。 综上所述,Spring框架以其轻量级、非侵入性、控制反转和面向切面编程等特性成为Java企业级开发的重要工具之一。通过提供丰富的模块支持和...
ASM-all-3.1则是ASM库的一个打包版本,包含了所有ASM相关的模块,如核心API、分析器、类适配器等。这个版本的ASM可能支持到Java 6或7,因为更现代的Java版本可能需要更新的ASM版本来处理新的字节码特性。使用"all...
在实际开发中,ASM常用于构建工具(如编译器、打包工具)、动态语言实现(如Groovy、Jython等)、性能分析工具、以及各种框架(如Hibernate、Spring AOP)等。 然而,ASM的学习曲线相对较陡峭,因为涉及到对Java...
这在AOP(面向切面编程)和元编程场景中非常有用,例如在Spring AOP和动态代理中,ASM就起到了关键作用。 总之,ASM-2.2.2.jar.zip是一个包含ASM库2.2.2版本的压缩文件,提供了对Java字节码的深度操作能力,适用于...
这个版本的ASM可能是开发者为了方便分发和管理该库而打包的。 描述中提到的关键词有"asm",这是ASM库的简称,它是一个开源项目,用于生成和解析Java字节码。"2.2.3"是ASM库的版本号,这表示用户或开发者正在寻找或...
`org.springframework.asm`模块引入了ASM库,这是一个轻量级的字节码处理库,Spring使用它来实现某些内部功能,如动态代理和类的元数据提取。 `org.springframework.integration-tests`模块则包含了Spring的集成...
支持简易数据资源管理功能 实现JPA基本数据库操作功能封装 实现基于ASM9,动态生成entity、repository、service、serviceImpl、controller相关.class 可根据库表,一键生成新增、...支持jar打包及docker jib方式打包
例如,在Spring AOP中,就利用ASM来生成代理类以实现切面的织入。此外,ASM也可以用于代码混淆工具,如ProGuard,通过改变类名和方法名来增加代码的安全性。 总的来说,"asm-3.3.1.jar.zip"是一个包含ASM库3.3.1...
在实际项目中,我们需要将ASM Analysis 2.2.1添加到构建系统(如Maven或Gradle)的依赖管理中,以便正确引用和打包。 六、应用场景 ASM Analysis 2.2.1在以下场景中有着广泛的应用: 1. **动态代理**:通过生成...
在Java应用程序和框架中,如Spring、Hibernate等,ASM被广泛用于生成和修改字节码,以实现如AOP(面向切面编程)等功能。ASM库的核心功能包括: 1. **字节码分析**:ASM可以解析已有的Java字节码,帮助开发者理解类...
3. 应用框架:很多Java应用框架,如Spring AOP,可能在底层使用ASM来实现其核心功能,比如动态代理和AOP代理。 在使用ASM之前,开发者需要了解Java字节码的概念,以及如何使用ASM提供的API来操作字节码。ASM提供了...