Use a precompiler "à la C" with JavaTag(s): Environment


Open source packages
Check this list of what is available.

Also take a look at JEnable

Ant
For simple need, Ant can be used to do substitution in your sources.

We insert into the code a special tag to delimit code that need to be stripped by the Ant script. Let's say we use //@STARTDEBUG@// and //@ENDDEBUG@//.

package com.rgagnon.howto;

import javax.swing.JFrame;

public class Example {

  public static void main(String args[]){
    JFrame f = new JFrame();
    f.setSize(300,200);
    f.setVisible(true);
    f.setTitle("HowTo");
    //@STARTDEBUG@//
    f.setTitle(f.getTitle() + " DEBUG version");
    //@ENDDEBUG@//
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}
If you execute this code, the JFrame title will have the word "DEBUG" appended to it.

The Ant script to remove the debugging code is :

<project default="buildme">

   <target name="compileprod">
    <copy todir="../out" includeEmptyDirs="false">
    <filterchain>
            <tokenfilter>
            <replacestring from="//@STARTDEBUG@//" to="/*" />
            <replacestring from="//@ENDDEBUG@//" to="*/" />
            </tokenfilter>
    </filterchain>
        <fileset dir=".">
          <include name="**/*.java" />
       </fileset>
    </copy>

    <javac srcdir="../out" />
   </target>

   <target name="compiledebug">
     <javac srcdir="." />
   </target>


   <target name="buildme" depends="compileprod" />
</project>
After running this script, the source (in the ..\out directory)
package com.rgagnon.howto;

import javax.swing.JFrame;

public class Example {

  public static void main(String args[]){
    JFrame f = new JFrame();
    f.setSize(300,200);
    f.setVisible(true);
    f.setTitle("HowTo");
    /*
    f.setTitle(f.getTitle() + " DEBUG version");
    */
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}
Simple boolean flag
See this HowTo. This technique relies on the compiler optimization which remove code in the bytecode generated because it will never be executed.