我正在使用Eclipse和Maven m2e插件。我的项目使用位于config
下的配置xml文件。 Maven项目布局说你应该把这样的东西放在srv/main/resources
中,这里就麻烦了......
在应用程序中,config
目录相对于项目根目录是硬连线的。我可以以某种方式,甚至可能通过POM,欺骗Eclipse和Maven使软件可以运行,即使这些文件在src/main/resources
中吗?
编辑: Maven布局说只有src,target,pom.xml和一些txt文件在根目录中。但我部署的软件需要在root中配置。如果我的appilcation调用类似新文件(“config / someXml.xml”)的东西,这不太合适。我的软件必须查看config / someXml.xml和src / main / resoruces / config / someXml.xml,具体取决于软件是否已部署或调试。
其他项目如何做到这一点?我是否必须以某种方式更改我的代码以提供目录路径?
答案 0 :(得分:1)
我不确定您要做什么,但您可以在pom的build
元素中指定其他资源目录。
<build>
<resources>
<resource>
<directory>config</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
</resources>
</build>
请注意,它只是将所有文件从config
目录复制到输出目录(默认情况下为target\classes
),因此从构建过程视图来看,它们是否在{ {1}}或config
(只需更多打字)。
答案 1 :(得分:1)
更改申请。您的应用程序不应该知道项目根目录是什么。如果从你分发的jar文件中运行它甚至意味着什么还不清楚。
最常见的做法是将配置文件移动到src/main/resources
或其他任何内容,然后将其加载为classpath resources。
如果您不想这样做,那么使用-D
参数为java提供应用程序的配置目录路径作为系统属性,并查找相对于此的配置文件。在Eclipse中,您可以在启动配置中设置它。在命令行上,您可以在运行应用程序的包装器脚本中进行设置。或者,如果您正在使用应用服务器或其他容器,请使用特定于此的某种机制。
答案 2 :(得分:1)
根据我自己的经验,最常见和最有效的方法是让您的应用程序以预定义的顺序从多个位置解析所需的配置文件,伪代码:
Properties config = null;
// try load config file from pre-defined location, first attempt
config = read("config/config.xml");
// if nothing is here, load config file from classpath, default.
if (config == null)
config = read("src/main/resources/config.xml");
src / main / resources下的config.xml总是带有最终的可执行jar(在jar中),如果config文件夹中没有任何内容,请始终将其用作默认值。所以在开发中,app可以使用src / main / resources / config.xml而不需要关于config / config.xml,当进入部署时,如果出现它将开始使用config / config.xml。
答案 3 :(得分:0)
不知道那是不是你想要实现的目标,但你是否看过maven-resources-plugin
,我认为亚历山大已经说过了?
您可以定义和复制项目运行所需的其他资源, 我引用.. [1]
您可以使用mojo copy-resources复制不在默认maven布局中或未在build / resources元素中声明的资源,并将其附加到阶段
[1] http://maven.apache.org/plugins/maven-resources-plugin/examples/copy-resources.html