Author: assaf
Date: Tue Feb 5 17:17:39 2008
New Revision: 618849
URL: http://svn.apache.org/viewvc?rev=618849&view=rev
Log:
BUILDR-26
Modified:
incubator/buildr/trunk/lib/java/packaging.rb
incubator/buildr/trunk/spec/java_packaging_spec.rb
Modified: incubator/buildr/trunk/lib/java/packaging.rb
URL:
http://svn.apache.org/viewvc/incubator/buildr/trunk/lib/java/packaging.rb?rev=618849&r1=618848&r2=618849&view=diff
==============================================================================
--- incubator/buildr/trunk/lib/java/packaging.rb (original)
+++ incubator/buildr/trunk/lib/java/packaging.rb Tue Feb 5 17:17:39 2008
@@ -312,7 +312,7 @@
component = options.merge(:artifact=>artifact, :type=>type,
:id=>artifact.respond_to?(:to_spec) ? artifact.id :
artifact.to_s.pathmap('%n'),
:path=>options[:path] || dirs[type].to_s)
- update_classpath(file(artifact.to_s)) unless :lib == type
+ update_classpath(component) unless :lib == type
@components << component
self
end
@@ -334,7 +334,9 @@
end
alias_method :_, :path_to
- def update_classpath(package)
+ def update_classpath(component)
+ package = file(component[:artifact].to_s)
+ package.manifest = package.manifest.dup # avoid mofifying parent
projects manifest
package.prepare do
header = case package.manifest
when Hash then package.manifest
@@ -346,7 +348,7 @@
included_libs = class_path.map { |fn| File.basename(fn) }
included_libs += package.path('WEB-INF/lib').sources.map { |fn|
File.basename(fn) }
# Include all other libraries in the classpath.
- class_path += libs_classpath.reject { |path|
included_libs.include?(File.basename(path)) }
+ class_path += libs_classpath(component).reject { |path|
included_libs.include?(File.basename(path)) }
header['Class-Path'] = class_path.join(' ')
end
end
@@ -354,46 +356,77 @@
private
+ # :call-seq:
+ # relative_path(to_component, from_component = nil)
+ #
+ def relative_path(to, from = ".")
+ to = File.join(to[:path].to_s, File.basename(to[:artifact].to_s)) if
to.kind_of?(Hash)
+ from = from[:path].to_s if from.kind_of?(Hash)
+ to, from = File.expand_path(to, "/"), File.expand_path(from, "/")
+ require 'pathname'
+ Pathname.new(to).relative_path_from(Pathname.new(from)).to_s
+ end
+
# Classpath of all packages included as libraries (type :lib).
- def libs_classpath
+ def libs_classpath(component)
@classpath = @components.select { |comp| comp[:type] == :lib }.
- map { |comp| File.expand_path(File.join(comp[:path],
File.basename(comp[:artifact].to_s)), '/')[1..-1] }
+ map { |comp| relative_path(comp, component) }
end
- # return a FileTask to build the ear application.xml file
- def descriptor
- @descriptor ||= file('META-INF/application.xml') do |task|
- mkpath File.dirname(task.name), :verbose=>false
- File.open task.name, 'w' do |file|
- xml = Builder::XmlMarkup.new(:target=>file, :indent => 2)
- xml.declare! :DOCTYPE, :application, :PUBLIC,
- "-//Sun Microsystems, Inc.//DTD J2EE Application
1.2//EN",
- "http://java.sun.com/j2ee/dtds/application_1_2.dtd"
- xml.application do
- xml.tag! 'display-name', display_name
- @components.each do |comp|
- uri = File.expand_path(File.join(comp[:path],
File.basename(comp[:artifact].to_s)), '/')[1..-1]
- case comp[:type]
- when :war
- xml.module :id=>comp[:id] do
- xml.web do
- xml.tag! 'web-uri', uri
- xml.tag! 'context-root', File.join('',
(comp[:context_root] || comp[:id])) unless comp[:context_root] == false
- end
- end
- when :ejb
- xml.module :id=>comp[:id] do
- xml.ejb uri
- end
- when :jar
- xml.jar uri
+ def descriptor_xml
+ buffer = ""
+ xml = Builder::XmlMarkup.new(:target=>buffer, :indent => 2)
+ xml.declare! :DOCTYPE, :application, :PUBLIC,
+ "-//Sun Microsystems, Inc.//DTD J2EE Application 1.2//EN",
+ "http://java.sun.com/j2ee/dtds/application_1_2.dtd"
+ xml.application do
+ xml.tag! 'display-name', display_name
+ @components.each do |comp|
+ uri = relative_path(comp)
+ case comp[:type]
+ when :war
+ xml.module :id=>comp[:id] do
+ xml.web do
+ xml.tag! 'web-uri', uri
+ xml.tag! 'context-root', File.join('',
(comp[:context_root] || comp[:id])) unless comp[:context_root] == false
end
end
+ when :ejb
+ xml.module :id=>comp[:id] do
+ xml.ejb uri
+ end
+ when :jar
+ xml.jar uri
end
end
end
+ buffer
end
+
+ # return a FileTask to build the ear application.xml file
+ def descriptor
+ return @descriptor if @descriptor
+ descriptor_path = path_to(:target, "#{id}/META-INF/application.xml")
+ @descriptor = file(descriptor_path) do |task|
+ puts "Creating EAR Descriptor: #{task.to_s}" if
Rake.application.options.trace
+ mkpath File.dirname(task.name), :verbose=>false
+ File.open(task.name, 'w') { |file| file.print task.xml }
+ end
+ class << @descriptor
+ attr_accessor :ear
+ def xml
+ @xml ||= ear.send :descriptor_xml
+ end
+
+ def needed?
+ super || xml != File.read(self.to_s) rescue true
+ end
+ end
+ @descriptor.ear = self
+ @descriptor
+ end
+
end
Modified: incubator/buildr/trunk/spec/java_packaging_spec.rb
URL:
http://svn.apache.org/viewvc/incubator/buildr/trunk/spec/java_packaging_spec.rb?rev=618849&r1=618848&r2=618849&view=diff
==============================================================================
--- incubator/buildr/trunk/spec/java_packaging_spec.rb (original)
+++ incubator/buildr/trunk/spec/java_packaging_spec.rb Tue Feb 5 17:17:39 2008
@@ -692,7 +692,7 @@
package(:ear) << package(:jar)
end
inspect_classpath 'war/foo-1.0.war' do |classpath|
- classpath.should include('foo-1.0.jar')
+ classpath.should include('../foo-1.0.jar')
end
end
@@ -773,7 +773,7 @@
package(:ear).add package(:war)
end
inspect_classpath 'war/foo-1.0.war' do |classpath|
- classpath.should include('lib/lib1-1.0.jar', 'lib/lib2-1.0.jar')
+ classpath.should include('../lib/lib1-1.0.jar', '../lib/lib2-1.0.jar')
end
end
@@ -784,8 +784,8 @@
package(:ear).add package(:war)
end
inspect_classpath 'war/foo-1.0.war' do |classpath|
- classpath.should_not include('lib/lib1-1.0.jar')
- classpath.should include('lib/lib2-1.0.jar')
+ classpath.should_not include('../lib/lib1-1.0.jar')
+ classpath.should include('../lib/lib2-1.0.jar')
end
end
@@ -795,7 +795,7 @@
package(:ear).add :ejb=>package(:jar)
end
inspect_classpath 'ejb/foo-1.0.jar' do |classpath|
- classpath.should include('lib/lib1-1.0.jar', 'lib/lib2-1.0.jar')
+ classpath.should include('../lib/lib1-1.0.jar', '../lib/lib2-1.0.jar')
end
end
@@ -805,7 +805,7 @@
package(:ear).add :jar=>package(:jar)
end
inspect_classpath 'jar/foo-1.0.jar' do |classpath|
- classpath.should include('lib/lib1-1.0.jar', 'lib/lib2-1.0.jar')
+ classpath.should include('../lib/lib1-1.0.jar', '../lib/lib2-1.0.jar')
end
end
@@ -815,9 +815,48 @@
package(:ear).add :jar=>package(:jar)
end
inspect_classpath 'jar/foo-1.0.jar' do |classpath|
- classpath.should include('lib/lib1-1.0.jar', 'lib/lib2-1.0.jar')
+ classpath.should include('../lib/lib1-1.0.jar', '../lib/lib2-1.0.jar')
end
end
+
+
+ it 'should generate relative classpaths for top level EJB' do
+ define 'foo', :version => '1.0' do
+ package(:ear).add package(:jar, :id => 'one'), :path => '.'
+ package(:ear).add package(:jar, :id => 'two'), :path => 'dos'
+ package(:ear).add package(:jar, :id => 'three'), :path => 'tres'
+ package(:ear).add :ejb => package(:jar, :id => 'ejb1'), :path => '.'
+ end
+ inspect_classpath 'ejb1-1.0.jar' do |classpath|
+ classpath.should include(*%w{ one-1.0.jar dos/two-1.0.jar
tres/three-1.0.jar })
+ end
+ end
+
+ it 'should generate relative classpaths for second level EJB' do
+ define 'foo', :version => '1.0' do
+ package(:ear).add package(:jar, :id => 'one'), :path => '.'
+ package(:ear).add package(:jar, :id => 'two'), :path => 'dos'
+ package(:ear).add package(:jar, :id => 'three'), :path => 'tres'
+ package(:ear).add :ejb => package(:jar, :id => 'ejb2'), :path => 'dos'
+ end
+ inspect_classpath 'dos/ejb2-1.0.jar' do |classpath|
+ classpath.should include(*%w{ ../one-1.0.jar two-1.0.jar
../tres/three-1.0.jar })
+ end
+ end
+
+ it 'should generate relative classpaths for nested EJB' do
+ define 'foo', :version => '1.0' do
+ package(:ear).add package(:jar, :id => 'one'), :path => '.'
+ package(:ear).add package(:jar, :id => 'two'), :path => 'dos'
+ package(:ear).add package(:jar, :id => 'three'), :path => 'dos/tres'
+ package(:ear).add package(:jar, :id => 'four'), :path => 'dos/cuatro'
+ package(:ear).add :ejb => package(:jar, :id => 'ejb4'), :path =>
'dos/cuatro'
+ end
+ inspect_classpath 'dos/cuatro/ejb4-1.0.jar' do |classpath|
+ classpath.should include(*%w{ ../../one-1.0.jar ../two-1.0.jar
../tres/three-1.0.jar four-1.0.jar })
+ end
+ end
+
end