Hi I’m starting a new web development project with my team using Hibernate and Spring MVC. We will be building with Maven2 and use the NetBeans IDE. Our past projects have used ant for the build system. We will be using Atlassian Bamboo for our CI server.
My question relates to the best practice for switching between dev/test/qa/production build environments which have different configurations.
More specifically our dev environments require two configurations, a shared server database and a local HSQL DB for offline development. Our test environment also requires the use of HSQL to ensure predictable tests.
I’m trying to find the best approach with Maven to select between these environments, with ant we just used to have <copy> targets which would copy our configuration files from predefined directories prior to the build and rewrite some .properties files.
So far I’ve found that we could possibly utilise maven profiles but not entirely sure what the best approach for this is, currently I’ve only found how to set certain properties using this approach but not found how to specify certain hibernate configurations.
I apologise for my sparse understanding of Maven, we are switching to maven as we’ve found the dependency resolution to remove a huge burden for us.
Thank you for your help and patience.
UPDATE: A simpler way if anyone is interested.
The idea is to combine both the use of profiles with the resources tag. Create seperate folders for each of your target environments and include them in the resources.
<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>
Note, if you wish to have resources that overwrite default resources within a profile you need to include the default resource location within your profile after your override definition like so:
<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>
Profiles are definitely the Maven way of supporting this kind of thing. There’s a page on the Maven site that describes how to build for different environments that seems like it should meet your needs (essentially it uses the Maven AntRun plugin to duplicate what you were doing previously with Ant). I’d probably modify that approach to something like:
Definitely not Maven at it’s prettiest, though.