6

我有一个带有 main 方法的 spring 类。在课堂内我试图读取值 applicationContext.xml 。我的意图是将这个主类连同它的依赖 jars、属性文件和 applicationContext.xml 一起打包。

但是当我尝试通过 unix 命令提示符运行 jar 文件时,看起来 applicationContext 文件没有被加载。

applicationContext.xml 可以在 jar 文件中看到,并且能够在我的类中看到 sysouts。用于读取 applicationContext.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。

但我能够通过 eclipse 成功执行此操作。它能够读取 applicationContext.xml 并将 bean 计数为 13。

不知道为什么当我将它作为 jar 运行时它不起作用。请帮助我发表您的意见。

4

3 回答 3

3

您是如何获得 .jar 包的?您是否使用了 Eclipse 导出向导?您可能已将“applicationContext.xml”放在“/resources”文件夹中。确保在 Eclipse 中修复“Java Build Path”。删除“/src/main/resources”文件夹中可能存在的所有排除标签。资源文件夹应该被认为是一个类路径,而不仅仅是 .jar 包中包含一些 xml 文件的文件夹。希望有帮助。

于 2013-02-27T05:58:52.750 回答
2

来自Spring 文档的引用(重点是我的):

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

于 2013-02-28T21:46:46.923 回答
-1

我一直在努力解决同样的问题。我可以在 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 环境之间的类加载器存在一些差异。弄清楚如何解决这个问题将是下一个任务。

于 2014-06-18T17:13:11.737 回答