You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@maven.apache.org by "Claus, Janek (NIH/NICHD)" <cl...@mail.nih.gov> on 2005/11/05 00:07:02 UTC

How-to for building for different environments

All,

I wanted to give something back to the community. For all of you, who would like to know 
how to structure a web application in a way that it can be build for different 
environments, here is the solution:

I combined several previous posts and my ideas, this application uses different resources 
for different environments (profiles) as well as diffenent filters.

I filter the context.xml for Tomcat and web.xml, but use totally different log4j.xml's for 
the different environments.
In addition I have resources that go unfiltered to all environments (Hibernate 
configuration files).

Create a directory layout similar to this:

app
|
+- src
     |
     +- main
         |
         +- filter
         |   |
         |   +- dev (filter properties for your local development)
         |   |
         |   +- prod (filter props for production)
         |
         +- java
         |
         +- resources
         |   |
         |   +- all (resources for all environments)
         |   |
         |   +- dev
         |   |
         |   +- prod
         |
         +- webapp
         |
         +- webapp-filtered
             |
             +- META-INF (e.g. context.xml)
             |
             +- WEB-INF (e.g. web.xml)

Your pom should look something like this then:

...

   <build>
     <finalName>app</finalName>
     <resources>
        <!-- Resources for all builds. -->
        <resource>
          <directory>src/main/resources/all</directory>
        </resource>
     </resources>
    </build>

   <profiles>
     <!-- Local development environment. -->
     <profile>
       <id>dev</id>
       <activation>
         <activeByDefault>true</activeByDefault>
       </activation>
       <build>
         <resources>
           <resource>
             <directory>src/main/resources/dev</directory>
           </resource>
           <resource>
             <directory>src/main/webapp-filtered</directory>
             <targetPath>../app</targetPath>     <!-- has to be finalName! -->
             <filtering>true</filtering>
           </resource>
         </resources>
         <filters>
           <filter>src/main/filter/dev/context.properties</filter>
           <filter>src/main/filter/dev/web.properties</filter>
         </filters>
       </build>
     </profile>

     <!-- Production. -->
     <profile>
       <id>prod</id>
       <build>
         <resources>
           <resource>
             <directory>src/main/resources/prod</directory>
           </resource>
           <resource>
             <directory>src/main/webapp-filtered</directory>
             <targetPath>../app</targetPath>     <!-- has to be finalName! -->
             <filtering>true</filtering>
           </resource>
         </resources>
         <filters>
           <filter>src/main/filter/prod/context.properties</filter>
           <filter>src/main/filter/prod/web.properties</filter>
         </filters>
       </build>
     </profile>

   </profiles>

...

Would be great if we could use ${pom.build.finalName}! Maybe this is an idea for the Maven 
developers.

Using this you can build your dev app using:
mvn package (since it is the default) or mvn -Pdev package

and your production application using:
mvn -Pprod package

This can be extended. Just add another directory and profile and you're done!

I found this to be a good way of attacking the problem. Feedback is welcome!


Janek



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org


Re: How-to for building for different environments

Posted by Mark Hobson <ma...@gmail.com>.
Hi Janek,

I also use a similar configuration, but I move all the profile-related
files into src/main/profiles, e.g.:

src
|_ main
  |_ filters
    |_ filter.properties
  |_ java
    |_ *.java
  |_ profiles
    |_ default
      |_ filters
        |_ filter.properties
      |_ resources
        |_ ...
    |_ demo
      |_ ...
    |_ live
      |_ ...
  |_ resources
    |_ webapp
      |_ ...
    |_ webapp-filtered
      |_ ...

You can also simplify your pom by using properties, for example here's
mine that uses the above structure:

