24.3. Building Java Archive (.jar) Files: the Jar Builder

After building the class files, it's common to collect them into a Java archive (.jar) file, which you do by calling the Jar Builder. If you want to just collect all of the class files within a subdirectory, you can just specify that subdirectory as the Jar source:

Java(target='classes', source='src')
Jar(target='test.jar', source='classes')

SCons will then pass that directory to the jar command, which will collect all of the underlying .class files:

% scons -Q
javac -d classes -sourcepath src src/Example1.java src/Example2.java src/Example3.java
jar cf test.jar classes

If you want to keep all of the .class files for multiple programs in one location, and only archive some of them in each .jar file, you can pass the Jar builder a list of files as its source. It's extremely simple to create multiple .jar files this way, using the lists of target class files created by calls to the Java builder as sources to the various Jar calls:

prog1_class_files = Java(target='classes', source='prog1')
prog2_class_files = Java(target='classes', source='prog2')
Jar(target='prog1.jar', source=prog1_class_files)
Jar(target='prog2.jar', source=prog2_class_files)

This will then create prog1.jar and prog2.jar next to the subdirectories that contain their .java files:

% scons -Q
javac -d classes -sourcepath prog1 prog1/Example1.java prog1/Example2.java
javac -d classes -sourcepath prog2 prog2/Example3.java prog2/Example4.java
jar cf prog1.jar -C classes Example1.class -C classes Example2.class
jar cf prog2.jar -C classes Example3.class -C classes Example4.class