clap, clap, clap! Quick and good! Great!
On Wed, May 01, 2002 at 06:19:16PM -0400, Glenn A. McAllister wrote:
>
> <warning-long-email/>
>
> This patch includes the following changes:
>
> 1. Support for adding arbitrary callbacks to a build that follows a
> similar pattern that Jason did for preparing Java source.
>
> 2. Changes to build-j2ee.xml:
>
> 2a: use the new generic callback mechanism
> 2b: use the jars specified by the project dependencies
> 2c: use the nested <manifest> element of the <war> task the way the
> current <jar> targets do
> 2d: create the resulting .war file in the same place as the .jar goes
>
> 3. Fix to build-maven.xml to use the correct ${maven.organization}
> property so the manifest has the correct organization name.
>
> Generic Callbacks
> =================
>
> Jason introduced the concept of a "callback" into a non-maven build file
> for the purposes of giving the Maven user a way to do "something" during
> the build process. Specifically, he introduced a way to prepare source
> code before the actual compilation. I (amongst others I'm sure) *really*
> liked this, and decided to make it easy to add callbacks into a build.
>
> A callback depends on two properties that have to be set by the end user:
>
> maven.callback.<callbackName>.buildFile
> maven.callback.<callbackName>.buildTarget
>
> These are (obviously) the build file and target to call using the <ant>
> task. If either of these attributes are not set, then the callback will
> not be "fired."
>
> The callback target will automatically be passed all of the current
> properties, but it won't be passed references due to a limitation in Ant
> 1.4.1. The "classpath" path (which holds all of a project's dependencies)
> is passed to the target as the property "maven.build.classpath", which can
> be used like
>
> <some_task_that_needs_a_classpath>
> <classpath path="${maven.build.classpath}" />
> </some_task_that_needs_a_classpath>
>
> Adding a Generic Callback
> =========================
>
> To add a callback into a build-*.xml, you need to do the following:
>
> 1) Insert the following lines at the top of your build-*.xml file:
>
> #set( $callbackCategory = "j2ee" )
> #parse("build.init.target")
> #set( $callbackCategory = "" )
>
> (where j2ee is your "category" name)
>
> 2) In your target's depends attribute, do the following to add the
> callback (example taken from build-j2ee.xml):
>
> <target name="war"
> depends="local-init,
> war-error,
> war-init,
> #callback("preprocess-war"),
> war-build,
> #callback("postprocess-war")"
> description="o Create a war file" />
>
> 3) In your Control-*.vm file, adding the following:
>
> callbacks.put( "j2ee", [ "preprocess-war", "postprocess-war" ] );
>
> (where j2ee is your "cateory", and the array are the callback targets you
> want to add to your build).
>
> What the Callbacks look like
> ============================
>
> In your final build-*.xml the targets look like the following (taken from
> build-j2ee.xml) :
>
> <target name="preprocess-war-callback-check">
> <condition property="maven.callback.preprocess-war.ok">
> <not>
> <or>
> <equals arg1="${maven.callback.preprocess-war.buildFile}"
> arg2="$${maven.callback.preprocess-war.buildFile}" />
> <equals arg1="${maven.callback.preprocess-war.buildTarget}"
> arg2="$${maven.callback.preprocess-war.buildTarget}" />
> </or>
> </not>
> </condition>
> </target>
>
> <target name="preprocess-war-callback"
> depends="preprocess-war-callback-check"
> if="maven.callback.preprocess-war.ok">
>
> <ant antfile="${maven.callback.preprocess-war.buildFile}"
> target="${maven.callback.preprocess-war.buildTarget}">
> <property name="maven.build.classpath" value="classpath" />
> </ant>
>
> </target>
>
> And the target that depends on these callback targets looks like the
> following (taken from build-j2ee.xml) :
>
> <target name="war"
> depends="local-init,
> war-error,
> war-init,
> preprocess-war-callback,
> war-build,
> postprocess-war-callback"
> description="o Create a war file" />
>
>
> Glenn McAllister
> SOMA Networks, Inc.
>
Content-Description: j2ee war and callback patch
> Index: src/java/org/apache/maven/BaseProjectTask.java
> ===================================================================
> RCS file:
>/home/cvs/jakarta-turbine-maven/src/java/org/apache/maven/BaseProjectTask.java,v
> retrieving revision 1.8
> diff -u -r1.8 BaseProjectTask.java
> --- src/java/org/apache/maven/BaseProjectTask.java 1 May 2002 16:54:31 -0000
> 1.8
> +++ src/java/org/apache/maven/BaseProjectTask.java 1 May 2002 21:48:29 -0000
> @@ -140,6 +140,7 @@
> context.put("delegators", new HashMap());
> context.put("project", mavenProject);
> context.put("jars", ListTask.getList(listFile));
> + context.put("callbacks", new HashMap());
> return context;
> }
> catch (Exception e)
> Index: src/java/org/apache/maven/ProjectProperties.java
> ===================================================================
> RCS file:
>/home/cvs/jakarta-turbine-maven/src/java/org/apache/maven/ProjectProperties.java,v
> retrieving revision 1.29
> diff -u -r1.29 ProjectProperties.java
> --- src/java/org/apache/maven/ProjectProperties.java 25 Apr 2002 15:51:27 -0000
> 1.29
> +++ src/java/org/apache/maven/ProjectProperties.java 1 May 2002 21:48:30 -0000
> @@ -235,16 +235,21 @@
> private void createClasspathReference()
> {
> Path classpath = new Path(getProject());
> + PatternSet psClasspath = new PatternSet();
>
> for (Iterator i = getMavenProject().getDependencies().iterator();
>i.hasNext();)
> {
> Dependency dependency = (Dependency) i.next();
> +
> Path p = new Path(getProject());
> p.setPath(new File(libRepo, dependency.getJar()).getAbsolutePath());
> +
> classpath.append(p);
> + psClasspath.createInclude().setName(dependency.getJar());
> }
>
> getProject().addReference("classpath", classpath);
> + getProject().addReference("classpath.patternset", psClasspath);
> }
>
> /**
> Index: src/templates/build/Control-j2ee.vm
> ===================================================================
> RCS file: /home/cvs/jakarta-turbine-maven/src/templates/build/Control-j2ee.vm,v
> retrieving revision 1.1
> diff -u -r1.1 Control-j2ee.vm
> --- src/templates/build/Control-j2ee.vm 1 May 2002 16:54:31 -0000 1.1
> +++ src/templates/build/Control-j2ee.vm 1 May 2002 21:48:30 -0000
> @@ -12,3 +12,9 @@
> ## Make the list of build-j2ee.xml delegators
> ## -------------------------------------------------------
> $delegators.put("war","build-j2ee.xml")
> +
> +
> +## -------------------------------------------------------
> +## Make the list of build-j2ee.xml callbacks
> +## -------------------------------------------------------
> +$callbacks.put( "j2ee", [ "preprocess-war", "postprocess-war" ] );
> Index: src/templates/build/Control.vm
> ===================================================================
> RCS file: /home/cvs/jakarta-turbine-maven/src/templates/build/Control.vm,v
> retrieving revision 1.17
> diff -u -r1.17 Control.vm
> --- src/templates/build/Control.vm 1 May 2002 16:54:31 -0000 1.17
> +++ src/templates/build/Control.vm 1 May 2002 21:48:30 -0000
> @@ -1,3 +1,11 @@
> +
> +## -------------------------------------------------------
> +## Macro for adding a callback target name in a build file
> +## -------------------------------------------------------
> +
> +#macro( callback $cbName )
> +${cbName}-callback#end
> +
> ## -------------------------------------------------------
> ## Make our list of build system elements
> ## -------------------------------------------------------
> Index: src/templates/build/build-j2ee.xml
> ===================================================================
> RCS file: /home/cvs/jakarta-turbine-maven/src/templates/build/build-j2ee.xml,v
> retrieving revision 1.3
> diff -u -r1.3 build-j2ee.xml
> --- src/templates/build/build-j2ee.xml 1 May 2002 15:47:58 -0000 1.3
> +++ src/templates/build/build-j2ee.xml 1 May 2002 21:48:30 -0000
> @@ -2,7 +2,9 @@
>
> <project name="$project.id" default="war" basedir="$antBasedir">
>
> +#set( $callbackCategory = "j2ee" )
> #parse("build.init.target")
> +#set( $callbackCategory = "" )
>
> <!-- ================================================================== -->
> <!-- L O C A L I N I T -->
> @@ -11,106 +13,88 @@
> <target name="local-init" depends="init">
> <!-- Pick up tool specific defaults -->
> <property file="${maven.home}/j2ee.properties"/>
> +
> <!-- Check all requirements are available -->
> <condition property="maven.war.ready">
> <and>
> + <not>
> + <equals arg1="${maven.war.name}"
> + arg2="$${maven.war.name}" />
> + </not>
> <available file="${maven.war.src}" type="dir"/>
> <available file="${maven.war.content}" type="dir"/>
> <available file="${maven.war.webxml}" type="file"/>
> </and>
> </condition>
> - <!-- set maven.war.preprocessing if the user has set both properties,
> - maven.war.preprocessBuildFile and maven.war.preprocessTarget
> - -->
> - <condition property="maven.war.preprocessing">
> - <and>
> - <not>
> - <or>
> - <equals arg1="${maven.war.preprocessBuildFile}"
> - arg2="${maven.war.preprocessBuildFile}"/>
> - <equals arg1="${maven.war.preprocessTarget}"
> - arg2="${maven.war.preprocessTarget}"/>
> - <equals arg1="${maven.war.ready}"
> - arg2="${maven.war.ready}"/>
> - </or>
> - </not>
> - </and>
> - </condition>
> - <!-- set maven.war.postprocessing if the user has set both properties,
> - maven.war.postprocessBuildFile and maven.war.postprocessTarget
> - -->
> - <condition property="maven.war.postprocessing">
> - <not>
> - <or>
> - <equals arg1="${maven.war.postprocessBuildFile}"
> - arg2="${maven.war.postprocessBuildFile}"/>
> - <equals arg1="${maven.war.postprocessTarget}"
> - arg2="${maven.war.postprocessTarget}"/>
> - <equals arg1="${maven.war.ready}"
> - arg2="${maven.war.ready}"/>
> - </or>
> - </not>
> - </condition>
> -
> </target>
>
> <target name="war"
> -
>depends="local-init,war-error,war-init,war-preprocess,war-build,war-postprocess"
> + depends="local-init,
> + war-error,
> + war-init,
> + #callback("preprocess-war"),
> + war-build,
> + #callback("postprocess-war")"
> description="o Create a war file" />
> -
> +
> + <target name="war-error" unless="maven.war.ready">
> + <!-- extend this list with requirements as needed -->
> + <fail>
> + +------------------------------------------------------------------------------
> + |
> + | ERROR: One of the required properties for maven:war was not provided.
> + |
> + | Please ensure that the property maven.war.name is defined:
> + |
> + | maven.war.name = ${maven.war.name}
> + |
> + | Please ensure that the following directories exist:
> + |
> + | ${maven.war.src}
> + | ${maven.war.content}
> + |
> + | and the following files:
> + |
> + | ${maven.war.webxml}
> + +------------------------------------------------------------------------------
> + </fail>
> + </target>
> +
> <target name="war-init" if="maven.war.ready">
> - <!-- Create build directories -->
> - <mkdir dir="${maven.build.war}/${maven.war.name}"/>
> - <mkdir dir="${maven.build.war}/${maven.war.name}/META-INF"/>
> - <mkdir dir="${maven.build.war}/${maven.war.name}/WEB-INF"/>
> - <mkdir dir="${maven.build.war}/${maven.war.name}/WEB-INF/classes"/>
> - <mkdir dir="${maven.build.war}/${maven.war.name}/WEB-INF/lib"/>
> + <!-- nothing to do as of yet -->
> </target>
>
> <target name="war-build" if="maven.war.ready">
> + <!-- make sure the source is compiled -->
> <ant antfile="${maven.home}/build-maven.xml" target="compile" />
> +
> + <!-- setup any required resources -->
> <ant antfile="${maven.home}/build-maven.xml" target="jar-resources" />
> - <echo>building for ${maven.war.name}</echo>
> - <war warfile="${maven.build.war}/${maven.war.name}.war"
> +
> + <echo>Building WAR ${maven.war.name}</echo>
> +
> + <war warfile="${build.dir}/${maven.war.name}.war"
> webxml="${maven.war.webxml}">
> <fileset dir="${maven.war.content}"/>
> - <!--<fileset dir="${maven.war.templates}"/> -->
> <lib dir="${lib.repo}">
> - <include name="${maven.war.lib.includes}"/>
> - <exclude name="${maven.war.lib.excludes}"/>
> + <patternset refid="classpath.patternset" />
> </lib>
> <classes dir="${build.dest}">
> <include name="${maven.war.classes.includes}" />
> <exclude name="${maven.war.classes.excludes}" />
> </classes>
> + <manifest>
> + <attribute name="Built-By" value="${user.name}" />
> + <section name="${package}">
> + <attribute name="Specification-Title" value="${id}" />
> + <attribute name="Specification-Version"
>value="${currentVersion}" />
> + <attribute name="Specification-Vendor"
>value="${maven.organization}" />
> + <attribute name="Implementation-Title" value="${package}" />
> + <attribute name="Implementation-Version"
>value="${currentVersion}" />
> + <attribute name="Implementation-Vendor"
>value="${maven.organization}" />
> + </section>
> + </manifest>
> </war>
> </target>
>
> - <target name="war-error" unless="maven.war.ready">
> - <!-- extend this list with requirements as needed -->
> - <echo>
> - One of the required properties for maven:war was not provided.
> - Please ensure that the following directories exist:
> - ${maven.war.src}
> - ${maven.war.content}
> - ------------------------------------------------------------------------
> - and the following files:
> - ${maven.war.webxml}
> - ------------------------------------------------------------------------
> - </echo>
> - </target>
> -
> - <target name="war-preprocess" if="maven.war.preprocessing">
> - <echo>pre processing for ${maven.war.name}</echo>
> - <ant antfile="${maven.war.preprocessBuildFile}"
> - target="${maven.war.preprocessBuildFile}" />
> - </target>
> -
> - <target name="war-postprocess" if="maven.war.postprocessing">
> - <echo>post processing for ${maven.war.name}</echo>
> - <ant antfile="${maven.war.postprocessBuildFile}"
> - target="${maven.war.postprocessTarget}" />
> - </target>
> -
> -
> -</project>
> \ No newline at end of file
> +</project>
> Index: src/templates/build/build-maven.xml
> ===================================================================
> RCS file: /home/cvs/jakarta-turbine-maven/src/templates/build/build-maven.xml,v
> retrieving revision 1.40
> diff -u -r1.40 build-maven.xml
> --- src/templates/build/build-maven.xml 29 Apr 2002 20:03:56 -0000 1.40
> +++ src/templates/build/build-maven.xml 1 May 2002 21:48:30 -0000
> @@ -376,10 +376,10 @@
> <section name="${package}">
> <attribute name="Specification-Title" value="${id}"/>
> <attribute name="Specification-Version" value="${currentVersion}"/>
> - <attribute name="Specification-Vendor" value="${organization}"/>
> + <attribute name="Specification-Vendor" value="${maven.organization}"/>
> <attribute name="Implementation-Title" value="${package}"/>
> <attribute name="Implementation-Version" value="${currentVersion}"/>
> - <attribute name="Implementation-Vendor" value="${organization}"/>
> + <attribute name="Implementation-Vendor" value="${maven.organization}"/>
> </section>
> </manifest>
> </jar>
> Index: src/templates/build/build.init.target
> ===================================================================
> RCS file: /home/cvs/jakarta-turbine-maven/src/templates/build/build.init.target,v
> retrieving revision 1.25
> diff -u -r1.25 build.init.target
> --- src/templates/build/build.init.target 1 May 2002 01:34:46 -0000 1.25
> +++ src/templates/build/build.init.target 1 May 2002 21:48:30 -0000
> @@ -322,3 +322,43 @@
> <delete file="project.xml.${toVersion}"/>
>
> </target>
> +
> + #if ($callbacks.get( $callbackCategory ))
> + #set( $cbPrefix = "${maven" )
> + #set( $cbFile = "buildFile}" )
> + #set( $cbTarget = "buildTarget}" )
> +
> + <!-- ================================================================== -->
> + <!-- C A L L B A C K S -->
> + <!-- ================================================================== -->
> + #foreach( $cbName in $callbacks.get( $callbackCategory ) )
> + #set( $buildFile = "${cbPrefix}.callback.${cbName}.${cbFile}" )
> + #set( $buildTarget = "${cbPrefix}.callback.${cbName}.${cbTarget}" )
> +
> + <target name="${cbName}-callback-check">
> + <condition property="maven.callback.${cbName}.ok">
> + <not>
> + <or>
> + <equals arg1="$buildFile"
> + arg2="$$buildFile" />
> + <equals arg1="$buildTarget"
> + arg2="$$buildTarget" />
> + </or>
> + </not>
> + </condition>
> + </target>
> +
> + <target name="#callback( $cbName )"
> + depends="${cbName}-callback-check"
> + if="maven.callback.${cbName}.ok">
> +
> + <ant antfile="$buildFile"
> + target="$buildTarget">
> + <property name="maven.build.classpath" value="classpath" />
> + </ant>
> +
> + </target>
> +
> + #end
> + #end
> +
> Index: src/templates/build/j2ee.properties
> ===================================================================
> RCS file: /home/cvs/jakarta-turbine-maven/src/templates/build/j2ee.properties,v
> retrieving revision 1.3
> diff -u -r1.3 j2ee.properties
> --- src/templates/build/j2ee.properties 1 May 2002 15:47:22 -0000 1.3
> +++ src/templates/build/j2ee.properties 1 May 2002 21:48:30 -0000
> @@ -3,8 +3,8 @@
> maven.war.src=${src.dir}/webapps
> maven.war.content=${maven.war.src}/${maven.war.name}
> # classes are relative to build.dir
> -maven.war.classes.includes=**/*.class
> -maven.war.classes.excludes=
> +maven.war.classes.includes=**
> +maven.war.classes.excludes=**/package.html
> #jars are relative to lib.repo
> maven.war.lib.includes=*.jar
> maven.war.lib.excludes=
> @@ -13,4 +13,4 @@
> #maven.war.prepareBuildFile=build.xml
> #maven.war.prepareBuildTarget=maven:war:preProcess
> #maven.war.updateBuildFile=build.xml
> -#maven.war.updateBuildTarget=maven:war:postProcess
> \ No newline at end of file
> +#maven.war.updateBuildTarget=maven:war:postProcess
--
There is no limit to what you can do
if you don't care who gets the credit.
- Keynote