2009-09-29 125 views
5

我有一个使用Maven配置的Java Spring项目。由于单元测试及其配置文件的数量快速增加,因此我试图将测试配置集中到一个属性文件(与构建项目时使用的文件相同)。为属性文件指定Java路径

单元测试位于(相对于项目的路径,当然)在树

src/test/java/com (...)

这些测试的资源文件在

src/test/resources(...)

最后,属性文件,其中的资源文件应该读,是在目录

src/main/filters

现在,我有一个JUnit类在那里我指定这样的配置文件位置:


@ContextConfiguration(locations = { "classpath:com/initrode/quartz/SyncManagerJobTest-context.xml"}) 

在配置文件SyncManagerJobTest-context.xml中有一行


<context:property-placeholder location="/src/main/filters/deploy.local.properties"/> 

这导致在属性文件中被从目录中读取。我想阅读的是属性文件,位于src/main/filters下。我尝试使用../../向上遍历目录,但这没有帮助。使用classpath:也没有解决。我可以使用“file:”的绝对路径,但这需要项目中的每个开发人员修改配置,这也不是很好。总之,问题是:如何强制src/test/resources /中的配置文件读取src/main/filters中的属性文件?

还有一个相关的奖励问题:在Java环境中处理文件时,除了“file:”和“classpath:”之外是否还有其他修饰符?

回答

5

如果您指定src/main/filters作为资源位置,Maven会将资源移动到target/classes,并在构建过程中将这些类编译到同一位置。然后你没有相对的路径来处理,因为它们具有相同的根。如果你不这样做,你的filters目录将不会包含在构建中。

更新:当然,您的测试代码被输出到目标/测试类,因此为了简化测试,您可以指定src/main/filters在过程测试资源阶段被复制到target/test-classes。我修改了示例以显示该行为。

如果您还没有这样做,可以使用build-helper-maven-plugin将filters文件夹添加为资源位置。

这样做的配置是这样的:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <version>1.3</version> 
    <executions> 
    <execution> 
     <id>add-resource</id> 
     <phase>process-test-sources</phase> 
     <goals> 
     <goal>add-test-resource</goal> 
     </goals> 
     <configuration> 
     <resources> 
      <resource> 
      <directory>scr/main/filters</directory> 
      </resource> 
     </resources> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
5

对我来说,这听起来有点怪把一个性质src/main/filters文件,如果你不打算使用这个文件称为...过滤。如果这个文件被用作标准测试资源,为什么不把它放在src/test/resources?如果你想过滤一些资源文件,为什么你不这样做,并使用过滤资源?我希望看到类似的东西:

<build> 
    <!-- Filter resources --> 
    <filters> 
    <filter>src/main/filters/my-filter.properties</filter> 
    </filters> 
    <!-- Resources for src/main --> 
    <resources> 
    <resource> 
     <directory>src/main/resources</directory> 
     <filtering>true</filtering> 
    </resource> 
    </resources> 
    <!-- Resources for src/test --> 
    <testResources> 
    <testResource> 
     <directory>src/test/resources</directory> 
     <filtering>true</filtering> 
    </testResource> 
    </testResources> 
</build> 

我可能会错过一些东西,但我认为你在混合一些概念。在你的情况下(如果我正确理解你正在尝试做什么),我会使用maven配置文件和过滤器来管理多个环境部署。看一看:

+0

属性文件的位置可能不是最好的,但我工作的一个现有的项目,我就离开它是.. 我们有三种不同的属性适用于不同的生产环境。在开发应用程序时,有很多属性需要配置,db,ldap等等。拥有两个资源位置意味着必须维护两个属性文件,我认为这并不理想。 感谢您的链接,我会检查他们。 – simon 2009-09-29 11:22:18

+0

我不确定要了解“有两个资源位置”是什么意思,而且这也不是要求。但是,如果你有不同的生产环境,你不必为每个环境管理不同的环境吗?这就是这些链接(以maven的方式)。 – 2009-09-29 12:18:13

+1

@Pascal这是一个好点(+1),但从问题的其他部分我认为OP可能并不意味着Maven意义上的过滤器。所以文件应该放在src/main/resources中。在处理现有的项目结构时,虽然这可能不可行,因此我的解决方法 – 2009-09-29 12:22:29