Binary release
This plugin provides two mechanisms: support to use binary module releases and
the generation of binary module releases from source modules.
Declaration
<plugin name="binrelease"/>
Usage
What a binary module is
A binary release is a module zip file with the module content without typically
the
java/
and
classes/
directories, plus a
lib/
directory containing the
jars for each execution, plus a generated module description file
module.xml
.
Here is for instance the zip content for
service_1.0.zip
file:
module.xml
lib/service-interface.jar
service-implementation.jar
sql/
webapps/
Note: the
module.xml
is generated by the plugin from the original module
declaration, wherever it is. There is no need to create a
module.xml
in the
module directory.
Third party jars are not included in the module zip file itself. As they are
declared in the
module.xml
, they are expected to be in the project's
lib/
directory. Here is the reason why: a user is aware of which jars are used
simply by looking in
lib/
, so he will of course avoid to add another version
of an already used library (in a binary module) in the project ClassPath with
potential conflits.
How to create binary modules
A module must have the attribute
binrelease.version
to be released as a
binary module in a zip file. The attribute value is considered as the module
version (for instance
1.1
). It is used to create the zip file name.
The targets
binrelease
or
binrelease.module
must be used and zip files will
be generated in
binrelease.output.directory
.
Note: you may remove the
java/**
pattern from the
binrelease.excludes
attribute in order to include source files in the generated zip. In that case,
Eclipse is able to show you the inline documentation of module classes and also
debug the source code !
How to use binary modules
The list of available modules with their version numbers is needed to enable
the plugin to get the right module.
A binary module can be declared:
- with an attribute
binrelease.version.MODULENAME
in plugin binrelease
or binrelease.versions
, its value is the module version number.
- with a
binrelease:package
definition and module
and version
attributes.
The plugin looks for these attributes in the
binrelease
plugin declaration
itself or in the virtual
binrelease.versions
plugin declaration. This
mechanism eases the release of the list of binary modules as a separated
deliverable file, which will only contain
binrelease.versions
and will be
included before "binrelease" plugin declaration.
Examples:
<plugin name="binrelease">
<attribute name="binrelease.version.mycoresystem" value="1.1"/>
</plugin>
<plugin name="binrelease.versions">
<attribute name="binrelease.version.myextension" value="0.1"/>
</plugin>
or equivalent with
binrelease:package
<plugin name="binrelease"
xmlns:binrelease="antlib:ch.elca.el4ant.binrelease">
<binrelease:package module="mycoresystem" version="1.1"/>
</plugin>
<plugin name="binrelease.versions"
xmlns:binrelease="antlib:ch.elca.el4ant.binrelease">
<binrelease:package module="myextension" version="0.1"/>
</plugin>
With this declaration, at configuration, when a module declares a dependency to
mycoresystem
and
mycoresystem
which is not already declared in the
project.xml
as a normal source module, then the
binrelease
plugin will look
for
mycoresystem_1.1.zip
in the
lib/
directory (if not available,
onlinelib
may get it from a online repository if properly configured).
That zip file is deflated in
dist/binrelease/leafcore_1.1/
and the
module.xml
is parsed and included in the project model.
The newly registered
mycoresystem
module is also specially configured to work
correctly with other plugins:
- The attribute
compile.nosources
is set, so compile
and jars
targets will skip this module
- The execution unit attributes
compile.jar
are set
to point to the dist/binrelease/leafcore_1.1/lib/
jar files.
- The attribute marker
binrelease.binary
is set.
- The target
compile.clean.hook
is removed from the hook targets
clean.[module]
for mycoresystem
only, to avoid jar files to be deleted
when clean
is used.
The global build system behavior is also modified by the plugin:
- Shortcut generation for
compile.module
, compile.rec.module
,
jars.rec.module
does not generate shortcuts for modules with the
binrelease.binary
marker.
Project structure example
This section proposes a project structure if you have to work on a project
where some of its modules are delivered as binary and others are supposed to be
sources only (for instance testcases).
The project declaration can be splitted into four files:
-
plugins.xml
contains declarations of all your plugins. binrelease
is
included.
-
binary-modules.xml
contains only the binrelease.versions
virtual
plugin. It is easy to deliver and easy to update for the user of the
binary modules.
<?xml version="1.0"?>
<!-- EL4Ant Project definition -->
<ant:project name="binary-modules"
xmlns="antlib:ch.elca.el4ant"
xmlns:ant="antlib:org.apache.tools.ant">
<plugin name="binrelease.versions"
xmlns:binrelease="antlib:ch.elca.el4ant.binrelease">
<binrelease:package module="mycoresystem" version="1.1"/>
<binrelease:package module="myextension" version="0.1"/>
</plugin>
</ant:project>
-
source-modules.xml
contains declarations of modules delivered as binary.
They must have binrelease.version
attribute set.
-
project.xml
is the entry point. It includes binary-modules
first if
you want to use binary releases, and then plugins.xml
in any case. Then
source-modules.xml
is included if you do not use binary releases before
the sources-only module declarations.
<?xml version="1.0"?>
<!-- EL4Ant project definition -->
<ant:project name="myproject"
xmlns="antlib:ch.elca.el4ant"
xmlns:ant="antlib:org.apache.tools.ant"
xmlns:antcontrib="antlib:net.sf.antcontrib">
<include file="plugins.xml"/>
<antcontrib:if>
<ant:isset property="usebinary"/>
<antcontrib:then>
<!-- Testing binary packages -->
<include file="binary-modules.xml"/>
</antcontrib:then>
<antcontrib:else>
<!-- Native module declarations -->
<include file="source-modules.xml"/>
</antcontrib:else>
<!-- Source-only modules -->
<module ...
</ant:project>
-
online
plugin can contain file://${basedir}/dist/binrelease/
in its
onlinelib.repository
attribute to automatically copy binary zip files to
the lib
directory.
When the project is configured without
usebinary
, native source modules are
used. Run
binrelease
to generate the binary modules zip files.
When the project is configured with
-Dusebinary=t
on the command line, binary
modules are found in
dist/binrelease
.
The following command sequence is an example of how to test binary modules:
ant -f bootstrap.xml distclean configure
ant binrelease clean
ant configure -Dusebinary=t
ant jars junit.start.all
ant binrelease.force.clean
Targets
-
binrelease
generates all releasable modules as binary modules.
-
binrelease.module
generates a releasable module as a zip file in
binrelease.output.directory
. Shortcuts are generated
-
binrelease.force.clean
removes registered binary modules in the project
from the lib
directory. It forces next configuration to get again zip
files for binary modules.
Attributes
Global
-
binrelease.output.directory
is the path to the directory where zip files
must be generated. May be absolute or relative to the project
directory. Default value is dist/binrelease/
.
-
binrelease.default.excludes
is the pattern used to exclude content of a
source module without the binrelease.excludes
attribute when packaging
the binary module. Default value is java/**,classes/**
.
-
binrelease.sets.behavior
controls how the binary modules are registered
in sets. If equals to append
, the binrelease.sets
value is appended to
original modules sets. If equals to exclude
, binary modules are not
registered in any module with noset
flag. If equals to nochange
,
binary modules are registered in their original sets. Default behavior
mode is exclude
.
-
binrelease.sets
is the set
attribute to append to binary modules if
behavior is append
.
Per module
-
binrelease.version
is the module version used to generate the zip file.
-
binrelease.excludes
is the exclude pattern used to build the zip file
from the module path. Default value is java/**,classes/**
.
Hooks
-
pre.binrelease.[module]
and post.binrelease.[module]
are called before and
after the zip generation only if the module is releasable.
The following properties are available for targets registered in these hook chains:
-
binrelease.output.directory
is the zip output directory.
-
module.zip
is the result zip file name.
-
module.path
is the module directory path.
-
module.binexcludes
is the module binrelease.excludes
value or default if not set.
-
module.version
is the module binrelease.version
attribute value used in the zip file name.
-
module.jars
is the list of module jar files to include in the zip lib/
directory.
ToDo
- Provide another target to package sources in a zip file with correct
naming policy to make them available in Eclipse, associated with the jar
files from a binary module.