建议使用Maven2定位dev / test / qa的不同数据库和配置的好方法?

时间:2010-07-13 01:20:01

标签: java hibernate maven-2 configuration

您好我正在与我的团队一起使用Hibernate和Spring MVC开始一个新的Web开发项目。我们将使用Maven2构建并使用NetBeans IDE。我们过去的项目使用ant构建系统。我们将使用Atlassian Bamboo作为CI服务器。

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

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

我正在尝试使用Maven找到最佳方法在这些环境之间进行选择,使用ant我们刚刚使用<copy>目标,这些目标会在构建之前从预定义目录复制配置文件并重写一些{ {1}}个文件。

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

我为我对Maven的稀疏理解道歉,我们正在切换到maven,因为我们已经找到依赖解决方案来消除我们的巨大负担。

感谢您的帮助和耐心。

更新:如果有人有兴趣,这是一种更简单的方式。

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

.properties

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

<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>

2 个答案:

答案 0 :(得分:1)

配置文件绝对是支持此类事情的Maven方式。 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>

尽管如此,绝对不是Maven。                        

答案 1 :(得分:1)

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

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

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

我的目标是在打包的jar中:

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

其中所选目录由名为environment的变量指定。您可以以最适合您的构建系统的方式指定它(即:作为-D参数,环境变量或使用配置文件)

我如何使用maven-resources-plugin来实现这一目的是将其添加到pom文件中:

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

使用IDEA maven runner运行它,在VM Parameters中设置-Denvironment = dev,我最终会在“environment”文件夹中找到该文件的“dev”版本。

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