无法读取应用程序上下文.xml当将 spring 类作为可运行的 jar 执行时



我有一个带有main方法的弹簧类。在类内部,我试图读取值应用程序上下文.xml .我的目的是将这个主类及其依赖的jar,属性文件和applicationContext一起jar.xml 。

但是当我尝试通过 unix 命令提示符运行 jar 文件时,看起来没有加载应用程序上下文文件。

应用程序上下文.xml 在 jar 文件中可见,并且能够看到我的类中的系统输出。用于读取应用程序上下文的代码.xml 是

ApplicationContext context = new ClassPathXmlApplicationContext(
    "classpath*:**/applicationContext.xml");

当我打印上下文时,它给了我以下消息。

org.springframework.context.support.ClassPathXmlApplicationContext@89fbe3: start
up date [Mon Oct 01 15:07:43 IST 2012]; root of context hierarchy

当我尝试打印context.getBeanDefinitionCount() - 它给我0。

但是我能够通过日食成功地完成这一点.它能够读取应用程序上下文.xml并给我的 bean 计数为 13。

不知道为什么当我将其作为罐子运行时它不起作用。请帮助我发表您的评论。

你是如何得到.jar包的?您是否使用了 Eclipse 导出向导?您可能已经将"applicationContext.xml"放在"/resources"文件夹中。确保修复了 Eclipse 中的"Java 构建路径"。删除"/src/main/resources"文件夹中可能存在的所有排除标记。资源文件夹应被视为类路径,而不仅仅是.jar包中包含某些 xml 文件的文件夹。希望有帮助。

引用

Spring 文档(强调我的):

请注意,"classpath*:" 与 Ant 样式模式结合使用时,只有在模式开始之前才能可靠地处理至少一个根目录,除非实际的目标文件驻留在文件系统中。这意味着像"classpath*:*.xml"这样的模式不会从jar文件的根目录中检索文件,而只会从扩展目录的根目录中检索文件。这源于JDK的ClassLoader.getResources()方法中的一个限制,该方法仅返回传入的空字符串的文件系统位置(指示要搜索的潜在根)。

我一直在为同样的问题而苦苦挣扎。 我可以从 Eclipse 内部很好地运行我的应用程序,但是当我将其导出为可执行 jar 时,它失败了。

我通过以下方式解决了这个问题:

  1. 转到 Eclipse 中的构建路径屏幕并删除/resources文件夹上的过滤器。 这会导致导出将META-INF文件夹及其/resources下的内容放入.jar文件的顶层。
  2. 从应用程序上下文路径中删除所有通配符:


    applicationContext = new ClassPathXmlApplicationContext( "classpath*:META-INF/spring/applicationContext*.xml");成为
    applicationContext = new ClassPathXmlApplicationContext("classpath:META-INF/spring/applicationContext.xml");

我确信这是由于Eclipse环境和我的Windows Java环境之间的类加载器存在一些差异。 弄清楚如何解决这个问题将是下一个任务。

最新更新