Skip to content

Instantly share code, notes, and snippets.

@cpeisert
Created September 10, 2012 09:53
Show Gist options
  • Save cpeisert/3690026 to your computer and use it in GitHub Desktop.
Save cpeisert/3690026 to your computer and use it in GitHub Desktop.
plovr Ant build file using ClassFileSet to include transitive deps of org.plovr package in jar file
<?xml version="1.0" encoding="UTF-8"?>
<project name="plovr" basedir="." default="build">
<property file="${basedir}/build.properties" />
<property file="${basedir}/default.build.properties" />
<property name="src.dir" value="${basedir}/src" />
<property name="test.dir" value="${basedir}/test" />
<property name="testdata.dir" value="${basedir}/testdata" />
<property name="www.dir" value="${basedir}/www" />
<property name="demo.dir" value="${www.dir}/demo" />
<property name="lib.dir" value="${basedir}/lib" />
<property name="scripts.dir" value="${basedir}/scripts" />
<property name="build.dir" value="${basedir}/build" />
<property name="classes.dir" value="${build.dir}/classes" />
<property name="build.dir.www" value="${build.dir}/www" />
<property name="build.dir.www.jsdoc" value="${build.dir.www}/jsdoc" />
<property name="javadoc.dir" value="${build.dir.www}/javadoc" />
<property name="closure.dir" value="${basedir}/closure" />
<property name="closure-compiler.dir" value="${closure.dir}/closure-compiler" />
<property name="closure-library.dir" value="${closure.dir}/closure-library" />
<property name="closure-templates.dir" value="${closure.dir}/closure-templates" />
<available file="${build.dir}/plovr.jar"
type="file"
property="jar.present"
/>
<path id="plovr.classpath">
<!-- All jars listed here must also be included in plovr.jar -->
<fileset dir="${lib.dir}" includes="*.jar" />
<fileset dir="${closure-compiler.dir}/lib"
includes="args4j.jar,
json.jar,
jsr305.jar,
protobuf-java.jar"
/>
<fileset dir="${closure-compiler.dir}/build/lib"
includes="rhino.jar"
/>
<fileset dir="${closure-templates.dir}/java/lib"
includes="aopalliance.jar,
guice-3.0.jar,
guice-assistedinject-3.0.jar,
guice-multibindings-3.0.jar,
icu4j-4_8_1_1.jar,
javax.inject.jar"
/>
<pathelement location="${classes.dir}" />
<!-- Include src.dir to include resources, such as modules.soy -->
<pathelement location="${src.dir}" />
</path>
<target name="clean" description="remove all generated files">
<delete dir="${build.dir}" />
<!-- Clean Closure Templates genfiles. -->
<ant dir="${closure-templates.dir}" target="clean" inheritAll="false" />
<!-- No need to clean ${closure-templates.dir}/build or
${closure-compiler.dir}/build because plovr's "compile" target does
not use those directories. It compiles Closure Templates and Closure
Compiler Java files into its own build/classes directory.
-->
</target>
<target name="compile" description="compile Java source code">
<!-- Build intermediate Closure Templates target for its genfiles. -->
<ant dir="${closure-templates.dir}" target="compile" inheritAll="false" />
<ant dir="${closure-compiler.dir}" target="rhino-jarjar" inheritAll="false" />
<mkdir dir="${classes.dir}" />
<javac destdir="${classes.dir}"
classpathref="plovr.classpath"
debug="on"
deprecation="on"
fork="true"
>
<compilerarg value="-Werror"/>
<src path="${src.dir}" />
<src path="${test.dir}" />
<src path="${closure-compiler.dir}/src" />
<src path="${closure-compiler.dir}/gen" />
<src path="${closure-templates.dir}/java/src" />
<src path="${closure-templates.dir}/build/genfiles" />
</javac>
<!-- Move Messages.properties where ScriptRuntime.java expects it. -->
<mkdir dir="${classes.dir}/rhino_ast/java/com/google/javascript/rhino/" />
<copy file="${closure-compiler.dir}/src/com/google/javascript/rhino/Messages.properties"
todir="${classes.dir}/rhino_ast/java/com/google/javascript/rhino/" />
<!-- Move ParserConfig.properties where ParserRunner.java expects it. -->
<copy file="${closure-compiler.dir}/src/com/google/javascript/jscomp/parsing/ParserConfig.properties"
todir="${classes.dir}/com/google/javascript/jscomp/parsing" />
<!-- Include these files to support the "info" command. -->
<mkdir dir="${classes.dir}/revisions"/>
<copy todir="${basedir}/build/classes/revisions/">
<fileset dir="${basedir}/tools/imports/" includes="rev-*" />
</copy>
<exec executable="bash">
<arg value="${basedir}/insert-plovr-revision.sh" />
</exec>
</target>
<target name="test"
depends="jar"
description="run the unit tests">
<junit failureproperty="hasFailingTests"
showoutput="true">
<formatter type="plain" usefile="false" />
<batchtest fork="yes">
<fileset dir="${test.dir}">
<include name="**/*Test.java" />
</fileset>
</batchtest>
<classpath refid="plovr.classpath"></classpath>
</junit>
<fail if="hasFailingTests" />
<ant dir="${testdata.dir}" target="build" />
</target>
<target name="externs">
<mkdir dir="${classes.dir}" />
<exec executable="bash"
output="${classes.dir}/externs_manifest.txt"
failonerror="true">
<arg value="${basedir}/listfiles.sh" />
<arg value="${closure-compiler.dir}/externs" />
</exec>
<mkdir dir="${classes.dir}/contrib" />
<exec executable="bash"
output="${classes.dir}/contrib_externs.txt"
failonerror="true">
<arg value="${basedir}/tools/externs/listcontrib.sh" />
<arg value="${closure-compiler.dir}/contrib/externs" />
<arg value="${classes.dir}/contrib" />
</exec>
</target>
<target name="library">
<mkdir dir="${classes.dir}" />
<exec executable="bash"
output="${classes.dir}/library_manifest.txt"
failonerror="true">
<arg value="${basedir}/listfiles.sh" />
<arg value="${closure-library.dir}/closure/goog" />
</exec>
</target>
<target name="third_party">
<mkdir dir="${classes.dir}" />
<exec executable="bash"
output="${classes.dir}/third_party_manifest.txt"
failonerror="true">
<arg value="${basedir}/listfiles.sh" />
<arg value="${closure-library.dir}/third_party/closure/goog" />
</exec>
</target>
<target name="jar"
depends="compile, externs, library, third_party"
description="build plovr.jar">
<!-- Copy Jakarta-BCEL library to the user's home directory under .ant/lib
to enable the use the Ant type ClassFileSet. -->
<fileset id="bcel.jar.id" dir="${basedir}" includes="lib/bcel*.jar" />
<property name="bcel.jar" refid="bcel.jar.id" />
<available file="${user.home}/.ant/${bcel.jar}"
property="bcel.lib.present" />
<copy file="${bcel.jar}" todir="${user.home}/.ant/lib" />
<fail unless="${bcel.lib.present}"
message="The Jakarta-BCEL library (which is required to create the
plovr jar file) was just copied to your home directory under .ant/lib. Try
executing the jar target again now that the BCEL library is included in the Ant
runtime classpath." />
<mkdir dir="${build.dir}" />
<!-- Unzip jar file dependencies so that the ClassFileSet can select only
the transitive dependencies of the package org.plovr. -->
<unjar dest="${classes.dir}" failonemptyarchive="true">
<fileset dir="${lib.dir}" includes="*.jar" />
<fileset dir="${closure-compiler.dir}/lib"
includes="args4j.jar,
json.jar,
jsr305.jar,
protobuf-java.jar" />
<fileset dir="${closure-templates.dir}/java/lib"
includes="aopalliance.jar,
guice-3.0.jar,
guice-assistedinject-3.0.jar,
guice-multibindings-3.0.jar,
icu4j-core.jar,
javax.inject.jar" />
</unjar>
<!-- Get the transitive dependencies of org.plovr package. -->
<classfileset id="plovr-deps" dir="${classes.dir}">
<rootfileset dir="${classes.dir}" includes="org/plovr/**/*.class" />
<!-- Include Guice classes, which do not show up as dependencies due to
dependency injection. -->
<rootfileset dir="${classes.dir}"
includes="com/google/inject/**/*.class" />
</classfileset>
<jar destfile="${build.dir}/plovr.jar">
<!-- Include transitive dependencies of org.plovr package. -->
<fileset refid="plovr-deps" />
<!-- Copy resources needed for org.plovr package. -->
<fileset dir="${src.dir}">
<include name="org/plovr/**/*.js" />
<include name="org/plovr/**/*.soy" />
</fileset>
<!-- Copy resources needed for org.plovr.docgen package. -->
<fileset dir="${src.dir}">
<include name="org/plovr/docgen/*.soy" />
<include name="org/plovr/docgen/*.css" />
</fileset>
<!-- Copy license file, notice, manifests, rhino Messages.properties,
ParserConfig.properties, contrib externs files, and revision info to
support for the "info" command. -->
<fileset dir="${classes.dir}">
<include name="LICENSE" />
<include name="NOTICE" />
<include name="*.txt" />
<include name="rhino_ast/java/com/google/javascript/rhino/Messages.properties"/>
<include name="com/google/javascript/jscomp/parsing/ParserConfig.properties"/>
<include name="contrib/**/*.js" />
<include name="revisions/rev-*" />
</fileset>
<zipfileset dir="${closure-compiler.dir}/externs/"
includes="**/*.js"
prefix="externs"
/>
<zipfileset dir="${closure-library.dir}/closure/goog/"
includes="**/*.js"
excludes="deps.js"
prefix="closure/goog"
/>
<zipfileset dir="${closure-library.dir}/third_party/closure/goog/"
includes="**/*.js"
excludes="deps.js"
prefix="third_party/closure/goog"
/>
<zipfileset dir="${closure-templates.dir}/javascript/"
includes="soyutils_usegoog.js, soyutils.js"
prefix="soy" />
<zipgroupfileset dir="${closure-compiler.dir}/build/lib"
includes="rhino.jar" />
<manifest>
<attribute name="Main-Class" value="org.plovr.cli.Main" />
</manifest>
</jar>
</target>
<target name="integration-test"
depends="jar"
description="build the jar and run it on localhost:9818">
<echo>Visit http://localhost:9818/compile?id=integration-test</echo>
<java jar="${build.dir}/plovr.jar" fork="true">
<arg value="serve" />
<arg line="--port 9818" />
<arg value="${testdata.dir}/example/integration-test-config.js" />
<arg value="${testdata.dir}/modules/plovr-config.js" />
<jvmarg value="-Xdebug" />
<jvmarg value="-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"/>
</java>
</target>
<target name="test-soyweb-server"
description="run the soyweb server in debug mode on localhost:9811">
<echo>Visit http://localhost:9811/hello</echo>
<java jar="${build.dir}/plovr.jar" fork="true">
<jvmarg value="-Xdebug" />
<jvmarg value="-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"/>
<arg value="soyweb" />
<arg line="--dir ${testdata.dir}/soy-server" />
</java>
</target>
<target name="generate-options-documentation"
description="generate the documentation for ConfigOption.java"
depends="compile">
<mkdir dir="${build.dir.www}" />
<java fork="true"
classname="org.plovr.ConfigOptionDocumentationGenerator"
output="${build.dir.www}/options.html"
failonerror="true"
logerror="true"
>
<classpath refid="plovr.classpath"></classpath>
</java>
</target>
<target name="develop-documentation"
description="run the soyweb server in debug mode to develop docs">
<echo>Visit http://localhost:9811/</echo>
<java jar="${build.dir}/plovr.jar" fork="true">
<jvmarg value="-Xdebug" />
<jvmarg value="-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"/>
<arg value="soyweb" />
<arg line="--template base" />
<arg line="--dir ${www.dir}" />
<arg line="--globals ${basedir}/www-globals.js" />
</java>
</target>
<target name="javadoc"
description="generate HTML Javadoc for the org.plovr Java code"
>
<mkdir dir="${javadoc.dir}" />
<javadoc sourcepath="${src.dir}"
destdir="${javadoc.dir}"
protected="true"
windowtitle="plovr"
classpathref="plovr.classpath"
>
<link href="http://download.oracle.com/javase/6/docs/api/" />
<link href="http://docs.guava-libraries.googlecode.com/git/javadoc/" />
<link href="http://google-gson.googlecode.com/svn/tags/gson-1.7.1/docs/javadocs/" />
<link href="http://closure-compiler.googlecode.com/svn/trunk/javadoc/" />
<link href="http://closure-templates.googlecode.com/svn/trunk/javadoc-complete/" />
</javadoc>
</target>
<!--
This runs plovr such that classfiles from build/classes are loaded before
those in plovr.jar. This way, when developing the documentation generation
logic, there is no need to rebuild plovr.jar as part of the build step.
plovr.jar is included in the classpath only to include resources and
classfiles from jars in the lib directory.
-->
<target name="generate-closure-library-jsdoc"
description="Generates HTML documentation for Closure Library">
<exec executable="bash" failonerror="true">
<arg value="${scripts.dir}/generate-closure-library-jsdoc.sh" />
</exec>
</target>
<target name="serve-prod-documentation"
description="run the soyweb server on plovr.com to serve the docs"
depends="generate-options-documentation, javadoc">
<fail unless="jar.present">
The plovr jar has not been built. Run "ant jar" to build it.
</fail>
<mkdir dir="${build.dir.www}" />
<copy todir="${build.dir.www}">
<fileset dir="${www.dir}" includes="**/*" />
</copy>
<java jar="${build.dir}/plovr.jar"
fork="true"
maxmemory="128m">
<arg value="soyweb" />
<arg line="--template base" />
<arg line="--dir ${build.dir.www}" />
<arg line="--static" />
<arg line="--globals ${basedir}/prod-globals.js" />
</java>
</target>
<target name="run-demo" description="run the demo">
<fail unless="jar.present">
The plovr jar has not been built. Run "ant jar" to build it.
</fail>
<java jar="${build.dir}/plovr.jar"
dir="${demo.dir}"
fork="true"
maxmemory="128m">
<arg value="serve" />
<arg value="${demo.dir}/demo-config.js" />
<arg value="${testdata.dir}/modules/plovr-config.js" />
</java>
</target>
<target name="build" depends="jar" />
<target name="all"
description="build all deliverables for the plovr project"
depends="clean,
jar,
test,
generate-options-documentation,
generate-closure-library-jsdoc,
javadoc"
/>
</project>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment