{"id":147,"date":"2026-10-12T13:31:09","date_gmt":"2026-10-12T13:31:09","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2009\/10\/06\/ant-builds-and-subversion-svn\/"},"modified":"2026-10-12T13:31:09","modified_gmt":"2026-10-12T13:31:09","slug":"ant-builds-and-subversion-svn","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/ant-builds-and-subversion-svn\/","title":{"rendered":"ANT + Subversion (SVN) with SVNAnt: A Practical build.xml Export Guide"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">If you maintain legacy or long-lived build systems, integrating <strong>Apache Ant<\/strong> with <strong>Subversion (SVN)<\/strong> can still be a practical way to automate source exports for packaging and deployment. This walkthrough explains the core SVNAnt wiring, shows a clean export target, and highlights safer ways to run it in team and CI environments.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2009-10-06; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full aligncenter\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2009\/10\/ant-builds-and-subversion-s.png\" alt=\"ant-builds-and-subversion\" width=\"600\" height=\"400\" \/><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How ANT and SVNAnt work together<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">SVNAnt adds SVN tasks (such as export) directly to your Ant build lifecycle. Instead of running separate shell commands manually, you can define repository operations as standard Ant targets.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Ant handles orchestration (targets, dependencies, logging).<\/li><li>SVNAnt contributes SVN-specific tasks via <code>taskdef<\/code>.<\/li><li>Your build target exports repository files into a local folder for later packaging or deployment.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites and SVNAnt libraries<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Per the original guide, download SVNAnt from <a href=\"http:\/\/subclipse.tigris.org\/svnant.html\" target=\"_blank\" rel=\"noopener\">subclipse.tigris.org\/svnant.html<\/a> and ensure the required jars are available to Ant (commonly via <code>ANT_HOME\/lib<\/code> or a project-local lib directory).<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>svnant.jar<\/code><\/li><li><code>svnClientAdapter.jar<\/code><\/li><li><code>svnjavahl.jar<\/code><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Build.xml foundation: properties, classpath, and task definition<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The minimal setup is: define jar locations, build a classpath, then load SVNAnt tasks with <code>taskdef<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">project<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"svnant-example\"<\/span> <span class=\"hljs-attr\">default<\/span>=<span class=\"hljs-string\">\"svn.export\"<\/span> <span class=\"hljs-attr\">basedir<\/span>=<span class=\"hljs-string\">\".\"<\/span>&gt;<\/span>\n\n    <span class=\"hljs-comment\">&lt;!-- SVNAnt libraries --&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"svnant.lib\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"lib\"<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"svnant.jar\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${svnant.lib}\/svnant.jar\"<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"svnClientAdapter.jar\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${svnant.lib}\/svnClientAdapter.jar\"<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"svnjavahl.jar\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"${svnant.lib}\/svnjavahl.jar\"<\/span> \/&gt;<\/span>\n\n    <span class=\"hljs-comment\">&lt;!-- Path to SVNAnt libraries --&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">path<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"project.classpath\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pathelement<\/span> <span class=\"hljs-attr\">location<\/span>=<span class=\"hljs-string\">\"${svnjavahl.jar}\"<\/span> \/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pathelement<\/span> <span class=\"hljs-attr\">location<\/span>=<span class=\"hljs-string\">\"${svnant.jar}\"<\/span> \/&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pathelement<\/span> <span class=\"hljs-attr\">location<\/span>=<span class=\"hljs-string\">\"${svnClientAdapter.jar}\"<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">path<\/span>&gt;<\/span>\n\n    <span class=\"hljs-comment\">&lt;!-- Load SVN task definitions --&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">taskdef<\/span> <span class=\"hljs-attr\">resource<\/span>=<span class=\"hljs-string\">\"svntask.properties\"<\/span> <span class=\"hljs-attr\">classpathref<\/span>=<span class=\"hljs-string\">\"project.classpath\"<\/span> \/&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">project<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Example target: export files from an SVN repository<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This target prompts for credentials and exports the HEAD revision from a repository URL into a local destination path.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"svn.url\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"http:\/\/&#91;mysvnhost]\/svn\/repo\/myprojectFiles\/\"<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">property<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"svn.exportPath\"<\/span> <span class=\"hljs-attr\">value<\/span>=<span class=\"hljs-string\">\"&#91;yourDirectory]:\\\\&#91;pathToYourCFEclipseProject]\\\\build\"<\/span> \/&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">target<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"svn.export\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">echo<\/span> <span class=\"hljs-attr\">message<\/span>=<span class=\"hljs-string\">\"Exporting application files from svn repository...\"<\/span> \/&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">message<\/span>=<span class=\"hljs-string\">\"Please enter svn repo username:\"<\/span> <span class=\"hljs-attr\">addproperty<\/span>=<span class=\"hljs-string\">\"svn.username\"<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">message<\/span>=<span class=\"hljs-string\">\"Please enter svn repo password:\"<\/span> <span class=\"hljs-attr\">addproperty<\/span>=<span class=\"hljs-string\">\"svn.password\"<\/span> \/&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">mkdir<\/span> <span class=\"hljs-attr\">dir<\/span>=<span class=\"hljs-string\">\"${svn.exportPath}\"<\/span> \/&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">svn<\/span> <span class=\"hljs-attr\">username<\/span>=<span class=\"hljs-string\">\"${svn.username}\"<\/span> <span class=\"hljs-attr\">password<\/span>=<span class=\"hljs-string\">\"${svn.password}\"<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">export<\/span> <span class=\"hljs-attr\">srcUrl<\/span>=<span class=\"hljs-string\">\"${svn.url}\"<\/span> <span class=\"hljs-attr\">destPath<\/span>=<span class=\"hljs-string\">\"${svn.exportPath}\"<\/span> <span class=\"hljs-attr\">revision<\/span>=<span class=\"hljs-string\">\"HEAD\"<\/span> \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">svn<\/span>&gt;<\/span>\n\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">echo<\/span> <span class=\"hljs-attr\">message<\/span>=<span class=\"hljs-string\">\"Finished exporting files.\"<\/span> \/&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">target<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Run the target from the command line:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-bash\"><span class=\"hljs-selector-tag\">ant<\/span> <span class=\"hljs-selector-tag\">svn<\/span><span class=\"hljs-selector-class\">.export<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For non-interactive runs, pass properties explicitly:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">ant -Dsvn.username=<span class=\"hljs-string\">\"$SVN_USER\"<\/span> -Dsvn.password=<span class=\"hljs-string\">\"$SVN_PASS\"<\/span> svn.export<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">SVN export workflow in this build<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Run ant svn.export] --> B[Load SVNAnt task definition]\n    B --> C[Read SVN credentials]\n    C --> D[Connect to repository URL]\n    D --> E[Export HEAD revision to local folder]\n    E --> F[Use exported files for package or deploy]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">SVN export vs checkout vs update for build pipelines<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>SVN operation<\/th><th>What it produces<\/th><th>Best for<\/th><th>Trade-off<\/th><\/tr><\/thead><tbody><tr><td>export<\/td><td>Clean copy without working-copy metadata<\/td><td>Deployment bundles, artifact staging<\/td><td>No local metadata for incremental updates<\/td><\/tr><tr><td>checkout<\/td><td>Working copy with SVN metadata<\/td><td>Developer workspaces, long-lived build workdirs<\/td><td>Extra metadata in filesystem<\/td><\/tr><tr><td>update<\/td><td>Refreshes an existing checkout<\/td><td>Faster recurring builds on persistent agents<\/td><td>Requires an existing working copy<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Reference links from the original guide<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Original SVNAnt references: <a href=\"http:\/\/subclipse.tigris.org\/svnant.html\" target=\"_blank\" rel=\"noopener\">SVNAnt download page<\/a> and <a href=\"http:\/\/subclipse.tigris.org\/svnant\/svn.html\" target=\"_blank\" rel=\"noopener\">SVN task documentation<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Keep repository URLs and destination paths in Ant properties, not hardcoded across many targets.<\/li><li>Avoid interactive credential prompts in CI; inject credentials through secure pipeline variables.<\/li><li>Use <code>export<\/code> for deployable output when you do not want SVN metadata in the target directory.<\/li><li>Keep SVNAnt and SVN client libraries version-aligned in your build environment.<\/li><li>Validate paths and property names carefully (for example, keep <code>svn.exportPath<\/code> naming consistent across <code>mkdir<\/code> and <code>export<\/code>).<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>This guide shows how to wire SVNAnt into Apache Ant so you can export files from an SVN repository using repeatable build targets. It includes build.xml snippets, a workflow diagram, and guidance on when to use export vs checkout.<\/p>\n","protected":false},"author":1,"featured_media":4077,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[12,23],"tags":[209,3252,3250,3257,3261,3260,3258,3253,396,3113,1806,588,3256,732,394,395,3255,3254,3251,3259],"class_list":["post-147","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apache-ant","category-svnsubversion","tag-ant","tag-ant-and-svn-integration","tag-ant-builds","tag-ant-integration-with-subversion","tag-ant-integration-with-subversion-guide","tag-ant-integration-with-subversion-tutorial","tag-ant-svn-export","tag-build-with-ant-and-svn","tag-builds","tag-how-to","tag-instruction","tag-integration","tag-pocess","tag-steps","tag-subversion","tag-svn","tag-svn-integration-into-ant-build","tag-svn-tasks-on-ant","tag-svnant","tag-svnant-export-command"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/147","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=147"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/147\/revisions"}],"predecessor-version":[{"id":78995,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/147\/revisions\/78995"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4077"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}