如何使用Maven父pom/子poms目录结构指向Spring资源?
我有一个Maven父pom和两个子项目。我正在使用Spring,无法获取从child_project_2指向child_project_1中资源的类路径如何使用Maven父pom/子poms目录结构指向Spring资源?,spring,maven,classpath,Spring,Maven,Classpath,我有一个Maven父pom和两个子项目。我正在使用Spring,无法获取从child_project_2指向child_project_1中资源的类路径 parent child_1 - src - main - java - com - company - package1 - app1.java - resources
parent
child_1
- src
- main
- java
- com
- company
- package1
- app1.java
- resources
-config.xml
child_2
- src
- main
- java
- com
- company
- package2
- app2.java
- resources
运行app1.java时,我使用以下命令加载config.xml文件:
ApplicationContext ctx=新的GenericXmlApplicationContext(“src/main/resources/config.xml”)
但是,当我运行app2.java并需要加载config.xml时,我似乎无法获得正确的类路径。使用这个Maven目录结构,我所有使用Spring的子项目如何指向位于child_1/src/main/resources/config.xml的同一个config.xml文件
我在本地机器上尝试了绝对路径。我尝试了从child_2到parent并返回到config.xml的相对路径,以及从child_2/src/main/resources返回到parent并返回到config.xml的相对路径 编辑-根据您的评论,另外:项目1需要是项目2的依赖项(或者创建一个公共模块,使每个模块都依赖于它) 再次编辑-从URL中删除src/main/resources 您正在使用的构造函数的参数是一个资源。试一试
ApplicationContext ctx =
new GenericXmlApplicationContext("classpath:config.xml");
或
我总是使用后者,这可能就是你在这里的意图
使用maven,src/main/resources中的内容将放在类路径上
关于Spring资源是什么的更多信息,尽管现在基本上不相关:
顺便说一句,您应该在IDE中包含spring的源代码并浏览源代码,这就是我所做的,这样可以很容易地了解发生了什么,您只需运行调试器即可
如果您使用IDEA和Maven,这将在IDE中自动提供,只需从Maven窗口选择“下载源代码”。(或者浏览IDEA中的类,在打开类文件时单击“dwonload sources”)src/main/resources是保存源资源的唯一位置。构建JAR时,该目录中的文件将被复制到构建src/main/java文件的JAR中 如果child_1和child_2项目的JAR都在您的类路径上,那么您的代码应该如下所示:
ApplicationContext ctx = new GenericXmlApplicationContext("config.xml");
在我的图表中,当我运行app1.java时,上面两行代码都很好。但是,当从app2.java运行时,我无法获取类路径来查找位于child_1/src/main/resources中的config.xml。因此,我的问题是,我不想复制config.xml并将其放入每个孩子的src/main/resources文件夹中。相反,我希望app[n].java能够从child_1/src/main/resources/config.xml加载config.xml。但是,我无法获得正确的类路径。如果您希望它在两个应用程序中都可用,请创建第三个名为common的模块,并使app1和app2依赖于common(通过将其作为依赖项添加到它们的POM中)。或者您可以使app2依赖于app1。但是你不能让app1和app2相互依赖,这是一个循环依赖(鸡和蛋的问题-哪个先构建?)你关于使用资源的评论修复了它。来自child_2:res=newfilesystemresource(“child_1/src/main/resources/config.xml”);ApplicationContext ctx=新的通用XmlApplicationContext(res);但这并不好,它将您绑定到一个特定的文件位置——一旦您将应用程序打包为jar,它就会停止工作。类加载器资源更具可移植性。。。所以你已经在构建时解决了你的问题。。。但是一旦你把它打包。。你会再次遇到问题的请看我的回答。当您在类路径上标识它时,不需要“src/main/resources”(事实上,这将导致它无法工作)。
ApplicationContext ctx = new GenericXmlApplicationContext("config.xml");