我有一个带有main方法的spring类。在类里面我试图读取值applicationContext.xml。我的目的是将这个主类与其依赖的jar,属性文件和applicationContext.xml挂钩。
但是当我尝试通过unix命令提示符运行jar文件时,看起来appContext文件没有被加载。
在jar文件中可以看到applicationContext.xml,并且能够看到我的类中的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运行时,不确定为什么它不起作用。请帮助我发表您的意见。
答案 0 :(得分:2)
来自Spring documentation(强调我的)的引用:
请注意,“类路径*:”与Ant样式模式结合使用时,只能在模式启动前至少有一个根目录时可靠地工作,除非实际目标文件驻留在文件系统中。这意味着像“classpath *:*。xml”这样的模式不会从jar文件的根目录中检索文件,而只能从扩展目录的根目录中检索文件。这源于JDK的ClassLoader.getResources()方法中的限制,该方法仅返回传入的空字符串的文件系统位置(指示搜索的潜在根)。
答案 1 :(得分:1)
你是如何获得.jar包的?您是否使用Eclipse导出向导?您可能已将“applicationContext.xml”放在“/ resources”文件夹中。确保在Eclipse中修复“Java Build Path”。删除“/ src / main / resources”文件夹中可能存在的所有排除标记。资源文件夹应该被视为类路径,而不仅仅是.jar包中包含一些xml文件的文件夹。希望有所帮助。
答案 2 :(得分:-1)
我一直在努力解决同样的问题。我可以从Eclipse内部运行我的应用程序,但是当我将它作为可执行jar导出时,它会失败。
我通过以下方式解决了这个问题:
/resources
文件夹上的过滤器。这会导致导出将META-INF
文件夹及其/resources
下的内容放入.jar
文件的顶层。 从应用程序上下文路径中删除所有通配符:
applicationContext = new ClassPathXmlApplicationContext(
"classpath*:META-INF/spring/applicationContext*.xml");
成为
applicationContext = new ClassPathXmlApplicationContext("classpath:META-INF/spring/applicationContext.xml");
我确信这是由于Eclipse环境和我的Windows java环境之间的类加载器存在一些差异。弄清楚如何解决这个问题将是下一个任务。