我该如何在maven项目中选择配置文件的位置

时间:2012-03-08 06:33:15

标签: java maven jar maven-assembly-plugin maven-jar-plugin

我正在构建一个依赖于某些配置文件的命令行工具。

在开发方面,我将这些文件放在src/main/resources下,并由getClass().getResourceAsStream("/config-file-name")访问,效果很好。

我选择maven-assembly-plugin来构建具有所有依赖关系的jar。

    <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.myproject.Scheduler</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
               <execution>
                   <id>make-my-jar-with-dependencies</id>
                   <phase>package</phase>
                   <goals>
                       <goal>single</goal>
                   </goals>
               </execution>
            </executions>
    </plugin>       

配置文件都包装在jar中,但我想将它们分开。

所以,我添加以下配置,

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>conf.properties</include>
            </includes>
            <filtering>true</filtering>
            <excludes>
                <exclude></exclude>
            </excludes>
        <targetPath>..</targetPath>             
        </resource>
    </resources>

完成此操作后,配置文件与jar一起使用,而不是包装在jar中。

但我的代码现在无法访问这些文件。

我是否需要更改我在代码中访问文件的方式?

或者我是否应该将这些文件放在src/main/resources/中,任何替代方案?

如果有人知道,请帮忙。

感谢。


更新:最后,我放弃使用maven资源文件,相反,我默认将文件路径设置为与jar相同的路径,除Eclipse抱怨外,一切正常。

由于我想将配置文件从jar中移出,并且不希望它在target / classes文件夹中,所以我使用<targetPath>..</targetPath>将配置文件移动到与jar文件相同的目录。

当我重新生成eclipse项目设置时,Eclipse说:无法在输出文件夹“project / target”中嵌套输出文件夹“project / target / test-classes”。

有人帮帮我吗?

3 个答案:

答案 0 :(得分:0)

您的应用程序无法访问配置文件,因为它不再位于其类路径中。

如果要将配置文件与应用程序的其余部分分开,可能需要查看assembly format。您可能希望使用bin而不是jar-with-dependencies,尽管它在分发和使用方面存在挑战。

答案 1 :(得分:0)

根据属性文件的复杂程度,您可以使用资源插件过滤器功能根据maven配置文件更改值。例如,如果您想拥有一个名为location的属性,您可以定义开发和生产配置文件,然后将值设置为pom中的maven属性(如果您在maven 2上,则设置为profiles.xml): / p>

<properties>
  <my.location>the_real_value</my.location>
</properties>

然后在属性文件中执行此操作:

location=${my.location}

请确保在您的pom中设置过滤,如下所示:

<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
  </resource>
</resources>

构建时,如果查看目标目录并查看该属性文件,则应该看到替换的正确值。

答案 2 :(得分:0)

我终于放弃使用maven资源文件,默认情况下将文件路径设置为与jar相同的路径,除Eclipse抱怨外,一切正常。

(因为我想将配置文件从jar中移出,并且不希望它在target / classes文件夹中,所以我使用..将配置文件移动到与jar文件相同的目录。当我重新生成eclipse项目设置,Eclipse说:无法在输出文件夹“project / target”中嵌套输出文件夹“project / target / test-classes”。)

直到现在我才找到解决方案,似乎是一个日食错误。

现在,我放弃Eclipse,并改为IntelliJ IDEA,它是一个非常好的IDE,特别是与Maven完美集成。我将避免任何机会将eclipse用于任何maven项目。