General documentation
The EL4Ant build system is based on Ant and some basic concepts to ease the
description and modularization of a project to build.
Introduction
EL4Ant is a Ant build file generator. This generation is controlled by a
project description file which declares plugins used and modules.
The build file generation is called the configuration step, it corresponds to
the
configure
Ant target invocation on
bootstrap.xml
or
build.xml
.
After configuration, the generated
build.xml
is used as a normal Ant build
file.
Concepts
Ant
Ant is the well-known Java build tool from the Apache project
http://ant.apache.org. It is the main component of the build system. It is
included without any changes.
- A build file is an XML project description for Ant. It contains tasks
organised in targets.
- A target is an entry point in the build file. Its name is invoked to
execute its sequence of tasks.
- A task is an elementary component of the build file, with its
parameters. Internally, it is a Java class with setters and the method
execute
.
- A property is a Ant variable to store information.
What you should know about Ant before using it:
- Ant looks for a
build.xml
build file by default. You can load another
file name with the -f
option.
- You can query a build file's documentation with
ant -projecthelp
.
- A build file declares a default target that is executed if no target is
specified on the command line.
- You can specify a list of targets to execute sequentially in the same
command, for instance
ant target1 target2
. It is faster because only one
Java virtual machine is started to process all targets.
To know more about Ant, please consult the
Ant manual.
Plugin
The build system provides an infrastructure to easily extend its behavior with
plugins. Even core targets (
compile
,
start
) are defined in plugins, so they
have to be declared in your project description to get a usable build system.
Plugins are read by the configuration process initiated by
ant -f bootstrap.xml
.
The results of the configuration are a project specific
build.xml
and
properties
project.properties
.
A plugin may depend on other plugins. If dependencies or configuration
constraints are not fullfiled in a plugin description, the configuration may
abort.
Module
A module is the minimal project component. It enables you to split your project
into features-set or services.
It is defined by its relative path (for instance
mysystem/core
) and a set of
specific child directories defined by plugins (for instance
java
to compile,
docs
for javadoc and
sql
for the SQL scripts). The module's path may
contain as many subdirectories as needed by your project structure.
module_root/
java/
docs/
sql/
[...]
In the project description, a module is declared with:
<module path="mysystem/core">
[...]
</module>
A symbolic module name is associated with a module. If not specified, it is
build from the path, removing the
/
characters. In the previous example, the
module name is
mysystemcore
. The module name can also be set explicitly with
the
name
attribute in the
module
element.
If the module definition is in a separate xml file (for instance
mymodule.xml
)
and placed directly in module path (for instance
mysystem/core
) the attribute
path can be omitted. Of course this separate xml file must be referenced by
using directive
include
(for instance
<include file="mysystem/core/mymodule.xml"/>
) in project xml file.
Execution unit
An execution unit (eu) is a logical part of a module. It may be used
optionally to provide internal structure to a module. Each execution unit of
a module has its own deliverables (typically jar files) and runtime command
definition.
An execution unit defines:
- A set of classes
- Dependencies
- Configuration
A module will be split into jars according to the execution unit
definitions. Each execution unit will have its own runtime specification:
ClassPath, main class, arguments, system properties.
The declaration of execution units in a module is optional. In fact, a module
without
eu
element has a virtual default execution unit called
0
, you may
see that notation in generated properties, targets or hooks.
The main aim of execution units is to select classes to be deployed on
different tiers - for instance
client
,
server
and
batch
. As a result
runtime commands are configurable per execution unit. The execution unit
definition is orthogonal to the module definition.
Examples are provided in
project description section.
Dependency
A dependency enables to declare a
module to module or
module to jar class
use. Dependencies are implicitly transitive: if a module
A
depends on
B
and
module
B
depends on
C
, you can consider
A
automatically depends on
C
.
In fact, a dependency applies to execution units. A dependency may be limited
to a specified execution unit; the configuration resolves implicit dependencies
with the following patterns:
- A dependency to a jar without explicit execution unit limitation applies
to all module execution units.
- Per execution unit, eu to eu dependencies are done if modules have same
execution unit sets or none.
Attribute
An attribute is a configuration entry used by plugins. It may be defined in a
plugin declaration for a global scope, in a module declaration or in an
execution unit declaration to limit its scope to the corresponding object.
Consult the plugins documentation to know which attribute names are available
for each scope.
Hook
A hook is an entry point in the build file target execution. Hooks allow to add
specific behaviors during the execution of build system targets. Hooks are
declared in plugins and hook targets registered on a hook chain are called
within the target.
The hook invocation may be conditionned by a user property which acts as a
switch.
Most of the time, a
pre and a
post hook is defined before and after an
important target processing. Specific properties may be available to configure
hook target implementation behavior.
Consult the plugins documentation to know which hook chains are available and
which hook targets are registered by default. Most hooks are designed for
plugin to plugin interaction.
Module set
Each module defines what sets it is contained in (sample sets could be
tests
,
framework
, or
consoleApplication
). To define the sets a module is part of,
the
set
attribute is used. A set classifies modules in a logical group to
apply a target on them.
The sets for a module can be declared with multiple
set
attributes or a
single attribute with a list of set names separated by comas.
If a module does not declare a
set
attribute, it will be present in all sets
from its module dependencies. If module
A
is in sets
S1
and
S2
, and
module
B
in set
S3
, then a module
C
that depends on
A
and
B
without
explicitly declaring its sets will be in sets
S1
,
S2
and
S3
.
If a module does not declare a
set
and has no dependencies, then it will be
registered in the set
default
.
If a module declares the
noset
attribute, then it is not registered in any
set.
Project description
Structure
The following graph shows the complete structure of the
project.xml
file:
+ <plugin [name] [file]>
| + <attribute name [value | CDATA]>
|
+ <module [name] [path]>
| + <eu name>
| | + <attribute name [value | CDATA]>
| | + <hook name target [action="append.(first|last)"]>
| + <dependency [jar | module] [eu] [inheritEuList]>
| | + {if module} <mapping target [eu]>
| + <attribute name [value | CDATA]>
| + <hook name target [eu] [action="append.(first|last)"]>
|
+ <hook name target [module] [eu] [action="append.(first|last)"]>
- Here is the order of importance of the elements: attribute, plugin,
module, dependency, eu, mapping, hook. You should learn how to use them in
that order.
- All elements are optional.
- Elements order in the project description is only important for the plugin
registration order and the module registration order according to the
respective dependencies.
- When an
include
statement is analyzed, its content is registered
immediately, so it has an impact on the registration order.
Project description examples
are described later.
The attribute element
Attribute elements are used to configure the plugin behavior and Ant targets.
The attribute scope depends on where it is set:
- global scope if set in a
plugin
element,
- module scope if set in a
module
element,
- module execution unit scope if set in a
eu
element.
Please refer to each plugin documentation to know available attribute names,
expected values and scope(s).
The plugin element
In the normal case, a plugin declaration only uses the
name
attribute. The
corresponding build file packaged in the plugin
jar
file is processed.
If the given
name
does not match any available plugins in the EL4Ant lib
directory, the plugin can only be used to store attributes. Such a plugin is
called virtual.
When developing a plugin, the
file
attribute must be provided. See
for more details about plugin development.
The module element
A module declaration must set its directory
path
. A symbolic
name
can be
set. A module can declare its dependencies, its execution units, its attributes
and its hook targets.
Module execution units are optional. When no execution unit is specified,
execution unit attibutes and hooks must be defined on the module level.
The dependency element
A module may depend on a third party jar or on another module.
A dependency to a
jar
applies by default to all module execution units. It
can be specific to a module execution unit with the
eu
scope. The jar file
may only be the file name which is then expected to be in
lib/
. It may be a
path relative to the project directory or an absolute path.
A dependency to a
module
uses the target module name (explicitly declared or
built from the path).
- If the
eu
scope is not set,
- if
inheritEuList=true
is used, the target module execution unit list
is declared in the current module.
- if the target module has no execution unit, all module execution units
depend on the single target module jar.
- if the target module has execution units, each module execution unit
depends on the target module execution unit with the same name if it
exists (except if
mapping
is used).
- If the
eu
scope is set,
- if the target module has no execution unit, the
eu
depends on the
single module jar.
- if the target module has execution units, the
eu
depends on the same
eu
of the target module (except if a mapping
is used).
The
mapping
element helps to declare explicitly execution unit mappings.
The eu element
An
eu
element declares an execution unit for the module it is used in. Its
name
is mandatory. An execution unit can declare its attributes and its hook
targets.
Attributes and hook target registrations are limited to the execution unit
where they are declared.
The mapping element
It enables to create more complex dependencies from module to module, mainly
when the module execution units are not the same. Multiple
mapping
elements
may be used in the same
dependency
element.
- If the
dependency
eu
scope is not set,
-
mapping target="targeteu"
makes dependencies for each current module
execution unit to the target module targeteu
.
-
mapping eu="oneeu" target="targeteu"
makes a dependency of the
current module oneeu
to the target module targeteu
.
- If the
dependency
eu
scope is set,
-
mapping target="targeteu"
makes a dependency of the current module
eu
to the target module targeteu
.
The hook element
It enables to plug a dedicated target in a plugin hook chain.
If the hook name contains the
[module]
pattern, then a hook chain is
available per module. If the hook name contains the
[module].[eu]
pattern,
then a hook chain is available per module execution unit.
If the hook element is used to register a target in a chain at the project
level,
- this registration applies to all modules in case of
[module]
hook
- this registration applies to all execution units of all modules in case of
[module].[eu]
hook
If the hook element is used to register a target in a chain at the module
level,
- this registration applies to the concerned module in case of
[module]
hook
- this registration applies to all execution units of the concerned module
in case of
[module].[eu]
hook
If the hook element is used to register a target in a chain at the execution
unit level,
- this registration applies to the concerned module in case of
[module]
hook
- this registration applies to the concerned module execution unit in case
of
[module].[eu]
hook
A target invocation in a hook chain can be controlled by the
if
and
unless
attributes which expect a property name to check. With
if
, the target is
invoked when the property is defined and different from
false
or
no
. With
unless
, the target is invoked when the property is not defined or equals to
false
or
no
. Property switching is designed to be used on the Ant command
line with
-Dpropertyname=t
for instance.
The documentation of plugins describes the declared hook chains in the user
targets and targets designed to be registered in a hook chain.
Examples
Simple description
Here is a simple project description:
<?xml version="1.0"?>
<!-- EL4Ant Project definition -->
<ant:project
name="helloworld"
xmlns="antlib:ch.elca.el4ant"
xmlns:ant="antlib:org.apache.tools.ant">
<plugin name="compile"/>
<plugin name="runtime"/>
<plugin name="show"/>
<module name="helloworldcommon" path="helloworld/common">
<dependency jar="log4j-1.2.8.jar"/>
<attribute name="set" value="helloworld"/>
</module>
<module name="helloworldapp" path="helloworld/app">
<dependency module="helloworldcommon"/>
<attribute name="runtime.runnable" value="true"/>
<attribute name="runtime.class" value="helloworld.Main"/>
</module>
<module name="helloworldtests" path="helloworld/tests">
<dependency module="helloworldcommon"/>
<attribute name="junit.runnable" value="true"/>
<attribute name="set" value="tests"/>
</module>
</ant:project>
This description does not use execution units. Execution unit attributes are so
declared at the module level.
Execution unit usage
Consider this short project description:
- Module
mytool
without execution unit. The jar mytool.jar
will be
generated with the whole module content.
- Module
myservice
- Execution unit
interface
: The jar myservice-interface.jar
contains
common classes and the service interface.
- Execution unit
implementation
: The jar myservice-implementation.jar
contains common classes and the service interface and
implementation. Only this eu depends on the mytool
module.
- Module
myapp
- Execution unit
client
: The jar myapp-client.jar
contains client
code deployed with Java WebStart. The client
eu depends on
myservice.interface
to be able to remotely call myservice
.
- Execution unit
server
: The jar myapp-server.jar
contains a server
component deployed in a EJB container to provide a remote myservice
interface implementation. The server
eu depends on
myservice.implementation
.
- Execution unit
batch
: The jar myapp-batch.jar
provides automation
to call myservice
with parameters provided in a file transmitted by
FTP.
<?xml version="1.0"?>
<!-- EL4Ant Project definition -->
<ant:project
name="example"
xmlns="antlib:ch.elca.el4ant"
xmlns:ant="antlib:org.apache.tools.ant">
<plugin name="compile"/>
<plugin name="runtime"/>
<plugin name="show"/>
<module name="mytool" path="modules/tool">
<dependency jar="log4j-1.2.8.jar"/>
</module>
<module name="myservice" path="modules/services/food">
<eu name="interface">
<attribute name="compile.jar.excludes" value="**/implementation/**"/>
</eu>
<eu name="implementation">
</eu>
<dependency eu="implementation" module="mytool"/>
</module>
<module name="myapp" path="applications/food">
<eu name="client">
<attribute name="compile.jar.includes" value="**/client/**"/>
<!-- TBD: Attributes to generate Java WebStart package -->
</eu>
<dependency eu="client" module="myservice">
<!-- myapp.client depends on myservice.interface -->
<mapping target="interface"/>
<dependency>
<eu name="server">
<attribute name="compile.jar.includes" value="**/server/**"/>
<!-- TBD: Attributes to generate EJB specific artefacts -->
</eu>
<dependency eu="server" module="myservice">
<!-- myapp.server depends on myservice.implementation -->
<mapping target="implementation"/>
<dependency>
<eu name="batch">
<attribute name="compile.jar.includes" value="**/batch/**"/>
<attribute name="runtime.runnable" value="true"/>
<attribute name="runtime.class" value="app.Batch"/>
</eu>
<dependency eu="batch" module="myservice">
<!-- myapp.batch depends on myservice.interface -->
<mapping target="interface"/>
<dependency>
</module>
</ant:project>
Hook usage
The hook concept enables to plug additional behavior in a plugin target. The
most interesting hook chain is
runtime.[module].[eu]
which is used to tune a
Java application command line to run.
A target registration in a hook is permanent except when
if
or
unless
attributes are used.
<?xml version="1.0"?>
<!-- EL4Ant Project definition -->
<ant:project
name="helloworld"
xmlns="antlib:ch.elca.el4ant"
xmlns:ant="antlib:org.apache.tools.ant">
<plugin name="compile"/>
<plugin name="runtime"/>
<plugin name="show"/>
<module name="helloworldcommon" path="helloworld/common">
<dependency jar="log4j-1.2.8.jar"/>
<attribute name="set" value="helloworld"/>
</module>
<module name="helloworldapp" path="helloworld/app">
<dependency module="helloworldcommon"/>
<attribute name="runtime.runnable" value="true"/>
<attribute name="runtime.class" value="helloworld.Main"/>
<hook
name="runtime.[module].[eu]"
target="runtime.hook.jvm.verbose"
if="jvmverbose"/>
</module>
<module name="helloworldtests" path="helloworld/tests">
<dependency module="helloworldcommon"/>
<attribute name="junit.runnable" value="true"/>
<attribute name="set" value="tests"/>
<hook
name="runtime.[module].[eu]"
target="runtime.hook.jvm.verbose"
if="jvmverbose"/>
</module>
</ant:project>
In the previous example, the Java command executed by target
start.module.eu.helloworldapp
and
start.module.eu.helloworldtests
will be
turned in verbose mode (JVM option
-verbose
) when the property
jvmverbose
is set.
ant start.module.eu.helloworldapp -Djvmverbose=
Plugin documentation details the available hook and their usage in most use
cases.
Special features
Automatic reconfiguration
When a target of the
build.xml
is invoked, EL4Ant checks that the project
configuration is up-to-date compared to the project description files. If not,
a new configuration is automatically done before the listed targets are invoked
- if possible, because they may have been removed from the project.
Automatic module section
The autoselect feature enables you to invoke a target with its generic name
from a module directory. EL4Ant automatically deduces the module the target
should apply on according to the invocation directory.
Suppose a module
mymodule
which directory path is
myproject/mymodule
has
been declared in the project. The target
ant compile.module
invoked from a
sub-directory of
myproject/mymodule/
automatically defines the
module
property to
mymodule
and
compile.module
compiles only
mymodule
.
If the automatically selected module has only one execution unit, it is
selected too, so generic target relative to an execution unit can be used.
Note: this feature only make sense if Ant is used with
-find build.xml
. For
comfort, it is advised to set the option in the ant script directly.
Shortcut generation filter
By default, generated shortcuts do not have descriptions to prevent them to be
shown by
ant -projecthelp
. If you want some targets to be visible, you can
make them visible with the property
project.visible.shortcuts
in
etc/bootstrap.properties
:
## Visible shortcuts regexp list (use java.util.regex.Pattern regexp)
project.visible.shortcuts=start.*\.module\.eu.*,compile\.rec\.module\.helloworld.*
The previous line adds a description to matching shortcuts, so they are shown
by the command
ant -projecthelp
.
Core system plugins documentation
Introduction
For each plugin, the documentation explains:
- what the plugin is designed to do
- Declaration : how to declare the plugin with its minimal configuration
- Dependencies : if the plugin depends on others
- Usage : how to use the plugin in everyday work
- Targets : list of available Ant targets the user may invoke.
If the mention Shortcuts are generated is present, this means a
module/execution unit specific target is generated for properly configured
module/execution unit in the build file to ease target invocation. For
instance,
compile.module.mymodule
is generated to invoke
compile.module
if the module mymodule
is compilable.
Use ant -v -projecthelp
to list all generated targets. See
generation filter configuration for shortcuts.
- Attributes : how to configure the plugin to suit your specific needs
- Global : plugin level attributes to configure globally the plugin behavior
or set default attribute values for all module/execution unit.
- Per module : attribute to configure how the plugin works with the module
- Per execution unit : if used, configure how the plugin works with the
specified exection unit. If no execution unit is used, the same attribute
name can be used at module level to configure targets behavior.
- Hooks : plugin defined hooks to enhance targets behavior for advanced
users or plugin developpers, and specific properties available for a target
registered in each hook.
Compile
This plugin compiles Java sources from each module's
java/
directory to the
corresponding
classes/
directory.
Declaration
<plugin name="compile"/>
Usage
Most important targets are
compile
and
jars
.
A module without specific attributes is expected to have a
java/
directory
(default of
compile.sources.directory
). Java sources are compiled in a
dedicated
classes/
directory (by default in
dist/classes
).
A module without sources to compile, but only with resources to include in jar
files and in ClassPath, must set the
compile.nosources
module attribute.
A module without sources nor resources to include in ClassPath must set the
compile.noclasses
module attribute. It implies automatically
compile.nosources
. Such a module may exist to provide files for other modules
(for instance
webapp/
resources to be included in a WAR).
A manifest file per execution unit is generated in the classes directory as
META-INF/Manifest-eu.mf
. This manifest provides the
Class-Path
attribute
with third-party jar file names and project jar dependencies. As a result,
META-INF/Manifest-*.mf
files are excluded when packaging execution unit jar
files.
Targets
-
compile
compiles all modules.
-
compile.module
compiles a specific module and copy resources to
classes/
. Shortcuts are generated.
-
compile.rec.module
compiles a specific module and recursively its
dependencies. Shortcuts are generated.
-
jars
compiles and builds all module jar files.
-
jars.rec.module
compiles and builds a specific module's jar files and
recursively its dependencies. Shortcuts are generated.
-
clean
cleans all modules.
-
clean.module
cleans a module. Shortcuts are generated.
-
clean.rec.module
cleans a module and its dependencies.
Shortcuts are generated.
-
compile.clean.hook
is the default target registered in clean.[module]
hook chain. It is responsible to delete classes
directory and generated
jars files.
-
jars.manifest.module.eu
generates the META-INF/Manifest-eu.mf
file per
execution unit with its Class-Path
attribute. It is registered in the
pre.jar.[module].[eu]
hook chain.
The
compile
and
jars
targets checks if the source directory
java/
is
present in the module directory. If not, nothing is done.
Attributes
Global
-
compile.resources.includes
is the global value for the includes
argument for the Ant fileset
used in copy
task from java/
to
classes/
directories. Default is **/*
.
-
compile.resources.excludes
is the global value for the excludes
argument for the Ant fileset
used in copy
task from java/
to
classes/
directories. Default is
**/.cvsignore,**/*.java,**/doc-file/*
.
-
compile.jar.includes
is the global value for the includes
argument for
the Ant fileset
used in jar
task on the classes/
directory. Default
is **/*
.
-
compile.jar.excludes
is the global value for the excludes
argument for
the Ant fileset
used in jar
task on the classes/
directory. Default
is empty.
-
compile.sources.directory
is the directory name where the module Java
source files are located. This property applies to all modules. Default is
java
.
-
compile.classes.directory
is the directory path where Class files must
be generated. Argument 0 is the declared module path and argument 1 is the
module name. Default is dist/classes/{1}
. You may want generated classes
in {0}/classes
for instance.
Per module
-
compile.resources.includes
is the module value for the includes
argument for the Ant fileset
used in copy
task from java/
to
classes/
directories. Default is the same global attribute's value.
-
compile.resources.excludes
is the module value for the excludes
argument for the Ant fileset
used in copy
task from java/
to
classes/
directories. Default is the same global attribute's value.
-
compile.nosources
is a flag to mark that the java/
directory does not
exists. Compiled jar files (execution units) are used if they
exist. Default value is false
.
-
compile.noclasses
is a flag to mark that classes/
and jar files must
not be generated. Default value is false
.
-
compile.classes
is the specific location of the module classes/
directory. If not set, it is generated from plugin
compile.classes.directory
pattern.
Per execution unit
-
compile.jar.includes
is the execution unit value for the includes
argument for the Ant fileset
used in jar
task on the classes/
directory. Default is the same global attribute's value.
-
compile.jar.excludes
is the execution unit value for the excludes
argument for the Ant fileset
used in jar
task on the classes/
directory. Default is the same global attribute's value.
-
compile.jar
is an optional attribute to set the jar file name. Its
default value is modulename-eu.jar
. If the name is a single file name
without directories, then it is relative to dist/lib
. If the file path
is relative, it is relative to the project directory.
Hooks
-
pre.compile.[module]
and post.compile.[module]
called unconditionnaly
in compile.module
. If the module is compilable (when compile.nosources
flag is not set), pre.javac.[module]
and post.javac.[module]
are
called around the javac task invocation. The following properties are set
to be used in targets registered on that hook chains:
-
module
is the current module name
-
module.src
is the module java/
directory
-
module.classes
is the module classes/
directory
-
module.classpath
is the module compilation ClassPath
-
module.src.exists
is set if the java/
directory is available
-
module.resources.includes
is the module includes
argument for the
Ant fileset
used in copy
task from java/
to classes/
directories
-
module.resources.excludes
is the module excludes
argument for the
Ant fileset
used in copy
task from java/
to classes/
directories
-
pre.jar.[module].[eu]
and post.jar.[module].[eu]
called in
jars.rec.module
. The following properties are set:
-
module
is the current module name
-
eu
is the current execution unit name
-
jarfile
is the target jar file to create or update
-
module.src
is the module java/
directory
-
module.classes
is the module classes/
directory
-
module.src.exists
is set if the java/
directory is available
-
module.classes.includes
is the module includes
argument for the Ant
fileset
used in jar
task on the classes/
directory
-
module.classes.excludes
is the module excludes
argument for the Ant
fileset
used in jar
task on the classes/
directory
-
clean.[module]
is used to register cleaning task per module according to
generated files. Default chain contains compile.clean.hook
.
Hooks are called even if the source directory
java/
is not present.
Runtime
This plugin provides execution targets to run a java command corresponding to a
module execution unit.
Declaration
<plugin name="runtime"/>
Dependencies
Targets
-
start.module.eu
executes the java command for a module execution unit
with generated jars in ClassPath. Shortcuts are generated if the module
or execution unit runtime.runnable
is set.
-
startdev.module.eu
executes the java command for a module execution unit
with classes/
directories in ClassPath. Shortcuts are generated if
the module or execution unit runtime.runnable
is set.
Attributes
Global
-
runtime.default.command.creator
must be a valid
java command creator. Default value is
runtime.command.creator.basic
.
Per module
-
runtime.runnable
declares that all execution units are runnable if the
attribute value is true
. By default a module is not runnable.
If no execution unit is declared,
-
runtime.directory
is the execution directory. Default is dist/runtime
.
-
runtime.command.creator
can define the module specific java command
creator. See command creators section.
- In case you use
runtime.command.creator.basic
, runtime.class
must be
set to a class name with public static void main(String[])
method.
Per execution unit
-
runtime.runnable
declares that the concerned execution unit is runnable
if the attribute value is true
(or not defined). By default an execution
unit is not runnable.
-
runtime.directory
is the execution directory. Default is dist/runtime
.
-
runtime.command.creator
can define the execution unit specific java
command creator. See
command creators section.
- In you use
runtime.command.creator.basic
, runtime.class
must be set to
a class name with public static void main(String[])
method.
Command creators
Command creators are targets used to create the original java command before
hook targets registered in
runtime.[module].[eu]
are called to modify it.
The creator definition with
runtime.command.creator
has a specific
behavior. If an execution unit does not specify a creator, the first creator
defined in its dependencies is used. If no creator definition is found, then
the plugin default setting is used. Only one creator per execution unit can be
defined.
-
runtime.command.creator.basic
creates a basic java command, using the
execution unit attribute runtime.class
(or the module attribute if no
eu)
A plugin may provide alternate runtime command creators but its usage is hidden.
Basic command creator argument passing
When running a execution unit with the
runtime.command.creator.basic
(default
behavior), the
runtime.class
is used as main class.
You can pass arguments to the main class different ways:
- with
runtime.arguments
attribute set in the module execution unit
- with
-Druntime.arguments="arg1 arg2 arg3"
set in the Ant command line
- in any case,
-Druntime.append.arguments="arg4 arg5"
can be used to
append arguments to the current list (from runtime.arguments
property)
Hooks
-
runtime.[module].[eu]
hook is designed to enable the modification of the
java command created by the module runtime.command.creator
. The name of
the current java command is command.${module}.${eu}
. Those hook targets
are called recursively in module dependencies by the start targets.
-
pre.start.[module].[eu]
targets are called before java command creation.
-
post.start.[module].[eu]
targets are called after java command execution
ends.
Registered targets in these three hooks can work with the following properties:
-
module
is the caller module name
-
eu
is the caller execution unit name
-
module.eu.classpath
is the module execution unit class with jars or
module classes according to the caller target (start
or startdev
)
-
module.runtime.creator
is the module creator target.
-
module.eu.dependencies
is the module.eu dependency list for the current
execution unit.
When the
runtime.command.creator.basic
is used,
runtime.[module].[eu]
and
post.start.[module].[eu]
targets can work with the following property:
-
module.eu.class
is the current execution unit runtime.class
main class
to run.
Show
This plugin shows the project model information on the console with Ant logging
INFO level at the end of the project configuration (execution of
ant -f bootstrap.xml
or
ant configure
when already configured) with the
[Model]
task prefix.
Currently displayed information: Modules, execution units, dependencies to jars
and to module with eu mappings, sets with modules registered in them.
Declaration
<plugin name="show"/>
Online library
This plugin downloads lacking jar files from a list of repositories according
to its file name.
Declaration
<plugin name="onlinelib">
<attribute name="onlinelib.repository" value="http://el4.elca-services.ch/el4ant/jars/"/>
<attribute name="onlinelib.repository" value="http://el4.elca-services.ch/el4ant/jar-sources/"/>
</plugin>
Usage
You can easily create your own repositories of files using all supported
protocol by
wget
:
http://
,
ftp://
or even
file://
if local. Expected
files must be available in a the refered directory.
When the plugin is declared, download of lacking files is effective, and if a
file is optional, the trial is done at each configuration, which slows the
configuration step.
Here is a way to control when the download can be done. Use the following
declaration in your project description:
<antcontrib:if xmlns:antcontrib="antlib:net.sf.antcontrib">
<ant:isset property="online"/>
<antcontrib:then>
<plugin name="onlinelib" file="buildsystem/core/onlinelib.xml">
<attribute name="onlinelib.repository" value="http://el4.elca-services.ch/el4ant/jars/"/>
<attribute name="onlinelib.repository" value="http://el4.elca-services.ch/el4ant/jar-sources/"/>
</plugin>
</antcontrib:then>
<antcontrib:else>
<ant:echo level="info">You can enable online plugin with -Donline=t at configuration to download files.</ant:echo>
</antcontrib:else>
</antcontrib:if>
So the plugin
onlinelib
is only declared when the system property
online
is
set on the command line.
ant -f bootstrap.xml configure -Donline=t
Attributes
Global
-
onlinelib.repository
declares a repository URL. Mind the ending /
, for
instance http://el4ant.sourceforge.net/repository/jars/
. No default
value. The attribute may be used many times to declare more than one
repository.