<project>
	...
	<build>
		<finalName>${profile.finalName}</finalName>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
			</resource>
			<resource>
				<directory>src/main/profiles/${profile.name}/resources</directory>
			</resource>
			<resource>
				<directory>src/main/webapp-filtered</directory>
				<targetPath>../${profile.finalName}</targetPath>
				<filtering>true</filtering>
			</resource>
		</resources>
		<filters>
			<filter>src/main/filters/filter.properties</filter>
			<filter>src/main/profiles/${profile.name}/filters/filter.properties</filter>
		</filters>
	</build>
	
	<profiles>
		<profile>
			<id>default</id>
			<activation>
				<activeByDefault>true</activeByDefault>
			</activation>
			<properties>
				<profile.name>default</profile.name>
				<profile.finalName>app</profile.finalName>
			</properties>
		</profile>
		<profile>
			<id>demo</id>
			<properties>
				<profile.name>demo</profile.name>
				<profile.finalName>ROOT</profile.finalName>
			</properties>
		</profile>
		<profile>
			<id>live</id>
			<properties>
				<profile.name>live</profile.name>
				<profile.finalName>ROOT</profile.finalName>
			</properties>
		</profile>
	</profiles>
	...
</project>

Would be good to decide on a standard and document it on the site.

Cheers,

Mark

On 06/11/05, Brett Porter <br...@gmail.com> wrote:
> Thanks for this Janek.
>
> I'd encourage people to give thier feedback on this, and if possible
> if someone such as Janek could contribute this as an apt document for
> the website under the guides section, it would be much appreciated.
>
> If you'd like to use wiki.apache.org/maven to collaborate on this, you
> are welcome to.
>
> Regards,
> Brett
>
> On 11/5/05, Claus, Janek (NIH/NICHD) <cl...@mail.nih.gov> wrote:
> >
> > All,
> >
> > I wanted to give something back to the community. For all of you, who would like to know
> > how to structure a web application in a way that it can be build for different
> > environments, here is the solution:
> >
> > I combined several previous posts and my ideas, this application uses different resources
> > for different environments (profiles) as well as diffenent filters.
> >
> > I filter the context.xml for Tomcat and web.xml, but use totally different log4j.xml's for
> > the different environments.
> > In addition I have resources that go unfiltered to all environments (Hibernate
> > configuration files).
> >
> > Create a directory layout similar to this:
> >
> > app
> > |
> > +- src
> >      |
> >      +- main
> >          |
> >          +- filter
> >          |   |
> >          |   +- dev (filter properties for your local development)
> >          |   |
> >          |   +- prod (filter props for production)
> >          |
> >          +- java
> >          |
> >          +- resources
> >          |   |
> >          |   +- all (resources for all environments)
> >          |   |
> >          |   +- dev
> >          |   |
> >          |   +- prod
> >          |
> >          +- webapp
> >          |
> >          +- webapp-filtered
> >              |
> >              +- META-INF (e.g. context.xml)
> >              |
> >              +- WEB-INF (e.g. web.xml)
> >
> > Your pom should look something like this then:
> >
> > ...
> >
> >    <build>
> >      <finalName>app</finalName>
> >      <resources>
> >         <!-- Resources for all builds. -->
> >         <resource>
> >           <directory>src/main/resources/all</directory>
> >         </resource>
> >      </resources>
> >     </build>
> >
> >    <profiles>
> >      <!-- Local development environment. -->
> >      <profile>
> >        <id>dev</id>
> >        <activation>
> >          <activeByDefault>true</activeByDefault>
> >        </activation>
> >        <build>
> >          <resources>
> >            <resource>
> >              <directory>src/main/resources/dev</directory>
> >            </resource>
> >            <resource>
> >              <directory>src/main/webapp-filtered</directory>
> >              <targetPath>../app</targetPath>     <!-- has to be finalName! -->
> >              <filtering>true</filtering>
> >            </resource>
> >          </resources>
> >          <filters>
> >            <filter>src/main/filter/dev/context.properties</filter>
> >            <filter>src/main/filter/dev/web.properties</filter>
> >          </filters>
> >        </build>
> >      </profile>
> >
> >      <!-- Production. -->
> >      <profile>
> >        <id>prod</id>
> >        <build>
> >          <resources>
> >            <resource>
> >              <directory>src/main/resources/prod</directory>
> >            </resource>
> >            <resource>
> >              <directory>src/main/webapp-filtered</directory>
> >              <targetPath>../app</targetPath>     <!-- has to be finalName! -->
> >              <filtering>true</filtering>
> >            </resource>
> >          </resources>
> >          <filters>
> >            <filter>src/main/filter/prod/context.properties</filter>
> >            <filter>src/main/filter/prod/web.properties</filter>
> >          </filters>
> >        </build>
> >      </profile>
> >
> >    </profiles>
> >
> > ...
> >
> > Would be great if we could use ${pom.build.finalName}! Maybe this is an idea for the Maven
> > developers.
> >
> > Using this you can build your dev app using:
> > mvn package (since it is the default) or mvn -Pdev package
> >
> > and your production application using:
> > mvn -Pprod package
> >
> > This can be extended. Just add another directory and profile and you're done!
> >
> > I found this to be a good way of attacking the problem. Feedback is welcome!
> >
> >
> > Janek
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
> > For additional commands, e-mail: users-help@maven.apache.org
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
> For additional commands, e-mail: users-help@maven.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org


