我有一个在tomcat中运行的mavenized,多模块基于Spring的(3.0.1)应用程序。我正在尝试创建一个独立的工具,我可以通过一个jar分发给用户(所以他们只需双击它),这是上面提到的应用程序的一些模块中的捆绑包。
我使用了maven-shade-plugin来组装这个jar。如果我爆炸了jar,就好像所有的依赖关系都存在,并且两个spring元数据文件已经从所有单独的spring jar中正确连接。应用程序运行,直到我尝试实例化ClassPathXmlApplicationContext
。当用户单击应用程序中的按钮时,将执行以下方法:
public void createAppContext() {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext(springFiles);
}
“springFiles”在类中声明如下:
public final String[] springFiles = { "/applicationContext-beans.xml" };
执行上述方法时,会出现以下错误:
Exception in thread "Thread-8" java.lang.ArrayIndexOutOfBoundsException: 3350 at org.springframework.asm.ClassReader.(Unknown Source) at org.springframework.asm.ClassReader.(Unknown Source) at org.springframework.asm.ClassReader.(Unknown Source) at org.springframework.core.type.classreading.SimpleMetadataReader.(SimpleMetadataReader.java:48) at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80) at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:82) at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76) at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.checkConfigurationClassCandidate(ConfigurationClassBeanDefinitionReader.java:302) at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:157) at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:132) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:584) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:405) at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:93) at com.mycompany.StandaloneTool$2.run(StandaloneTool.java:124)
非常感谢任何帮助!
答案 0 :(得分:1)
只是一个预感,但它可能是阴影插件覆盖Spring在配置文件中使用它的名称空间的元数据。请查看shade插件文档中的merging content of specific files,看看它是否能解决您的问题。
答案 1 :(得分:1)
弹簧元数据文件似乎被正确复制。由于这个特殊原因,我开始使用maven-shade-plugin。 :)
我将弹簧记录增加到TRACE,这显示了一些更多的信息(我应该这样开始,哎呀!)。我得到了一些例外,说各种.class文件都有无效的java魔术数字。
事实证明问题在于我如何使用maven-dependency-plugin。我的目的是引入.zip工件,解压缩它,并在生成资源阶段将其内容复制到特定的构建目录。一个潜在的问题是我无意中使用了目标“unpack-dependencies”,这种目标引入的依赖性超出了我的预期(最终maven-shade-plugin会捆绑的依赖关系)。但是,似乎最终解决问题的是删除了工件项属性“output-directory”,其中我指定了一个名为“generated-resources”的目录。一旦我删除了这个属性,一切都顺利进行。
我不清楚为什么.class文件中的幻数被更改/损坏,但至少问题已经解决了。任何人对实际发生的事情都有任何想法吗?
感谢您的所有输入!