是否有一种可移植的方式来获取Maven项目中的资源路径?

时间:2011-07-29 16:04:25

标签: java maven-2 maven

我的一个单元测试由测试数据驱动,存储在src/test/resources/testData.txt中。由于Maven会将src/test/resources的内容复制到类路径上的target/test-classes/,因此我可以方便地从类路径中读取该文件,而无需关心其绝对文件名。到目前为止,非常好。

现在我正在尝试使用从远程系统获取的数据更新该文件的一些代码。该代码很少运行,而不是构建的一部分。更新的文件将提交到源存储库。为了附加到文件,我需要知道src/test/resources中原始文件的路径(附加到target/test-classes/中的文件显然不起作用)。

如何以便携方式确定路径?我宁愿不用硬代码src/test/resources/,因为这些目录名实际上可能会改变。此外,如果使用除项目基目录之外的当前工作目录执行,则会中断。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

最好的方法可能是${project.basedir}/src/test/resources。测试资源目录不太可能更改,无论您的工作目录如何,它都将安全地解析为正确的路径。尝试通过属性引用测试资源目录是有问题的,因为可能并且通常是定义了多个测试资源。你怎么知道选哪一个?

答案 1 :(得分:0)

我首选的解决方案是配置surefire插件,以便在测试执行期间将${project.basedir}公开为环境变量。如果需要,单元测试可以从环境中读取该信息。这样可以保留POM中的所有配置,并且如果路径发生变化则不需要更改:

<build>
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            ...
            <configuration>
                ...
                <environmentVariables>
                    <maven.project.basedir>${project.basedir}</maven.project.basedir>
                </environmentVariables>
            </configuration>
        </plugin>
        ...
    </plugins>
</build>

其他解决方案可以使用资源过滤(如Ryan所建议)或配置surefire插件以将${project.basedir}/src/test/resources/添加到类路径中来实现。