2010-03-30 93 views
1

我有一个运行在tomcat中的基于mavenized,多模块弹簧(3.0.1)的应用程序。我试图创建一个独立的工具,我可以通过一个jar分发给用户(这样他们只需双击它),该工具捆绑在上述应用程序的一些模块中。创建可插入弹簧应用程序的其他罐子的双击'超级'jar

我已经使用maven-shade-plugin来组装这个罐子。如果我炸开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

执行加载的任何bean是否尝试通过注释加载其他上下文? – 2010-03-30 17:41:02

回答

1

只是一个预感,但它可能是阴影插件覆盖Spring为配置文件中的命名空间使用的元数据。在shade插件的文档中查看merging content of specific files,看它是否可以解决您的问题。

+0

是的。 .xsd文件,更具体地说 – 2010-03-31 07:15:18

1

春天元数据文件似乎被正确复制。出于这个特定原因,我开始使用maven-shade-plugin。 :)

我提高了春季日志到TRACE,这揭示了一些更多的信息(我应该做到这一点开始,哎呀!)。我遇到了一堆例外情况,指出各种.class文件具有无效的Java幻数。

事实证明,问题出在我如何使用maven-dependency-plugin。我的意图是拉动一个.zip工件,解压缩它,并在生成资源阶段将其内容复制到特定的生成目录。一个潜在的问题是我无意中使用了“解压缩依赖”这个目标,这个目标比我想要的更依赖(依赖最终maven-shade-plugin最终会捆绑)。但是,似乎最终解决该问题的是去除了工件项目属性“output-directory”,其中我指定了一个名为“generated-resources”的目录。一旦我删除这个属性,一切都运行顺利。

目前还不清楚为什么.class文件中的幻数被更改/损坏,但至少问题已解决。任何人对于实际发生的事情有任何想法?

感谢您的所有意见!

相关问题