EarTask implementation
----------------------
Key: BUILDR-5
URL: https://issues.apache.org/jira/browse/BUILDR-5
Project: Buildr
Issue Type: New Feature
Reporter: Victor Hugo Borja
Attached file implements the EarTask to create an EAR file.
Currently, this task is not required at load time, this means users may have
to require it, either by code, or using --require 'tasks/ear'
The following component types are supported by the EARTask:
* :war -- A J2EE Web Application
* :ejb -- An Enterprise Java Bean
* :jar -- A J2EE Application Client.[1]
* :lib -- An ear scoped shared library[2] (for things like logging, spring,
etc) common to the ear components
The EarTask uses the "Mechanism 2: Bundled Optional Classes" as described on
[2]. All
specified libraries are added to the EAR archive and the Class-Path manifiest
entry is
modified for each EAR component. Special care is taken with WebApplications,
as they can
contain libraries on their WEB-INF/lib directory, libraries already included
in a war file
are not referenced by the Class-Path entry of the war in order to avoid class
collissions
EarTask supports all the same options as JarTask, in additon to these two
options:
* :display_name -- The displayname to for this ear on application.xml
* :dirs -- A Hash used to determine the default directory used for each EAR
component type. Default value is Hash.new { |h, k| k.to_s }
this means, wars will be in the "war/" directory inside the
ear,
ejbs under "ejb/" and so on. You can customize this like so:
package(:ear).dirs[:war] = "web-applications"
package(:ear).dirs[:lib] = nil # store shared libraries
on root of archive
EAR components are added by means of the EarTask#add, EarTask#<<, EarTask#push
methods
Component type is determined from the artifact's type.
package(:ear) << project(:coolWebService).package(:war)
The << method is just an alias for push, with the later you can add multiple
components
at the same time. For example..
package(:ear).push "org.springframework:spring:jar:2.6",
projects(:reflectUtils, :springUtils),
project(:coolerWebService).package(:war)
The add method takes a single component with an optional hash. You can use it
to override
some component attributes.
You can override the component type for a particular artifact. The following
example
shows how you can tell the EarTask to treat a jar as an ejb.
# will add an ejb entry for the-cool-ejb-2.5.jar in application.xml
package(:ear).add "org.coolguys:the-cool-ejb:jar:2.5", :type => :ejb
# A better syntax for this is:
package(:ear).add :ejb => "org.coolguys:the-cool-ejb:jar:2.5"
For WebApplications (:war)s, you can customize the context-root to be
generated on
application.xml. The following example also specifies a different directory
inside the EAR
where to store the webapp.
package(:ear).add project(:remoteService).package(:war),
:dir => 'web-services', :context_root =>
'/Some/URL/Path'
VERY IMPORTANT NOTE:
As described on [1] an EAR can have "J2EE Application Clients", these
components are
identified by a :jar component-type. A <jar> entry for each of these
components is
generated on the application.xml descriptor.
However, as these <jar> components are not so frecuent on EAR archives, the
EarTask uses
a special design desicion:
Artifacts having a 'jar' type are treated by the EarTask as :lib components.
This means.. doing something like:
project(:ear) << "spring:spring:jar:1.2" <<
"~/lib/java/log4j-1.0.jar"
.. will add both spring-1.2.jar and log4j-1.0.jar under the "lib/"
directory, adding
them to the Class-Path attribute on ejb|war|jar components.
Because of this, If you want to add a "J2EE Application Client" you must be
explicit
about the component type to use:
project(:ear).add :jar => "org.application:client:jar:2.0"
[1]
http://java.sun.com/j2ee/sdk_1.2.1/techdocs/guides/ejb/html/Overview5.html#10106
[2] http://java.sun.com/j2ee/verified/packaging.html
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.