Re: How-to for building for different environments

Posted by Brett Porter <br...@gmail.com>.
Thanks for this Janek.

I'd encourage people to give thier feedback on this, and if possible
if someone such as Janek could contribute this as an apt document for
the website under the guides section, it would be much appreciated.

If you'd like to use wiki.apache.org/maven to collaborate on this, you
are welcome to.

Regards,
Brett

On 11/5/05, Claus, Janek (NIH/NICHD) <cl...@mail.nih.gov> wrote:
>
> All,
>
> I wanted to give something back to the community. For all of you, who would like to know
> how to structure a web application in a way that it can be build for different
> environments, here is the solution:
>
> I combined several previous posts and my ideas, this application uses different resources
> for different environments (profiles) as well as diffenent filters.
>
> I filter the context.xml for Tomcat and web.xml, but use totally different log4j.xml's for
> the different environments.
> In addition I have resources that go unfiltered to all environments (Hibernate
> configuration files).
>
> Create a directory layout similar to this:
>
> app
> |
> +- src
>      |
>      +- main
>          |
>          +- filter
>          |   |
>          |   +- dev (filter properties for your local development)
>          |   |
>          |   +- prod (filter props for production)
>          |
>          +- java
>          |
>          +- resources
>          |   |
>          |   +- all (resources for all environments)
>          |   |
>          |   +- dev
>          |   |
>          |   +- prod
>          |
>          +- webapp
>          |
>          +- webapp-filtered
>              |
>              +- META-INF (e.g. context.xml)
>              |
>              +- WEB-INF (e.g. web.xml)
>
> Your pom should look something like this then:
>
> ...
>
>    <build>
>      <finalName>app</finalName>
>      <resources>
>         <!-- Resources for all builds. -->
>         <resource>
>           <directory>src/main/resources/all</directory>
>         </resource>
>      </resources>
>     </build>
>
>    <profiles>
>      <!-- Local development environment. -->
>      <profile>
>        <id>dev</id>
>        <activation>
>          <activeByDefault>true</activeByDefault>
>        </activation>
>        <build>
>          <resources>
>            <resource>
>              <directory>src/main/resources/dev</directory>
>            </resource>
>            <resource>
>              <directory>src/main/webapp-filtered</directory>
>              <targetPath>../app</targetPath>     <!-- has to be finalName! -->
>              <filtering>true</filtering>
>            </resource>
>          </resources>
>          <filters>
>            <filter>src/main/filter/dev/context.properties</filter>
>            <filter>src/main/filter/dev/web.properties</filter>
>          </filters>
>        </build>
>      </profile>
>
>      <!-- Production. -->
>      <profile>
>        <id>prod</id>
>        <build>
>          <resources>
>            <resource>
>              <directory>src/main/resources/prod</directory>
>            </resource>
>            <resource>
>              <directory>src/main/webapp-filtered</directory>
>              <targetPath>../app</targetPath>     <!-- has to be finalName! -->
>              <filtering>true</filtering>
>            </resource>
>          </resources>
>          <filters>
>            <filter>src/main/filter/prod/context.properties</filter>
>            <filter>src/main/filter/prod/web.properties</filter>
>          </filters>
>        </build>
>      </profile>
>
>    </profiles>
>
> ...
>
> Would be great if we could use ${pom.build.finalName}! Maybe this is an idea for the Maven
> developers.
>
> Using this you can build your dev app using:
> mvn package (since it is the default) or mvn -Pdev package
>
> and your production application using:
> mvn -Pprod package
>
> This can be extended. Just add another directory and profile and you're done!
>
> I found this to be a good way of attacking the problem. Feedback is welcome!
>
>
> Janek
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
> For additional commands, e-mail: users-help@maven.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org