git-svn-id: https://svn.apache.org/repos/asf/maven/maven-1/plugins/trunk@114929 13f79535-47bb-0310-9956-ffa450edef68
366 lines
15 KiB
XML
366 lines
15 KiB
XML
<?xml version="1.0"?>
|
|
<!--
|
|
/*
|
|
* Copyright 2001-2004 The Apache Software Foundation.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
-->
|
|
|
|
|
|
<!--
|
|
=============================================================================
|
|
AspectWerkz plugin for Maven.
|
|
|
|
Definition: AW supports 2 types of Aspects/Advice/Pointcuts definition:
|
|
- xmldef : Advice are defined as extending *Advice classes (BeforeAdvice,
|
|
AroundAdvice, etc). Custom javadoc attributes can be used to
|
|
link code to weave with advices.
|
|
- attribdef: Advices and pcds are defined purely using custom javadoc
|
|
attributes (@Execute, @Aspect, etc).
|
|
=============================================================================
|
|
-->
|
|
<project
|
|
xmlns:ant="jelly:ant"
|
|
xmlns:j="jelly:core"
|
|
xmlns:u="jelly:util"
|
|
xmlns:define="jelly:define"
|
|
xmlns:aw="aspectwerkz">
|
|
|
|
<!--
|
|
========================================================================
|
|
Init.
|
|
========================================================================
|
|
-->
|
|
<goal name="aspectwerkz:init">
|
|
|
|
<ant:mkdir dir="${maven.build.dir}"/>
|
|
|
|
<!-- Location of the XML definition file. If "xmldef" mode is used, then
|
|
the location of thus file is the location where attributec has
|
|
generated its xml file
|
|
(i.e. ${maven.aspectwerkz.build.definition.file}). If "attribdef"
|
|
mode is used then this property should point to its source
|
|
location. -->
|
|
<j:choose>
|
|
<j:when test="${context.getVariable('maven.aspectwerkz.mode') == 'xmldef'}">
|
|
<j:set var="maven.aspectwerkz.definition.file"
|
|
value="${maven.aspectwerkz.definition.file.build}"/>
|
|
</j:when>
|
|
<j:when test="${context.getVariable('maven.aspectwerkz.mode') == 'attribdef'}">
|
|
<j:set var="maven.aspectwerkz.definition.file"
|
|
value="${maven.aspectwerkz.definition.file.src}"/>
|
|
</j:when>
|
|
<j:otherwise>
|
|
<ant:fail>Valid values for [maven.aspectwerkz.mode] are [xmldef] and [attribdef] only.</ant:fail>
|
|
</j:otherwise>
|
|
</j:choose>
|
|
|
|
<path id="classpath.compile">
|
|
<ant:path refid="maven.dependency.classpath"/>
|
|
<ant:pathelement location="${plugin.getDependencyPath('aspectwerkz:aspectwerkz')}"/>
|
|
</path>
|
|
|
|
<path id="classpath.main">
|
|
<ant:path refid="classpath.compile"/>
|
|
<ant:pathelement location="${plugin.getDependencyPath('dom4j:dom4j')}"/>
|
|
<ant:pathelement location="${plugin.getDependencyPath('xml-apis:xml-apis')}"/>
|
|
<ant:pathelement location="${plugin.getDependencyPath('xerces:xerces')}"/>
|
|
<ant:pathelement location="${plugin.getDependencyPath('trove:trove')}"/>
|
|
</path>
|
|
|
|
<!-- Check if non-production aspects exist -->
|
|
<ant:available property="hasNonProductionAspects"
|
|
file="${maven.aspectwerkz.src.dir}" type="dir"/>
|
|
|
|
</goal>
|
|
|
|
<!--
|
|
========================================================================
|
|
Compile aspect sources.
|
|
========================================================================
|
|
-->
|
|
<goal name="aspectwerkz:compile" prereqs="aspectwerkz:init,java:compile"
|
|
description="Compile AspectWerkz java sources">
|
|
|
|
<!-- If there are non-production aspect sources, compile them -->
|
|
<j:if test="${hasNonProductionAspects}">
|
|
|
|
<ant:mkdir dir="${maven.aspectwerkz.build.dest}"/>
|
|
|
|
<ant:javac destdir="${maven.aspectwerkz.build.dest}"
|
|
excludes="**/package.html"
|
|
debug="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.debug')}"
|
|
deprecation="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.deprecation')}"
|
|
target="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.target')}"
|
|
optimize="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.optimize')}">
|
|
|
|
<ant:src path="${maven.aspectwerkz.src.dir}"/>
|
|
|
|
<ant:classpath>
|
|
<ant:path refid="classpath.compile"/>
|
|
<ant:pathelement path="${maven.build.dest}"/>
|
|
</ant:classpath>
|
|
|
|
<j:if test="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.compilerargs')}">
|
|
<ant:compilerarg line="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.compilerargs')}"/>
|
|
</j:if>
|
|
|
|
<j:if test="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.encoding')}">
|
|
<ant:setProperty name="encoding" value="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.encoding')}"/>
|
|
</j:if>
|
|
|
|
<j:if test="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.executable')}">
|
|
<ant:setProperty name="executable" value="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.executable')}"/>
|
|
</j:if>
|
|
|
|
<j:if test="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.fork')}">
|
|
<ant:setProperty name="fork" value="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.fork')}"/>
|
|
</j:if>
|
|
|
|
<j:if test="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.source')}">
|
|
<ant:setProperty name="source" value="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.source')}"/>
|
|
</j:if>
|
|
|
|
<j:if test="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.verbose')}">
|
|
<ant:setProperty name="verbose" value="${pom.getPluginContext('maven-java-plugin').getVariable('maven.compile.verbose')}"/>
|
|
</j:if>
|
|
</ant:javac>
|
|
|
|
<!-- Copy non java source files -->
|
|
<ant:copy todir="${maven.aspectwerkz.build.dest}">
|
|
<ant:fileset dir="${maven.aspectwerkz.src.dir}">
|
|
<ant:exclude name="**/*.java"/>
|
|
<ant:exclude name="**/*.html"/>
|
|
</ant:fileset>
|
|
</ant:copy>
|
|
|
|
</j:if>
|
|
|
|
</goal>
|
|
|
|
<!--
|
|
========================================================================
|
|
Compile javadoc attributes and generate an XML definition file. Used
|
|
only in xmldef mode.
|
|
========================================================================
|
|
-->
|
|
<goal name="aspectwerkz:attributec" prereqs="aspectwerkz:init"
|
|
description="Compile AspectWerkz javadoc attributes (xml-defined aspects)">
|
|
|
|
<j:if test="${context.getVariable('maven.aspectwerkz.mode') == 'xmldef'}">
|
|
|
|
<ant:echo>WARNING: aspectwerkz:attributec is not currently working very well...</ant:echo>
|
|
|
|
<!-- TODO: only run attributeC if sources are newer than target
|
|
XML definition file -->
|
|
|
|
<ant:java dir="${maven.build.dir}" failonerror="true" fork="true"
|
|
classname="org.codehaus.aspectwerkz.metadata.AttributeC">
|
|
|
|
<ant:sysproperty key="aspectwerkz.definition.validate"
|
|
value="${maven.aspectwerkz.definition.validate}"/>
|
|
|
|
<!-- TODO: Use ${maven.compile.src.set} and ${maven.aspectwerkz.src.dir}.
|
|
See aspectwerkz:aspectc for an example. However, I need to verify
|
|
if attributec supports several input directories first -->
|
|
<ant:arg file="${maven.aspectwerkz.src.dir}"/>
|
|
|
|
<ant:arg file="${maven.aspectwerkz.definition.file}"/>
|
|
<j:if test="${context.getVariable('maven.aspectwerkz.definition.file.merge') != null}">
|
|
<ant:arg line="-m ${maven.aspectwerkz.definition.file.merge}"/>
|
|
</j:if>
|
|
<j:if test="${context.getVariable('maven.aspectwerkz.uuid') != null}">
|
|
<ant:arg line="-u ${maven.aspectwerkz.uuid}"/>
|
|
</j:if>
|
|
|
|
<ant:classpath>
|
|
<ant:path refid="classpath.main"/>
|
|
<ant:pathelement location="${plugin.getDependencyPath('qdox:qdox')}"/>
|
|
<ant:pathelement location="${plugin.getDependencyPath('jrexx:jrexx')}"/>
|
|
</ant:classpath>
|
|
|
|
</ant:java>
|
|
|
|
</j:if>
|
|
|
|
</goal>
|
|
|
|
<!--
|
|
========================================================================
|
|
Parse files for custom javadoc tags (attribef mode only) and weave
|
|
them in the bytecode of the aspects themselves.
|
|
========================================================================
|
|
-->
|
|
<goal name="aspectwerkz:aspectc" prereqs="aspectwerkz:compile">
|
|
|
|
<j:if test="${context.getVariable('maven.aspectwerkz.mode') == 'attribdef'}">
|
|
|
|
<!-- TODO: only run aspectc if sources are newer than target
|
|
XML definition file -->
|
|
|
|
<!-- Transforming Ant path structure into a list of dirs that can be used
|
|
to define an Ant fileset. We're using <pathconvert> to automatically
|
|
separate dirs with a known delimiter independently of any
|
|
platform -->
|
|
<ant:pathconvert property="compileSrcSetString" pathSep="||||"
|
|
refid="maven.compile.src.set"/>
|
|
<u:tokenize var="srcDirs" delim="||||">${compileSrcSetString}</u:tokenize>
|
|
|
|
<!-- Parse all known source directories -->
|
|
<j:forEach var="srcDir" items="${srcDirs}">
|
|
<aw:aspectc javaSrc="${srcDir}" classSrc="${maven.build.dest}"/>
|
|
</j:forEach>
|
|
|
|
<!-- Parse non-production aspects if source directory has been defined -->
|
|
<j:if test="${hasNonProductionAspects}">
|
|
<aw:aspectc javaSrc="${maven.aspectwerkz.src.dir}"
|
|
classSrc="${maven.aspectwerkz.build.dest}"/>
|
|
</j:if>
|
|
|
|
<!-- AspectC currently has a bug in that it creates a java.lang.Object
|
|
class file in the output directory. Until this is fixed, we need to
|
|
remove that files. Otherwise, AspectWerkc will try to instrument it,
|
|
which will lead to an error... -->
|
|
<ant:delete file="${maven.aspectwerkz.aspectc.build.dir}/java/lang/Object.class"/>
|
|
|
|
</j:if>
|
|
|
|
</goal>
|
|
|
|
<!--
|
|
========================================================================
|
|
Weave aspects at build time (offline mode). Works for both "xmldef"
|
|
and "attribdef" modes.
|
|
========================================================================
|
|
-->
|
|
<goal name="aspectwerkz:weave"
|
|
prereqs="aspectwerkz:attributec,aspectwerkz:aspectc"
|
|
description="Weave aspects (offline mode)">
|
|
|
|
<!-- TODO: Add support for extension classes -->
|
|
|
|
<!-- Create a path for the -cp parameter of the AspectWerkzC class -->
|
|
<ant:path id="aspectwerkzc.cp">
|
|
<!-- Search for aspect libraries to weave to the source code. These are
|
|
defined as dependencies in project.xml -->
|
|
<j:forEach var="artifact" items="${pom.artifacts}">
|
|
<j:set var="dep" value="${artifact.dependency}"/>
|
|
<j:if test="${dep.getProperty('aspectwerkz.library') == 'true'}">
|
|
<ant:pathelement location="${artifact.path}"/>
|
|
</j:if>
|
|
</j:forEach>
|
|
</ant:path>
|
|
<ant:property name="aspectwerkzcp" refid="aspectwerkzc.cp"/>
|
|
|
|
<ant:java dir="${maven.build.dir}" failonerror="true" fork="true"
|
|
classname="org.codehaus.aspectwerkz.compiler.AspectWerkzC">
|
|
|
|
<j:if test="${context.getVariable('maven.aspectwerkz.verbose') == 'true'}">
|
|
<ant:sysproperty key="aspectwerkz.transform.verbose" value="true"/>
|
|
</j:if>
|
|
|
|
<ant:sysproperty key="aspectwerkz.classloader.preprocessor"
|
|
value="${maven.aspectwerkz.classloader.preprocessor}"/>
|
|
|
|
<ant:sysproperty key="aspectwerkz.transform.filter"
|
|
value="${maven.aspectwerkz.transform.filter}"/>
|
|
|
|
<ant:sysproperty key="aspectwerkz.definition.file"
|
|
value="${maven.aspectwerkz.definition.file}"/>
|
|
|
|
<ant:arg value="-verify"/>
|
|
<ant:arg value="-haltOnError"/>
|
|
|
|
<j:if test="${!empty(aspectwerkzcp)}">
|
|
<ant:arg value="-cp"/>
|
|
<ant:arg path="${aspectwerkzcp}"/>
|
|
</j:if>
|
|
|
|
<!-- If using the attribdef mode, weave classes generated by aspectc -->
|
|
<j:if test="${context.getVariable('maven.aspectwerkz.mode') == 'attribdef'}">
|
|
<ant:arg file="${maven.aspectwerkz.aspectc.build.dir}"/>
|
|
</j:if>
|
|
|
|
<!-- TODO: Add support for xmldef mode -->
|
|
|
|
<ant:classpath>
|
|
<ant:path refid="classpath.main"/>
|
|
<ant:pathelement location="${plugin.getDependencyPath('ant:ant')}"/>
|
|
<ant:pathelement location="${plugin.getDependencyPath('aspectwerkz:aspectwerkz-core')}"/>
|
|
<ant:pathelement location="${plugin.getDependencyPath('bcel:bcel')}"/>
|
|
<ant:pathelement location="${plugin.getDependencyPath('jrexx:jrexx')}"/>
|
|
<ant:pathelement location="${plugin.getDependencyPath('commons-jexl:commons-jexl')}"/>
|
|
</ant:classpath>
|
|
|
|
</ant:java>
|
|
|
|
<!-- Copy weaved classes to target directory -->
|
|
<ant:mkdir dir="${maven.aspectwerkz.weave.build.dir}"/>
|
|
<j:if test="${context.getVariable('maven.aspectwerkz.mode') == 'attribdef'}">
|
|
<ant:copy todir="${maven.aspectwerkz.weave.build.dir}">
|
|
<ant:fileset dir="${maven.aspectwerkz.aspectc.build.dir}"/>
|
|
</ant:copy>
|
|
</j:if>
|
|
|
|
</goal>
|
|
|
|
<!--
|
|
========================================================================
|
|
Custom tag library for factorizing common actions that need to be
|
|
executed several times in this script.
|
|
========================================================================
|
|
-->
|
|
<define:taglib uri="aspectwerkz">
|
|
|
|
<!--
|
|
@param javaSrc source directory that will be parsed
|
|
@param classSrc path where compiled sources are located
|
|
-->
|
|
<define:tag name="aspectc">
|
|
|
|
<ant:echo>Parsing [${javaSrc}] using [${classSrc}] ...</ant:echo>
|
|
|
|
<ant:mkdir dir="${maven.aspectwerkz.aspectc.build.dir}"/>
|
|
|
|
<ant:java dir="${maven.build.dir}" failonerror="true" fork="true"
|
|
classname="org.codehaus.aspectwerkz.attribdef.definition.AspectC">
|
|
|
|
<j:if test="${context.getVariable('maven.aspectwerkz.verbose') == 'true'}">
|
|
<ant:arg value="-verbose"/>
|
|
</j:if>
|
|
|
|
<!-- Path to source dir -->
|
|
<ant:arg file="${javaSrc}"/>
|
|
|
|
<!-- Path to classes dir -->
|
|
<ant:arg file="${classSrc}"/>
|
|
|
|
<!-- (optional) Path to where aspectc result will be put -->
|
|
<ant:arg file="${maven.aspectwerkz.aspectc.build.dir}"/>
|
|
|
|
<ant:classpath>
|
|
<ant:path refid="classpath.main"/>
|
|
<ant:pathelement location="${plugin.getDependencyPath('aspectwerkz:aspectwerkz-core')}"/>
|
|
<ant:pathelement location="${plugin.getDependencyPath('qdox:qdox')}"/>
|
|
<ant:pathelement location="${plugin.getDependencyPath('bcel:bcel')}"/>
|
|
</ant:classpath>
|
|
|
|
</ant:java>
|
|
|
|
</define:tag>
|
|
|
|
</define:taglib>
|
|
|
|
</project>
|