Book giveaway Hold a chance to win free copy of Pig Design Patterns, just by commenting and sharing! For the contest we have 3 e-copies of Pig Design Patterns, to be given away to 3 lucky winners.How you can win To win your copy of this book, all you need to do is come up with a comment below highlighting the reason why you would like to win this book and share a post about this book with this unique short link on your social media profiles: bit.ly/1iuZCUL Dont forget to drop your email address and the permalink of your social media post in your comment. Note: Social Media post must contain this unique short link: bit.ly/1iuZCULDuration of the contest & selection of winners: The contest is valid till 30th June 2014, and is open to everyone. Winners will be selected on the basis of their comment posted. We just started a new AppEngine Java project using the appengine-maven-plugin and the Eclipse IDE (Juno). We are using the appengine:devserver goal to start the devserver. It basically builds the entire project (compile, test and package) and after that launches the devserver pointing it to the generated webapp directory - which by default is: ${project.build.directory}/${project.build.finalName}The ProblemEvery edit made in the source directory is not recognized unless the server is restarted - neither static content nor newly compiled classes. Which is obvious since the devserver is monitoring only the target directory.It's a very "bureaucratic" and nonproductive development environment - we need to stop and start the server even for a single CSS line change.The DreamAchieve the same productivity level we have when working with dynamic languages based development environment (i.e. Python). Just hit F5 in the browser to see the changes in static files and automatic server reload every time a Java class or descriptor file is compiled/changed.The Solution Using a little Ant-foo, we were able to create a target which synchronizes both directories.Thie snippet below uses the sync Ant task to perform the static content synchronization (lines 1-9). Notice that everything inside src.webapp.dir is sync'ed except for the 3 directories declared in the preserveintarget element. We had to exclude them from the synchronization process because since they only exist in the target directory they'd be deleted otherwise. And finally a second sync to synchronize the compiled classes (lines 11-13).<sync verbose="true" todir="${target.webapp.dir}" includeEmptyDirs="true"> <fileset dir="${src.webapp.dir}" /> <preserveintarget> <!-- Ignore the directories below --> <include name="WEB-INF/lib/**" /> <include name="WEB-INF/classes/**" /> <include name="WEB-INF/appengine-generated/**" /> </preserveintarget></sync><sync verbose="true" todir="${target.webapp.dir}/WEB-INF/classes"> <fileset dir="${basedir}/target/classes" /></sync>Then, we attached it to an Eclipse builder, which is triggered every time a change is made in the project ("Build automatically" flag enabled).The same behavior can be achieved by creating a special maven profile and using a combination of the m2e lifecycle mappings and the maven antrun plugin.Something like this:<profile> <id>m2e</id> <activation> <property> <name>m2e.version</name> </property> </activation> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.7</version> <executions> <execution> <phase>process-classes</phase> <goals> <goal>run</goal> </goals> <configuration> <target> <property name="target.webapp.dir" value="${project.build.directory}/${project.build.finalName}" /> <property name="src.webapp.dir" value="${basedir}/src/main/webapp" /> <sync verbose="true" todir="${target.webapp.dir}" includeEmptyDirs="true"> <fileset dir="${src.webapp.dir}" /> <preserveintarget> <include name="WEB-INF/lib/**" /> <include name="WEB-INF/classes/**" /> <include name="WEB-INF/appengine-generated/**" /> </preserveintarget> </sync>