Java νλ‘μ νΈμμ 체κ³μ μΈ λΉλ λ²νΈ λ§€κΈ°κΈ° λ° λ²μ λ²νΈ κ΄λ¦¬μ λν νμ¬ λͺ¨λ² μ¬λ‘λ 무μμ λκΉ? ꡬ체μ μΌλ‘ νΉλ³ν:
-
λΆμ° κ°λ° νκ²½μμ λΉλ λ²νΈλ₯Ό 체κ³μ μΌλ‘ κ΄λ¦¬νλ λ°©λ²
-
μμ€μμ λ²μ λ²νΈλ₯Ό μ μ§ λ³΄μνλ λ°©λ² / λ°νμ μ ν리μΌμ΄μ μμ μ¬μ© κ°λ₯ν λ°©λ²
-
μμ€ λ¦¬ν¬μ§ν 리μ μ¬λ°λ₯΄κ² ν΅ν©νλ λ°©λ²
-
λ²μ λ²νΈμ μ μ₯μ νκ·Έλ₯Όλ³΄λ€ μλμΌλ‘ κ΄λ¦¬νλ λ°©λ²
-
μ§μμ μΈ λΉλ μΈνλΌμ ν΅ν©νλ λ°©λ²
μ¬μ© κ°λ₯ν λ§μ λκ΅¬κ° μμΌλ©° κ°λ―Έ (μ°λ¦¬κ° μ¬μ©νλ λΉλ μμ€ν )μλ λΉλ λ²νΈλ₯Ό μ μ§ κ΄λ¦¬νλ μμ μ΄ μμ§λ§ CVS, svn λλ μ΄μ μ μ¬ν κ²μ μ¬μ©νμ¬ μ¬λ¬ λͺ μ λμ κ°λ°μμ ν¨κ» κ΄λ¦¬νλ λ°©λ²μ λͺ ννμ§ μμ΅λλ€ .
[νΈμ§νλ€]
λͺ κ°μ§ μ’κ³ μ μ©ν λΆλΆ λλ ꡬ체μ μΈ λ΅λ³μ΄ μλμ λμ μμΌλ―λ‘ κ·Έ μ€ μΌλΆλ₯Ό μμ½νκ² μ΅λλ€. μ΄κ²μ λν κ°λ ₯ν βλͺ¨λ² μ¬λ‘βκ° μλλΌ μ€λ³΅λλ μμ΄λμ΄ λͺ¨μμ΄μλ κ²μ²λΌ λ€λ¦½λλ€. μλμμ λ΄ μμ½κ³Ό μ¬λλ€μ΄ νμ μ‘°μΉλ‘ λ΅λ³μ μλ ν μμλ λͺ κ°μ§ κ²°κ³Όμ μΈ μ§λ¬Έμ μ°ΎμΌμμμ€. [μ€ν μ€λ²νλ‘κ° μ²μμ λλ€ β¦μ΄ μμ μ μλͺ»νλ©΄ μ견μ 보λ΄μ£Όμμμ€.]
-
SVNμ μ¬μ©νλ κ²½μ° νΉμ μ²΄ν¬ μμμ λ²μ κ΄λ¦¬κ° μ 곡λ©λλ€. λΉλ λ²νΈ λ§€κΈ°κΈ°λμ΄λ₯Ό μ΄μ©νμ¬ νΉμ μ²΄ν¬ μμ / μμ μ μλ³νλ κ³ μ ν λΉλ λ²νΈλ₯Ό λ§λ€ μ μμ΅λλ€. [μ°λ¦¬κ° λ κ±°μ μ΄μ λ‘ μ¬μ©νκ³ μλ CVSλ μ΄λ¬ν μμ€μ ν΅μ°°λ ₯μ μ 곡νμ§ μμ΅λλ€. νκ·Έλ₯Ό μ¬μ©νμ¬ μλμΌλ‘ κ°μ νλ©΄ λμμ΄λ©λλ€.]
-
mavenμ λΉλ μμ€ν μΌλ‘ μ¬μ©νλ κ²½μ° SCMμμ λ²μ λ²νΈλ₯Ό μμ±νκ³ λ¦΄λ¦¬μ€λ₯Ό μλμΌλ‘ μμ±νκΈ°μν λ¦΄λ¦¬μ€ λͺ¨λμ΄ μ§μλ©λλ€. [μ°λ¦¬λ μ¬λ¬ κ°μ§ μ΄μ λ‘ mavenμ μ¬μ©ν μ μμ§λ§ μ΄κ²μ κ°λ₯ν μ¬λλ€μκ² λμμ΄λ©λλ€. [ λ§λ₯΄μ²Όλ‘ μ¬κΈ° κ°μ¬ν©λλ€ ]]
-
λΉμ μ΄ μ¬μ©νλ κ²½μ° κ°λ―Έλ₯Ό λΉλ μμ€ν μΌλ‘, λ€μκ³Ό κ°μ μμ μ€λͺ μΊ λμμ μ¬λ¬ κ°μ§ λ°©λ²μΌλ‘ λΉλλ‘ μ μ μμλ Java .propertiesμ νμΌ μΊ‘μ² λΉλ μ 보λ₯Ό μμ°νκ³ μμ΅λλ€. [μ°λ¦¬λ marty-lamb λλΆμ hudson νμ μ 보λ₯Ό ν¬ν¨νλλ‘μ΄ μμ΄λμ΄λ₯Ό νμ₯νμ΅λλ€ ].
-
Ant λ° Maven (λ° hudson λ° cruise 컨νΈλ‘€)μ λΉλ λ²νΈλ₯Ό .properties νμΌ λλ .txt / .html νμΌλ‘ κ°μ Έ μ€λ μ¬μ΄ λ°©λ²μ μ 곡ν©λλ€. μ΄ βμμ νβλΆλΆμ΄ μλμ μΌλ‘ λλ μ€μλ‘ λ³μ‘°λμ§ μλλ‘νκΈ°μ μΆ©λΆν©λκΉ? λΉλμ βversioningβν΄λμ€λ‘ μ»΄νμΌνλ κ²μ΄ λ λ«μ΅λκΉ?
-
μ£Όμ₯ : λΉλ λλ²λ§μ hudson κ³Ό κ°μ μ§μμ μΈ ν΅ν© μμ€ν μμ μ μ / μ μ λμ΄μΌν©λλ€ . [ marcelo-morales μκ² κ°μ¬λ립λλ€. ] μ°λ¦¬λμ΄ μ μμ λ°μμ§λ§, λ¦΄λ¦¬μ¦ μμ§λμ΄λ§ μ§λ¬Έμ 곡κ°ν©λλ€ : 릴리μ¦λ μ΄λ»κ² μ΄λ£¨μ΄ μ§λκΉ? 릴리μ€μ μ¬λ¬ λΉλ λ²νΈκ° μμ΅λκΉ? λ€λ₯Έ 릴리μ€μ λΉλ λ²νΈ κ°μλ μλ―Έμλ κ΄κ³κ° μμ΅λκΉ?
-
μ§λ¬Έ : λΉλ λ²νΈμ λͺ©νλ 무μμ λκΉ? νμ§ κ΄λ¦¬μ μ¬μ©λ©λκΉ? μ΄λ»κ²? κ°λ°μκ° μ£Όλ‘ κ°λ° μ€μ μ¬λ¬ λΉλλ₯Ό λͺ ννκ²νκ±°λ QAκ° μ΅μ’ μ¬μ©μκ° μ»μ λΉλλ₯Ό κ²°μ νκΈ° μν΄ λ λ§μ΄ μ¬μ©ν©λκΉ? μ¬νμ±μ΄ λͺ©νλΌλ©΄ μ΄λ‘ μ μΌλ‘ μ΄κ²μ λ¦΄λ¦¬μ€ λ²μ λ²νΈκ° μ 곡ν΄μΌνλ κ²μ λλ€. μ κ·Έλ μ§ μμ΅λκΉ? (μλ λ΅λ³μ μΌλΆλ‘μ΄ λ΅λ³μ λ΅νμμμ€. μ ν / μ μν μ¬νμ λ°νλ λ° λμμ΄λ©λλ€ β¦)
-
μ§λ¬Έ : μλ λΉλμ λΉλ λ²νΈλ₯Όμν μ₯μκ° μμ΅λκΉ? λͺ¨λκ° CI μ루μ μ μ¬μ©ν΄μΌ ν μ λλ‘ λ¬Έμ κ° μμ΅λκΉ?
-
μ§λ¬Έ : λΉλ λ²νΈλ₯Ό SCMμ 체ν¬μΈν΄μΌν©λκΉ? λͺ©νκ° νμ€νκ³ λͺ ννκ² νΉμ λΉλλ₯Ό μλ³νλ κ²½μ° μΆ©λ / μ¬μμ λ±μ λ€μν μ°μ λλ μλ λΉλ μμ€ν μ λμ²νλ λ°©λ² β¦
-
μ§λ¬Έ : λΉλ λ²νΈκ° μ§§κ³ λ¬μ½€ν©λλ€ (μ¦, λ¨μ‘° μ¦κ°νλ μ μ)νμ¬ λ³΄κ΄μ μν΄ νμΌ μ΄λ¦μ μ¬μ©νκΈ° μ½κ³ ν΅μ μμ μ°Έμ‘°νκΈ° μ½μ΅λλ€. λ μ§, κΈ°κ³ μ΄λ¦ λ±?
-
μ§λ¬Έ : λΉλ λ²νΈ ν λΉμ΄ λκ·λͺ¨ μλ λ¦΄λ¦¬μ€ νλ‘μΈμ€μ μ΄λ»κ² μ μ©λλμ§ μμΈν μ€λͺ νμμμ€. μ, λ©μ΄λΈ μ νΈκ°λ€, μ°λ¦¬λ μ΄κ²μ΄ μλ£λμλ€λ κ²μ μκ³ μμ§λ§, μ°λ¦¬ λͺ¨λκ° μμ§ μΏ¨ μμ΄λλ₯Ό λ§μ κ²μ μλλλ€ β¦
λλ μ μ΄λ cvs / ant / hudson μ€μ μ ꡬ체μ μΈ μλ₯Ό μν΄ μ΄κ²μ μμ ν λλ΅μΌλ‘ μ‘체 ννκ³ μΆμ΅λλ€. κ·Έλμ λκ΅°κ°μ΄ μ§λ¬Έμ κΈ°μ΄νμ¬ μμ ν μ λ΅μ μΈμΈ μ μμ΅λλ€. μ΄ νΉμ μ¬λ‘ (cvs νκ·Έ μ§μ 체κ³, κ΄λ ¨ CI κ΅¬μ± νλͺ© λ° λΉλ λ²νΈλ₯Ό 릴리μ€λ‘ μ λ λ¦΄λ¦¬μ€ μ μ°¨λ₯Ό ν¬ν¨νμ¬ νλ‘κ·Έλλ° λ°©μμΌλ‘ μ€λͺ )λ₯Ό μ 곡 ν μμλ μ¬λμ΄λΌλ©΄ λꡬλ βλ΅λ³βμΌλ‘ νμνκ² μ΅λλ€. λ€λ₯Έ νΉμ κ΅¬μ± (μ : svn / maven / cruise control)μ λν΄ μ§λ¬Έ / λ΅λ³μνλ €λ©΄ μ¬κΈ°μμ μ§λ¬Έμ μ°κ²°νκ² μ΅λλ€. βJA
[νΈμ§ 10 10 μ 9 μΌ] λλ κ·Έκ²μ΄ ν©λ¦¬μ μΈ ν΄κ²°μ± μ΄λΌκ³ μκ°νκΈ° λλ¬Έμ κ°μ₯ μΈκΈ°μλ λ΅λ³μ μλ½νμ§λ§ λ€λ₯Έ λ΅λ³λ€λ μ’μ μμ΄λμ΄λ₯Ό ν¬ν¨νκ³ μμ΅λλ€. λκ΅°κ°κ° μ΄λ€ μ€ μΌλΆλ₯Ό marty-lamb κ³Ό ν©μ±νλ λ° μ΄λ €μ μ κ²ͺκ³ μΆλ€λ©΄ λ€λ₯Έ κ²μ λ°μλ€μ΄λ κ²μ΄ μ’μ΅λλ€. marty-lambκ³Ό κ΄λ ¨νμ¬ μ μΌνκ² κ±±μ νλ κ²μ μ§λ ¬ν λ λΉλ λ²νΈλ₯Ό μμ μ μΌλ‘ μμ±νμ§ μλλ€λ κ²μ λλ€. λΉλ μμ€ν μ νμ§ μκ³μ λ°λΌ λͺ¨νΈνμ§ μμ λΉλ λ²νΈλ₯Ό μ 곡νλ―λ‘ μ’μ§ μμ΅λλ€.
[7 μ 10 μΌ νΈμ§]
μ΄μ μλμ κ°μ ν΄λμ€κ° ν¬ν¨λ©λλ€. μ΄λ₯Ό ν΅ν΄ λ²μ λ²νΈλ₯Ό μ΅μ’ μ€ν νμΌλ‘ μ»΄νμΌ ν μ μμ΅λλ€. λ€μν ννμ λ²μ μ λ³΄κ° λ‘κΉ λ°μ΄ν°, μ₯κΈ°κ° λ³΄κ΄ λ μΆλ ₯ μ νμμ μμ±λλ©° μΆλ ₯ μ νμ λν (λλ‘λ λͺ λ ν) λΆμμ νΉμ λΉλλ‘ μΆμ νλ λ° μ¬μ©λ©λλ€.
public final class AppVersion
{
// SVN should fill this out with the latest tag when it's checked out.
private static final String APP_SVNURL_RAW =
"$HeadURL: svn+ssh://user@host/svnroot/app/trunk/src/AppVersion.java $";
private static final String APP_SVN_REVISION_RAW = "$Revision: 325 $";
private static final Pattern SVNBRANCH_PAT =
Pattern.compile("(branches|trunk|releases)\\/([\\w\\.\\-]+)\\/.*");
private static final String APP_SVNTAIL =
APP_SVNURL_RAW.replaceFirst(".*\\/svnroot\\/app\\/", "");
private static final String APP_BRANCHTAG;
private static final String APP_BRANCHTAG_NAME;
private static final String APP_SVNREVISION =
APP_SVN_REVISION_RAW.replaceAll("\\$Revision:\\s*","").replaceAll("\\s*\\$", "");
static {
Matcher m = SVNBRANCH_PAT.matcher(APP_SVNTAIL);
if (!m.matches()) {
APP_BRANCHTAG = "[Broken SVN Info]";
APP_BRANCHTAG_NAME = "[Broken SVN Info]";
} else {
APP_BRANCHTAG = m.group(1);
if (APP_BRANCHTAG.equals("trunk")) {
// this isn't necessary in this SO example, but it
// is since we don't call it trunk in the real case
APP_BRANCHTAG_NAME = "trunk";
} else {
APP_BRANCHTAG_NAME = m.group(2);
}
}
}
public static String tagOrBranchName()
{ return APP_BRANCHTAG_NAME; }
/** Answers a formatter String descriptor for the app version.
* @return version string */
public static String longStringVersion()
{ return "app "+tagOrBranchName()+" ("+
tagOrBranchName()+", svn revision="+svnRevision()+")"; }
public static String shortStringVersion()
{ return tagOrBranchName(); }
public static String svnVersion()
{ return APP_SVNURL_RAW; }
public static String svnRevision()
{ return APP_SVNREVISION; }
public static String svnBranchId()
{ return APP_BRANCHTAG + "/" + APP_BRANCHTAG_NAME; }
public static final String banner()
{
StringBuilder sb = new StringBuilder();
sb.append("\n----------------------------------------------------------------");
sb.append("\nApplication -- ");
sb.append(longStringVersion());
sb.append("\n----------------------------------------------------------------\n");
return sb.toString();
}
}
μν€ ν λ‘ μ΄ λ λ§ν μκ²¬μ΄ μμΌλ©΄ λ¨κ²¨μ£ΌμΈμ.
λ΅λ³
λ΄ νλ‘μ νΈ μ€ μΌλΆμμλ Subversion κ°μ λ²νΈ, μκ°, λΉλλ₯Ό μ€ν ν μ¬μ©μ λ° μΌλΆ μμ€ν μ 보λ₯Ό μΊ‘μ²νμ¬ μμ© νλ‘κ·Έλ¨ jarμ ν¬ν¨λλ .properties νμΌμ λ£κ³ λ°νμμ ν΄λΉ jarμ μ½μ΅λλ€.
κ°λ―Έ μ½λλ λ€μκ³Ό κ°μ΅λλ€.
<!-- software revision number -->
<property name="version" value="1.23"/>
<target name="buildinfo">
<tstamp>
<format property="builtat" pattern="MM/dd/yyyy hh:mm aa" timezone="America/New_York"/>
</tstamp>
<exec executable="svnversion" outputproperty="svnversion"/>
<exec executable="whoami" outputproperty="whoami"/>
<exec executable="uname" outputproperty="buildsystem"><arg value="-a"/></exec>
<propertyfile file="path/to/project.properties"
comment="This file is automatically generated - DO NOT EDIT">
<entry key="buildtime" value="${builtat}"/>
<entry key="build" value="${svnversion}"/>
<entry key="builder" value="${whoami}"/>
<entry key="version" value="${version}"/>
<entry key="system" value="${buildsystem}"/>
</propertyfile>
</target>
μΆκ°νλ €λ μ 보λ₯Ό ν¬ν¨νλλ‘ μ΄κ²μ νμ₯νλ κ²μ κ°λ¨ν©λλ€.
λ΅λ³
κ·ν μ build.xml
...
<property name="version" value="1.0"/>
...
<target name="jar" depends="compile">
<buildnumber file="build.num"/>
<manifest file="MANIFEST.MF">
...
<attribute name="Main-Class" value="MyClass"/>
<attribute name="Implementation-Version" value="${version}.${build.number}"/>
...
</manifest>
</target>
...
μλ° μ½λ
String ver = MyClass.class.getPackage().getImplementationVersion();
λ΅λ³
- λΉλ λ²νΈλ hudson κ³Ό κ°μ μ§μμ μΈ ν΅ν© μλ²μ μ°κ²°λμ΄μΌν©λλ€ . μ§μ / ν / λ°°ν¬λ§λ€ λ€λ₯Έ μμ μ μ¬μ©νμμμ€.
- μ΅μ’
λΉλμμ λ²μ λ²νΈλ₯Ό μ μ§νλ €λ©΄ λΉλ μμ€ν
μ maven μ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€ . μ΅μ’
.jar / .war / .whatever-arμ μμΉ΄μ΄λΈ λ .properties νμΌμ μμ±ν©λλ€
META-INF/maven/<project group>/<project id>/pom.properties. .properties νμΌμλ λ²μ μμ±μ΄ ν¬ν¨λ©λλ€. - mavenμ κΆμ₯νκΈ° λλ¬Έμ μμ€ μ μ₯μμμ 릴리μ€λ₯Ό μ€λΉνκ³ λ²μ μ λκΈ°ν μνλ‘ μ μ§νκΈ° μν΄ λ¦΄λ¦¬μ€ νλ¬κ·ΈμΈ μ νμΈνλ κ²μ΄ μ’μ΅λλ€ .
λ΅λ³
μννΈμ¨μ΄:
- SVN
- κ°λ―Έ
- μ§μμ μΈ ν΅ν©μμν Hudson
- SVN κ°μ μ μ°ΎκΈ°μν Ant νμ€ν¬ μΈ svntask : http://code.google.com/p/svntask/
Hudsonμλ Continuous, Nightly λ° Releaseμ μΈ κ°μ§ λΉλ / μμ μ΄ μμ΅λλ€.
Continuous / Nightly λΉλμ κ²½μ° : λΉλ λ²νΈλ svntaskλ₯Ό μ¬μ©νμ¬ μ°Ύμ SVN κ°μ μ λλ€.
λ¦΄λ¦¬μ€ λΉλ / μμ : λΉλ λ²νΈλ νΉμ± νμΌμμ Antκ° μ½μ λ¦΄λ¦¬μ€ λ²νΈμ λλ€. λ°νμμ λΉλ λ²νΈλ₯Ό νμνκΈ° μν΄ λ¦΄λ¦¬μ€μ ν¨κ» νΉμ± νμΌμ λΆλ°° ν μλ μμ΅λλ€.
Ant λΉλ μ€ν¬λ¦½νΈλ λΉλ μ€μ μμ±λ jar / war νμΌμ Manifest νμΌμ λΉλ λ²νΈλ₯Ό λ£μ΅λλ€. λͺ¨λ λΉλμ μ μ©λ©λλ€.
λ¦΄λ¦¬μ€ λΉλμ λΉλ ν μ‘°μΉ : λΉλ λ²νΈκ°μλ Hudson νλ¬κ·ΈμΈ : νκ·Έ SVNμ μ¬μ©νμ¬ μ½κ² μν ν μ μμ΅λλ€.
νν:
- jar / warμ κ°λ° λ²μ μ κ²½μ° κ°λ°μλ jar / warμμ SVN κ°μ μ μ°Ύμ SVNμμ ν΄λΉ μ½λλ₯Ό μ°Ύμ μ μμ΅λλ€.
- 릴리μ€μ κ²½μ° SVN κ°μ μ λ¦΄λ¦¬μ€ λ²νΈκ° ν¬ν¨ λ SVN νκ·Έμ ν΄λΉνλ κ°μ μ λλ€.
λμμ΄ λμκΈ°λ₯Ό λ°λλλ€.
λ΅λ³
ν¨μ¬ κ°λ¨ν μλ리μ€μ΄μ§λ§ νλμ¨λ μ¬μ©νκ³ μμ΅λλ€.
λ΄ Ant μ€ν¬λ¦½νΈμλ λ€μκ³Ό κ°μ λμμ΄ μμ΅λλ€.
<target name="build-number">
<property environment="env" />
<echo append="false" file="${build.dir}/build-number.txt">Build: ${env.BUILD_TAG}, Id: ${env.BUILD_ID}, URL: ${env.HUDSON_URL}</echo>
</target>
Hudsonμ μμ μ΄ μ€νλ λλ§λ€ μ΄λ¬ν νκ²½ λ³μλ₯Ό μ€μ ν©λλ€.
νμμ κ²½μ°μ΄ νλ‘μ νΈλ webappμ΄λ©° webapp build-number.txtμ λ£¨νΈ ν΄λ μμ΄ νμΌμ ν¬ν¨μν€κ³ μμ΅λλ€.
λΉλκ° μλ£λλ©΄ λΉλ λ²νΈ / νμ μ€ν¬νλ‘ νκ·Έλ₯Ό μ§μ νκΈ° μν΄ Hudson μμ μ΄ μ΄λ―Έ μ€μ λμ΄ μμΌλ―λ‘ μμ€ μ»¨νΈλ‘€μ νκ·Έλ₯Ό μ§μ νμ§ μμ΅λλ€.
λ΄ μ루μ μ κ°λ°μμν μ¦λΆ λΉλ λ²νΈ λ§ λ€λ£¨μ§ λ§ μμ§ λ¦΄λ¦¬μ€ λ²νΈλ₯Ό λ€λ£¨λ νλ‘μ νΈμμλ μΆ©λΆν μ»μ§ λͺ»νμ΅λλ€.
λ΅λ³
http://code.google.com/p/codebistro/wiki/BuildNumberμ μλ νλμ jarμμ BuildNumber Maven νλ¬κ·ΈμΈ λ° Ant νμ€ν¬λ₯Ό μ΄ν΄λ³Ό μλ μμ΅λλ€ . λλ κ·Έκ²μ κ°λ¨νκ³ κ°λ¨νκ² λ§λ€λ €κ³ λ Έλ ₯νλ€. λͺ λ Ή ν Subversion λ§ μ€μΉλλ λ§€μ° μμ jar νμΌμ λλ€.
λ΅λ³
μ΄κ²μ΄ λ΄κ° μ΄κ²μ ν΄κ²° ν λ°©λ²μ λλ€.
- μμ€λ λΉλ λλ ν 리μ 볡μ¬λ©λλ€
- anttask βversioninfoβκ° μ μ©λ©λλ€
- μμ λ μμ€λ₯Ό μ»΄νμΌ
λ€μμ λ²μ μ 보λ₯Ό μ μ₯νλ Java νμΌμ λλ€.
public class Settings {
public static final String VERSION = "$VERSION$";
public static final String DATE = "$DATE$";
}
λ€μμ anttask βversioninfoβμ λλ€.
<!-- =================================
target: versioninfo
================================= -->
<target name="versioninfo"
depends="init"
description="gets version info from svn"
>
<!--
get svn info from the src folder
-->
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml"
classpathref="ant.classpath"
/>
<svnSetting id="svn.setting"
javahl="false"
svnkit="true"
dateformatter="dd.MM.yyyy"
/>
<svn refid="svn.setting">
<info target="src" />
</svn>
<!--
if repository is a taged version use "v <tagname>"
else "rev <revisionnumber> (SVN)" as versionnumber
-->
<taskdef resource="net/sf/antcontrib/antcontrib.properties"
classpathref="ant.classpath"
/>
<propertyregex property="version"
input="${svn.info.url}"
regexp=".*/tags/(.*)/${ant.project.name}/src"
select="v \1"
defaultvalue="rev ${svn.info.lastRev} (SVN)"
override="true"
/>
<!--
replace date and version in the versionfile ()
-->
<replace file="build/${versionfile}">
<replacefilter token="$DATE$" value="${svn.info.lastDate}" />
<replacefilter token="$VERSION$" value="${version}" />
</replace>
</target>