Search code examples
javaantannotationsconstantsfinal

Java build time constant configuration


I have a project I would like to build using multiple configurations. I have a constant that needs to be different between builds but I do not know how to change it based on my config.

For example I would like to be able to do the following based off a value in a config file.

@WebService(targetNamespace = "http://example.com/")
public class CustomerWebService {

and

@WebService(targetNamespace = "http://demo.example.com/")
public class CustomerWebService {

We use ant for building.


Solution

  • I would advise attempting to emulate Maven resource filtering and profile properties

    Source filtering

    src/templates/MyFile.java

    ..
    @WebService(targetNamespace = "@WS_NAMESPACE@")
    public class CustomerWebService {
    ..
    

    build.xml

    <target name="filter-sources">
        <copy todir="${build.dir}/src">
           <fileset dir="src/templates" includes="**/*.java"/>
           <filterset>
              <filter token="WS_NAMESPACE" value="${ws.namespace}"/>
           </filterset>
        </copy>
    </target>
    
    <target name="compile" depends="filter-sources">
        <javac destdir="${build.dir}/classes">
            <src path="src/java"/>
            <src path="${build.dir}/src"/>
            <classpath>
            ..
            ..
        </javac>
    </target>
    

    Notes:

    • The ANT copy task is capable of performing template substitutions.

    Build profiles

    Property files

    Each configuration has a different property file

    src/properties/dev.properties
    src/properties/qa.properties
    src/properties/prod.properties
    ..
    

    build.xml

    <property name="profile" value="dev"/>
    <property file="src/properties/${profile}.properties"/>
    

    Choosing an alternative build profile

    ant -Dprofile=qa ..