* Added snapshot version resolution using maven-metadata.xml

* moved generated-sources, classes locations etc to target/

* use the correct maven version when generating the pom.properties:
  'BOOTSTRAP' is an illegal version, and causes multiple plugins to
  not run because they require 2.0.2 or newer.


git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@462848 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Kenney Westerhof 2006-10-11 16:44:55 +00:00
parent 591d7948e7
commit 05d91510ad
1 changed files with 85 additions and 25 deletions

110
build.xml
View File

@ -1,4 +1,5 @@
<project default="run-full-maven">
<description>
The first time you build Maven from source, you have to build Maven without Maven.
This Ant script builds a minimal Maven, just enough to re-launch Maven again in this
@ -12,6 +13,7 @@
You can set the maven.repo.local property to specify a custom location for your
local repository for the bootstrap process.
</description>
<target name="isMavenHomeSet">
<property environment="env"/>
<condition property="maven.home" value="${env.M2_HOME}">
@ -20,6 +22,7 @@
<fail unless="maven.home"
message="You must set the M2_HOME environment variable or specify a maven.home property to this Ant script"/>
</target>
<target name="checkMavenHome" depends="isMavenHomeSet">
<basename file="${maven.home}" property="maven.home.basename"/>
<dirname file="${maven.home}" property="maven.home.dirname"/>
@ -33,18 +36,20 @@
</condition>
<fail if="build.failed">
The Maven install destination directory must end with '${maven.home.basename.expected}'.
Your maven.home was = ${maven.home}
Your M2_HOME was = ${maven.home}
We recommend = ${maven.home.recommended}
</fail>
<echo message="maven.home=${maven.home}"/>
</target>
<target name="init" depends="checkMavenHome">
<property name="maven.repo.local" value="${user.home}/.m2/repository"/>
</target>
<target name="clean-bootstrap" description="cleans up generated bootstrap classes">
<delete dir="bootstrap/generated-sources"/>
<delete dir="bootstrap/classes"/>
<delete dir="bootstrap/target"/>
</target>
<!-- DGF TODO Make a simple Java Ant task that pulls dependencies and adds them to a path reference, so we don't have to copy-and-paste -->
<!-- Then again, this *is* a very simple Ant script, so maybe there's no need to get fancy...? -->
<target name="pull" depends="init"
@ -55,18 +60,16 @@
<attribute name="name"/>
<attribute name="version"/>
<sequential>
<get src="http://people.apache.org/repo/m2-snapshot-repository/@{orgpath}/@{version}/@{name}-@{version}.jar"
dest="${maven.repo.local}/@{orgpath}/@{version}/@{name}-@{version}.jar" usetimestamp="true"
ignoreerrors="true"/>
<get src="http://repo1.maven.org/maven2/@{orgpath}/@{version}/@{name}-@{version}.jar"
dest="${maven.repo.local}/@{orgpath}/@{version}/@{name}-@{version}.jar" usetimestamp="true"
ignoreerrors="false"/>
<condition property="build.failed">
<not>
<available file="${maven.repo.local}/@{orgpath}/@{version}/@{name}-@{version}.jar"/>
</not>
</condition>
<fail if="build.failed" message="Couldn't pull dependency @{orgpath}/@{name}/@{version}"/>
<!-- call an ant task to download the artifact. The script cannot be
defined in here, because you cannot re-initialize properties.
Calling the script like this will scope the properties so they can
be re-initialized.
-->
<antcall target="download-artifact" inheritAll="true">
<param name="orgpath" value="@{orgpath}"/>
<param name="name" value="@{name}"/>
<param name="version" value="@{version}"/>
</antcall>
</sequential>
</macrodef>
<pull orgpath="org/codehaus/plexus/plexus-utils" version="1.1" name="plexus-utils"/>
@ -84,11 +87,14 @@
<pull orgpath="org/codehaus/modello/modello-core" version="1.0-alpha-7" name="modello-core"/>
<pull orgpath="org/codehaus/modello/modello-plugin-xml" version="1.0-alpha-8" name="modello-plugin-xml"/>
<pull orgpath="org/codehaus/modello/modello-plugin-xpp3" version="1.0-alpha-8" name="modello-plugin-xpp3"/>
<pull orgpath="junit/junit" version="3.8.1" name="junit"/>
</target>
<target name="classpath-pre" depends="init,pull"
description="constructs a classpath reference containing our dependencies, and verifies that all files are present">
<path id="pre.classpath">
<pathelement location="${maven.repo.local}/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar"/>
<pathelement location="${maven.repo.local}/junit/junit/3.8.1/junit-3.8.1.jar"/>
<pathelement
location="${maven.repo.local}/org/codehaus/plexus/plexus-container-default/1.0-alpha-9/plexus-container-default-1.0-alpha-9.jar"/>
<pathelement location="${maven.repo.local}/commons-cli/commons-cli/1.0/commons-cli-1.0.jar"/>
@ -125,9 +131,13 @@ need different versions of modello. -->
<pathconvert property="pre.classpath.str" refid="pre.classpath" pathsep="&#xa;"/>
<pathconvert property="modello.classpath.str" refid="modello.classpath" pathsep="&#xa;"/>
</target>
<target name="generate-sources" depends="classpath-pre"
description="generates Java sources from Modello mdo model files">
<mkdir dir="bootstrap/generated-sources"/>
description="generates Java sources from Modello mdo model files"
>
<mkdir dir="bootstrap/target"/>
<mkdir dir="bootstrap/target/generated-sources"/>
<macrodef name="modello-single-mode">
<attribute name="file"/>
<attribute name="mode"/>
@ -137,12 +147,13 @@ need different versions of modello. -->
<classpath refid="modello.classpath"/>
<arg file="@{file}"/>
<arg value="@{mode}"/>
<arg file="bootstrap/generated-sources"/>
<arg file="bootstrap/target/generated-sources"/>
<arg value="@{version}"/>
<arg value="false"/>
</java>
</sequential>
</macrodef>
<macrodef name="modello">
<attribute name="file"/>
<attribute name="version" default="1.0.0"/>
@ -153,6 +164,7 @@ need different versions of modello. -->
<modello-single-mode file="@{file}" version="@{version}" mode="xpp3-writer"/>
</sequential>
</macrodef>
<modello file="maven-model/maven.mdo" version="4.0.0"/>
<!-- DGF TODO turn this into a big <apply> task? write a custom task? -->
<modello file="maven-plugin-descriptor/src/main/mdo/lifecycle.mdo"/>
@ -168,7 +180,7 @@ need different versions of modello. -->
<target name="compile-boot" depends="generate-sources" description="compiles the bootstrap sources">
<path id="sources">
<dirset dir=".">
<include name="bootstrap/generated-sources"/>
<include name="bootstrap/target/generated-sources"/>
<include name="*/src/main/*"/>
<include name="maven-reporting/maven-reporting-api/src/main/*"/>
<exclude name="maven-repository-tools/**"/>
@ -176,19 +188,19 @@ need different versions of modello. -->
</dirset>
</path>
<mkdir dir="bootstrap/classes"/>
<javac destdir="bootstrap/classes" debug="on">
<mkdir dir="bootstrap/target/classes"/>
<javac destdir="bootstrap/target/classes" debug="on">
<src refid="sources"/>
<classpath refid="pre.classpath"/>
</javac>
<!-- DGF generating a fake pom.properties so Maven thinks it has a version number -->
<mkdir dir="bootstrap/classes/META-INF/maven/org.apache.maven/maven-core"/>
<echo message="version=BOOTSTRAP"
file="bootstrap/classes/META-INF/maven/org.apache.maven/maven-core/pom.properties"/>
<mkdir dir="bootstrap/target/classes/META-INF/maven/org.apache.maven/maven-core"/>
<echo message="version=${pom.project.version}"
file="bootstrap/target/classes/META-INF/maven/org.apache.maven/maven-core/pom.properties"/>
<path id="maven.classpath">
<pathelement location="bootstrap/classes"/>
<pathelement location="bootstrap/target/classes"/>
<path refid="sources"/>
<path refid="pre.classpath"/>
</path>
@ -205,6 +217,7 @@ need different versions of modello. -->
<arg value="install"/>
</java>
</target>
<target name="maven-assembly" depends="maven-compile"
description="generates the Maven installation assembly using the bootstrap Maven">
<java fork="true" dir="maven-cli" classname="org.apache.maven.cli.MavenCli" failonerror="true">
@ -223,11 +236,13 @@ need different versions of modello. -->
<fail if="build.failed"
message="Assembly task seemed to succeed, but couldn't find assembly file: ${maven.assembly}"/>
</target>
<target name="extract-assembly" depends="init,maven-assembly"
description="extracts the maven assembly into maven.home">
<delete dir="${maven.home}"/>
<unzip src="${maven.assembly}" dest="${maven.home.dirname}"/>
</target>
<target name="run-full-maven" depends="init,extract-assembly"
description="runs the full extracted Maven, now with tests">
<property name="maven.goals" value="clean install"/>
@ -245,4 +260,49 @@ need different versions of modello. -->
<arg line="${maven.goals}"/>
</java>
</target>
<!--
Downloads an artifact, detecting wheter it's a snapshot, and uses the maven-metadata.xml to retrieve
the correct version.
-->
<target name="download-artifact">
<!-- choose the proper repository -->
<condition property="repo" value="http://people.apache.org/repo/m2-snapshot-repository" else="http://repo1.maven.org/maven2">
<contains string="${version}" substring="SNAPSHOT"/>
</condition>
<!-- get the metadata file -->
<get src="${repo}/${orgpath}/${version}/maven-metadata.xml"
dest="${maven.repo.local}/${orgpath}/${version}/bootstrap-maven-metadata.xml" usetimestamp="true"
ignoreerrors="true"
/>
<!-- Replace 'SNAPSHOT' with 'timestamp-buildnumber'. This is ugly but
ant doesn't allow updating of properties.
-->
<xmlproperty file="${maven.repo.local}/${orgpath}/${version}/bootstrap-maven-metadata.xml"/>
<echo file="deleteme.version.properties" message="${version}"/>
<replaceregexp file="deleteme.version.properties"
match="SNAPSHOT"
replace="${metadata.versioning.snapshot.timestamp}-${metadata.versioning.snapshot.buildNumber}"
byline="true"/>
<loadfile srcFile="deleteme.version.properties" property="fileversion"/>
<echo>Resolved version ${fileversion} (given=${version})</echo>
<!-- download the final jar -->
<get src="${repo}/${orgpath}/${version}/${name}-${fileversion}.jar"
dest="${maven.repo.local}/${orgpath}/${version}/${name}-${fileversion}.jar" usetimestamp="true"
ignoreerrors="false"
/>
<condition property="build.failed">
<not>
<available file="${maven.repo.local}/${orgpath}/${version}/${name}-${version}.jar"/>
</not>
</condition>
<fail if="build.failed" message="Couldn't pull dependency ${orgpath}/${name}/${version}"/>
</target>
</project>