Create Extensible Ant Script

When we write code, we need consider flexibility, extensibility and maintainability. These rules also applies when we write ant script or batch files.
The Task
In our solr related project, there are multiple cores, and we may add more cores in future. All cores share some common configuration files as the default core collection1. Every core has its own schema.xml and solrconfig.xml. 
So we put the default and shared core configuration files in solr.zip. The file structure looks like below:
solr.zip
solr/collection1/conf/schema.xml
solr/collection1/conf/solrconfig.xml
solr/core-app1/conf/schema.xml
solr/core-app1/conf/solrconfig.xml

As we may add more cores in future, so we want our ant build.xml stays stable: we don't have to update build.xml when we add new cores.

The Solution
In ant build.xml script, we use ant-contrib's foreach task to iterate all core folders: the folder name starts with core-, execute create-core task for each core folder.
<ac:foreach target="create-core" param="coreFolder">
  <path>
    <dirset id="cores" dir="solr/">
      <include name="core-*"/>
    </dirset>
  </path>
</ac:foreach>
The complete Ant Script
<project name="SolrProject" basedir="." default="all" xmlns:ac="antlib:net.sf.antcontrib">
  <dirname  property="project-basedir"  file="${ant.file.SolrProject}"/>
  <taskdef resource="net/sf/antcontrib/antlib.xml" uri="antlib:net.sf.antcontrib">
    <classpath>
      <pathelement location="BuildTools\apache-ant-1.8.4\lib\ant-contrib-1.0b3.jar"/>
    </classpath>
  </taskdef>
  <property name="application-name" value="SolrProject" />
  <property name="main-build-path" value="${project-basedir}/build" />
  <property name="project-build-path" value="${main-build-path}/${application-name}" />
  <property name="solr-zip" value="solr.zip" />
  <target name="clean">
    <delete dir="${main-build-path}" />
    <delete dir="${main-dist-path}" />
  </target>
  <target name="init">
    <mkdir dir="${main-build-path}" />
    <mkdir dir="${project-build-path}" />
  </target>
  <target name="build-package" depends="clean, init">
    <!-- copy configuration files to default core: collection1 -->
    <unzip src="${solr-zip}" dest="${project-build-path}/solr/collection1/conf" >
      <mapper>
        <globmapper from="collection1/conf/*" to="*"/>
      </mapper>
    </unzip>
    <!-- 
    <dirset id="cores" dir="solr/">
      <include name="core-*"/>
    </dirset>
    The pathconvert task can be used to format a dirset with arbitrary separators 
    <pathconvert dirsep="/" pathsep="," property="dirs" refid="cores"/>
    <echo message="${dirs}"/>
    -->
    <ac:foreach target="create-core" param="coreFolder">
      <path>
        <dirset id="cores" dir="solr/">
          <include name="core-*"/>
        </dirset>
      </path>
    </ac:foreach>
  </target>
  <target name="create-core">
    <basename property="basename" file="${coreFolder}"/>
    <echo message="file: ${coreFolder}, basename: ${basename}" />
    <mkdir dir="${project-build-path}/solr/${basename}/conf" />
    <unzip src="${solr-zip}" dest="${project-build-path}/solr/${basename}/conf" >
      <mapper>
        <globmapper from="collection1/conf/*" to="*"/>
      </mapper>
    </unzip>
  </target>
</project>
Post a Comment

Labels

Java (159) Lucene-Solr (111) Interview (61) All (58) J2SE (53) Algorithm (45) Soft Skills (37) Eclipse (33) Code Example (31) Linux (24) JavaScript (23) Spring (22) Windows (22) Web Development (20) Nutch2 (18) Tools (18) Bugs (17) Debug (16) Defects (14) Text Mining (14) J2EE (13) Network (13) Troubleshooting (13) PowerShell (11) Chrome (9) Design (9) How to (9) Learning code (9) Performance (9) Problem Solving (9) UIMA (9) html (9) Http Client (8) Maven (8) Security (8) bat (8) blogger (8) Big Data (7) Continuous Integration (7) Google (7) Guava (7) JSON (7) ANT (6) Coding Skills (6) Database (6) Scala (6) Shell (6) css (6) Algorithm Series (5) Cache (5) Dynamic Languages (5) IDE (5) Lesson Learned (5) Programmer Skills (5) System Design (5) Tips (5) adsense (5) xml (5) AIX (4) Code Quality (4) GAE (4) Git (4) Good Programming Practices (4) Jackson (4) Memory Usage (4) Miscs (4) OpenNLP (4) Project Managment (4) Spark (4) Testing (4) ads (4) regular-expression (4) Android (3) Apache Spark (3) Become a Better You (3) Concurrency (3) Eclipse RCP (3) English (3) Happy Hacking (3) IBM (3) J2SE Knowledge Series (3) JAX-RS (3) Jetty (3) Restful Web Service (3) Script (3) regex (3) seo (3) .Net (2) Android Studio (2) Apache (2) Apache Procrun (2) Architecture (2) Batch (2) Bit Operation (2) Build (2) Building Scalable Web Sites (2) C# (2) C/C++ (2) CSV (2) Career (2) Cassandra (2) Distributed (2) Fiddler (2) Firefox (2) Google Drive (2) Gson (2) How to Interview (2) Html Parser (2) Http (2) Image Tools (2) JQuery (2) Jersey (2) LDAP (2) Life (2) Logging (2) Python (2) Software Issues (2) Storage (2) Text Search (2) xml parser (2) AOP (1) Application Design (1) AspectJ (1) Chrome DevTools (1) Cloud (1) Codility (1) Data Mining (1) Data Structure (1) ExceptionUtils (1) Exif (1) Feature Request (1) FindBugs (1) Greasemonkey (1) HTML5 (1) Httpd (1) I18N (1) IBM Java Thread Dump Analyzer (1) JDK Source Code (1) JDK8 (1) JMX (1) Lazy Developer (1) Mac (1) Machine Learning (1) Mobile (1) My Plan for 2010 (1) Netbeans (1) Notes (1) Operating System (1) Perl (1) Problems (1) Product Architecture (1) Programming Life (1) Quality (1) Redhat (1) Redis (1) Review (1) RxJava (1) Solutions logs (1) Team Management (1) Thread Dump Analyzer (1) Visualization (1) boilerpipe (1) htm (1) ongoing (1) procrun (1) rss (1)

Popular Posts