# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with this # work for additional information regarding copyright ownership. The ASF # licenses this file to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. module Buildr module Bnd class << self # The specs for requirements def dependencies ["biz.aQute:bnd:jar:0.0.384"] end # Repositories containing the requirements def remote_repository "http://www.aQute.biz/repo" end def bnd_main(*args) cp = Buildr.artifacts(self.dependencies).each(&:invoke).map(&:to_s) Java::Commands.java 'aQute.bnd.main.bnd', *(args + [{ :classpath => cp }]) end end class BundleTask < Rake::FileTask attr_reader :project attr_accessor :classpath def [](key) @params[key] end def []=(key, value) @params[key] = value end def classpath_element(dependencies) artifacts = Buildr.artifacts([dependencies]) self.prerequisites << artifacts artifacts.each do |dependency| self.classpath << dependency.to_s end end def to_params params = self.project.manifest.merge(@params).reject { |k, v| v.nil? } params["-classpath"] ||= self.classpath.collect(&:to_s).join(", ") params['Bundle-SymbolicName'] ||= [self.project.group, self.project.name.gsub(':', '-')].join('.') params['Bundle-Name'] ||= self.project.comment || self.project.name params['Bundle-Description'] ||= self.project.comment params['Bundle-Version'] ||= self.project.version if params["Include-Resource"].nil? && !project.resources.target.nil? params["Include-Resource"] = "#{project.resources.target}/" end params['-removeheaders'] ||= "Include-Resource,Bnd-LastModified,Created-By,Implementation-Title,Tool" params end def project=(project) @project = project end def classpath=(classpath) @classpath = [] Buildr.artifacts([classpath.flatten.compact]).each do |dependency| self.prerequisites << dependency @classpath << dependency.to_s end @classpath end def classpath @classpath ||= ([project.compile.target] + project.compile.dependencies).flatten.compact end protected def initialize(*args) #:nodoc: super @params = {} enhance do filename = self.name # Generate BND file with same name as target jar but different extension bnd_filename = filename.sub /(\.jar)?$/, '.bnd' params = self.to_params params["-output"] = filename File.open(bnd_filename, 'w') do |f| f.print params.collect { |k, v| "#{k}=#{v}" }.join("\n") end Buildr::Bnd.bnd_main( "build", "-noeclipse", bnd_filename ) begin Buildr::Bnd.bnd_main( "print", "-verify", filename ) rescue => e rm filename raise e end end end end module ProjectExtension include Extension first_time do desc "Does `bnd print` on the packaged bundle and stdouts the output for inspection" Project.local_task("bnd:print") end def package_as_bundle(filename) project.task('bnd:print' => [filename]) do |task| Buildr::Bnd.bnd_main("print", filename) end dirname = File.dirname(filename) directory(dirname) # Add Buildr.application.buildfile so it will rebuild if we change settings task = BundleTask.define_task(filename => [Buildr.application.buildfile, dirname]) task.project = self # the last task is the task considered the packaging task task end # Change the bundle package to .jar extension def package_as_bundle_spec(spec) spec.merge(:type => :jar) end end end end class Buildr::Project include Buildr::Bnd::ProjectExtension end