Java 创建可双击的';优步';jar,它可以拉入spring应用程序的其他jar
我有一个在tomcat中运行的mavenized、基于spring的多模块(3.0.1)应用程序。我正在尝试创建一个独立的工具,我可以通过一个jar分发给用户(这样他们就可以双击它),它捆绑在上面提到的应用程序的一些模块中 我已经使用maven shade插件来组装这个罐子。如果我分解jar,它看起来好像所有依赖项都在那里,并且两个spring元数据文件已经从所有单独的spring jar中正确地连接起来。应用程序一直运行,直到我尝试实例化Java 创建可双击的';优步';jar,它可以拉入spring应用程序的其他jar,java,spring,exception,maven-2,Java,Spring,Exception,Maven 2,我有一个在tomcat中运行的mavenized、基于spring的多模块(3.0.1)应用程序。我正在尝试创建一个独立的工具,我可以通过一个jar分发给用户(这样他们就可以双击它),它捆绑在上面提到的应用程序的一些模块中 我已经使用maven shade插件来组装这个罐子。如果我分解jar,它看起来好像所有依赖项都在那里,并且两个spring元数据文件已经从所有单独的spring jar中正确地连接起来。应用程序一直运行,直到我尝试实例化ClassPathXmlApplicationConte
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)
线程“thread-8”java.lang.ArrayIndexOutOfBoundsException中的异常:3350
位于org.springframework.asm.ClassReader。(未知来源)
位于org.springframework.asm.ClassReader。(未知来源)
位于org.springframework.asm.ClassReader。(未知来源)
位于org.springframework.core.type.classreading.SimpleMetadataReader。(SimpleMetadataReader.java:48)
位于org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
位于org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:82)
位于org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
位于org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.checkConfigurationClassCandidate(ConfigurationClassBeanDefinitionReader.java:302)
位于org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:157)
位于org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:132)
位于org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:584)
位于org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:405)
位于org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:139)
位于org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:93)
在com.mycompany.StandaloneTool$2.run(StandaloneTool.java:124)
任何帮助都将不胜感激 这只是一种预感,但可能是shade插件覆盖了Spring在配置文件中用于其名称空间的元数据。查看shade插件的文档,看看它是否解决了您的问题。spring元数据文件似乎复制正确。我开始使用maven shade插件的原因如下: 我将spring日志升级为TRACE,这显示了更多信息(我应该这样做才能开始,哎呀!)。我收到了一堆异常,说各种.class文件都有无效的java幻数 事实证明,问题在于我是如何使用maven依赖插件的。我的意图是在生成资源阶段拉入一个.zip工件,解压缩它,并将其内容复制到一个特定的构建目录。一个潜在的问题是,我无意中使用了“解包依赖项”这一目标,它引入了比我预期的更多的依赖项(最终maven shade插件将捆绑的依赖项)。然而,似乎最终解决了这个问题的是删除了工件项属性“output directory”,其中我指定了一个名为“generated resources”的目录。一旦我搬走了这个房子,一切都很顺利 我不清楚为什么.class文件上的神奇数字被更改/损坏,但至少问题已经解决了。有人知道到底发生了什么吗
感谢所有的投入 您加载的bean中有没有试图通过注释加载其他上下文。更具体地说,是.xsd文件