创建可双击的“uber”jar,它可以插入spring应用程序的其他jar

时间:2010-03-30 17:22:56

标签: java spring exception maven-2

我有一个在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)

非常感谢任何帮助!

2 个答案:

答案 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文件中的幻数被更改/损坏,但至少问题已经解决了。任何人对实际发生的事情都有任何想法吗?

感谢您的所有输入!