代码之家  ›  专栏  ›  技术社区  ›  simon

为属性文件指定Java路径

  •  5
  • simon  · 技术社区  · 15 年前

    我有一个JavaSpring项目,配置了Maven。由于单元测试及其配置文件的数量正在迅速增加,我正在尝试将测试配置集中到一个属性文件(同一个属性文件,用于构建项目)。

    单元测试位于树中(当然是相对于项目路径)。

    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下。我试着用.././向上遍历目录,但没用。使用类路径:也不可行。我可以将绝对路径与“文件:”一起使用,但这需要项目中的每个开发人员修改配置,这也不好。

    总的来说,问题是:如何强制src/test/resources/中的配置文件读取src/main/filters中的属性文件?

    和一个相关的附加问题:当在Java环境中处理文件时,是否存在其他修改器而不是“文件”和“类路径”?

    2 回复  |  直到 15 年前
        1
  •  5
  •   Rich Seller    15 年前

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

    更新:当然,测试代码输出到目标/测试类,因此为了简化测试,可以指定 SRC/主/过滤器 被复制到 target/test-classes 在过程测试资源阶段。我已经修改了这个例子来展示这种行为。

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

    这样做的配置如下:

    <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>
    
        2
  •  5
  •   Pascal Thivent    15 年前

    对我来说,把属性文件放进去听起来有点奇怪 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概要文件和过滤器来管理多个环境部署。看一看: