In Java, there is no deep distinction between a
“library” and a “program” except that a
JAR file that provides a program must have a
main
method. If a JAR file contains a main
method, it can be executed, though it can also be used as a
library. Here are the relevant files for the program example:
basic/java-program/src/java/com/example/basic/BasicProgram.java
package com.example.basic; import com.example.basic.BasicLibrary; public class BasicProgram { public static void main(String[] args) { BasicLibrary l = new BasicLibrary(10); l.hello(); } };
basic/java-program/Abuild.conf
name: java-program platform-types: java deps: java-library
basic/java-program/Abuild.groovy
parameters { java.jarName = 'java-program.jar' java.mainClass = 'com.example.basic.BasicProgram' java.wrapperName = 'java-program' abuild.rules = 'java' }
A JAR file's manifest file may identify a class that contains a
main
method. Abuild adds the
Main-Class attribute to the manifest file
when the java.mainClass
parameter is set in
the Abuild.groovy
. In addition, abuild
will create a wrapper script if the
java.wrapperName
parameter is set. The
wrapper script that abuild creates may be useful for casual
execution of the Java program for testing purposes, but it is
generally not a substitution for having your own deployment
mechanism. In particular, the wrapper script references items
from your classpath by their paths within the build structure,
and additionally, abuild's wrapper scripts are not as portable
as the Java code that they help to invoke.
[9]
Here is the output of running abuild in this
directory. As in the C++ program example, the output has been
modified slightly: in addition to the
--topdir--
substitution, we have also filtered
out time stamps and other strings that could potentially differ
between platforms:
basic-java-program.out
abuild: build starting abuild: java-library (abuild-java): all [mkdir] Created dir: --topdir--/basic/java-library/abuild-java/classes [javac] Compiling 1 source file to --topdir--/basic/java-library/abu\ \ild-java/classes [mkdir] Created dir: --topdir--/basic/java-library/abuild-java/dist [jar] Building jar: --topdir--/basic/java-library/abuild-java/dist\ \/java-library.jar abuild: java-program (abuild-java): all [mkdir] Created dir: --topdir--/basic/java-program/abuild-java/classes [javac] Compiling 1 source file to --topdir--/basic/java-program/abu\ \ild-java/classes [mkdir] Created dir: --topdir--/basic/java-program/abuild-java/dist [jar] Building jar: --topdir--/basic/java-program/abuild-java/dist\ \/java-program.jar abuild: build complete
[9] Specifically, abuild generates different wrapper scripts depending on whether you're running on Windows or not. Although it would work to build Java code on UNIX and run it on Windows, or vice versa, wrapper scripts generated on one platform are not portable to the other.