代码之家  ›  专栏  ›  技术社区  ›  Brett Ryan

为使用maven2的dev/test/qa针对不同的数据库和配置提出一个好的方法?

  •  1
  • Brett Ryan  · 技术社区  · 14 年前

    嗨,我和我的团队使用Hibernate和SpringMVC启动了一个新的Web开发项目。我们将使用Maven2构建并使用NetBeans IDE。我们过去的项目使用了Ant来构建系统。我们将使用Atlassian竹子作为我们的CI服务器。

    我的问题涉及在具有不同配置的dev/test/qa/production构建环境之间切换的最佳实践。

    更具体地说,我们的开发环境需要两种配置,一种是共享服务器数据库,另一种是用于离线开发的本地hsql db。我们的测试环境还需要使用hsql来确保可预测的测试。

    我正在尝试用Maven在这些环境中进行选择的最佳方法,使用我们以前使用的Ant <copy> 在构建之前从预定义目录复制配置文件并重写某些文件的目标 .properties 文件夹。

    到目前为止,我发现我们可以使用maven配置文件,但不完全确定这是什么最好的方法,目前我只找到了如何使用这种方法设置某些属性,但没有找到如何指定某些休眠配置。

    我为我对Maven的理解不多而道歉,因为我们已经找到了解决依赖关系的方法来为我们消除一个巨大的负担。

    谢谢你的帮助和耐心。

    更新 :如果有人感兴趣,这是一个简单的方法。

    其思想是将配置文件的使用与资源标记结合起来。为每个目标环境创建单独的文件夹,并将它们包含在资源中。

    <build>
        <resources>
            <resource>
                <!-- Needs to be here globally for common resources. -->
                <directory>src/main/resources</directory>
            </resource>
        </resources>
        ...
    </build>
    
    <profiles>
        <profile>
            <id>dev</id>
            <build>
                <resources>
                    <resource>
                        <!-- will add anything here to the resources. -->
                        <directory>src/main/resource-overrides/dev</directory>
                    </resource>
                </resources>
            </build>
        </profile>
        <profile>
            <id>qa</id>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/resource-overrides/qa</directory>
                    </resource>
                </resources>
            </build>
        </profile>
        ....
    </profiles>
    

    注意,如果您希望拥有覆盖配置文件中默认资源的资源,则需要在覆盖定义之后在配置文件中包括默认资源位置,如下所示:

    <profile>
        <id>prod</id>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resource-overrides/prod</directory>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                </resource>
            </resources>
        </build>
    </profile>
    
    2 回复  |  直到 12 年前
        1
  •  1
  •   ig0774    14 年前

    配置文件绝对是支持这类事情的独特方式。Maven网站上有一个页面 that describes how to build for different environments 似乎它应该满足你的需要(本质上它使用maven AntRun plugin 复制之前使用Ant所做的操作)。我可能会将这种方法修改为:

    <profile>
     <id>test</id>
     <build>
       <plugins>
         <plugin>
           <artifactId>maven-antrun-plugin</artifactId>
           <executions>
             <execution>
               <phase>process-resources</phase>
               <goals>
                 <goal>run</goal>
               </goals>
               <configuration>
                 <tasks>
                   <delete file="${project.build.outputDirectory}/environment.properties"/>
                   <copy file="src/main/resources/environment.test.properties"
                         tofile="${project.build.outputDirectory}/environment.properties"/>
                 </tasks>
               </configuration>
             </execution>
           </executions>
        </plugin>
       </plugins>
      </build>
     </profile>
    

    不过,这绝对不是最漂亮的。

        2
  •  1
  •   Michael D    14 年前

    如果您的目标是为每个环境构建一个不同的JAR文件副本,其中唯一的区别是资源文件夹中的内容,那么您可以利用 maven-resources-plugin ,并让它从预定义的目录中复制配置文件。

    为了模拟您的设置,我创建了一个包含以下文件的项目:

    • src/main/resources/dev/app.properties
    • src/main/resources/qa/app.properties

    我的目标是在包装好的罐子里:

    • src/main/resources/environment/app.properties

    其中所选目录由名为 environment . 您可以以任何最适合构建系统的方式指定它(例如:作为-d参数、环境变量或使用概要文件)。

    我是如何使用maven资源插件来实现这一点的,方法是将它添加到pom文件中:

    <build>
        <resources>
            <resource>
                <directory>src/main/resources/${environment}</directory>
                <targetPath>src/main/reosurces/environment</targetPath>
            </resource>
        </resources>
    </build>
    

    使用IDEA Maven Runner运行这个,在vm参数中设置-denvironment=dev,我最终得到了“environment”文件夹中文件的“dev”版本。

    我强烈建议您进一步阅读,看看“Maven的更好构建”。这是一本免费的电子书,你可以在上面找到 Maven - External Resources . 处理类路径资源在第2.6节中有介绍(注意-当我尝试时,该页面上的链接不起作用,但最终我从Google的缓存版本获得了电子书)。