#-- # Copyright (c) 2010-2012 Engine Yard, Inc. # Copyright (c) 2007-2009 Sun Microsystems, Inc. # This source code is available under the MIT license. # See the file LICENSE.txt for details. #++ require 'set' require 'warbler/gems' require 'warbler/traits' module Warbler # Warbler archive assembly configuration class. class Config include RakeHelper TOP_DIRS = %w(app db config lib log script vendor) FILE = "config/warble.rb" BUILD_GEMS = %w(warbler rake rcov) include Traits # Features: additional options controlling how the jar is built. # Currently the following features are supported: # - gemjar: package the gem repository in a jar file in WEB-INF/lib # - executable: embed a web server and make the war executable # - compiled: compile .rb files to .class files attr_accessor :features # Traits: an array of trait classes corresponding to # characteristics of the project that are either auto-detected or # configured. attr_accessor :traits # Deprecated: No longer has any effect. attr_accessor :staging_dir # Directory where the war file will be written. Can be used to direct # Warbler to place your war file directly in your application server's # autodeploy directory. Defaults to the root of the application directory. attr_accessor :autodeploy_dir # Top-level directories to be copied into WEB-INF. Defaults to # names in TOP_DIRS attr_accessor :dirs # Additional files beyond the top-level directories to include in the # WEB-INF directory attr_accessor :includes # Files to exclude from the WEB-INF directory attr_accessor :excludes # Java classes and other files to copy to WEB-INF/classes attr_accessor :java_classes # Java libraries to copy to WEB-INF/lib attr_accessor :java_libs # Rubygems to install into the webapp. attr_accessor :gems # Whether to include dependent gems (default true) attr_accessor :gem_dependencies # Array of regular expressions matching relative paths in gems to # be excluded from the war. Default contains no exclusions. attr_accessor :gem_excludes # Whether to exclude **/*.log files (default is true) attr_accessor :exclude_logs # Public HTML directory file list, to be copied into the root of the war attr_accessor :public_html # Container of pathmaps used for specifying source-to-destination transformations # under various situations (public_html and java_classes are two # entries in this structure). attr_accessor :pathmaps # Executable of the jar attr_accessor :executable # parameters to pass to the executable attr_accessor :executable_params # Name of jar or war file (without the extension), defaults to the # directory name containing the application. attr_accessor :jar_name # Extension of jar file. Defaults to jar or war depending on the project. attr_accessor :jar_extension # Name of a MANIFEST.MF template to use. attr_accessor :manifest_file # Files for WEB-INF directory (next to web.xml). Contains web.xml by default. # If there are .erb files they will be processed with webxml config. attr_accessor :webinf_files # Use Bundler to locate gems if Gemfile is found. Default is true. attr_accessor :bundler # An array of Bundler groups to avoid including in the war file. # Defaults to ["development", "test", "assets"]. attr_accessor :bundle_without # Use JBundler to locate gems if Jarfile is found. Default is true. attr_accessor :jbundler # Path to the pre-bundled gem directory inside the war file. Default is '/WEB-INF/gems'. # This also sets 'gem.path' inside web.xml. attr_accessor :gem_path # List of ruby files to compile to class files. Default is to # compile all .rb files in the application. attr_accessor :compiled_ruby_files # Determines if ruby files in supporting gems will be compiled. # Ignored unless compile feature is used. attr_accessor :compile_gems # Warbler writes an "init" file into the war at this location. JRuby-Rack and possibly other # launchers may use this to initialize the Ruby environment. attr_accessor :init_filename # Array containing filenames or StringIO's to be concatenated together to form the init file. # If the filename ends in .erb the file will be expanded the same way web.xml.erb is; see below. attr_accessor :init_contents # Override GEM_HOME environment variable at runtime. When false, gems in # GEM_HOME will be loaded in preference to those packaged within the jar # file. When true, only gems packaged in the jar file will be loaded. # Defaults to true attr_accessor :override_gem_home # Explicit bytecode version for compiled ruby files. If given bytecode version is # specified when ruby files are compiled using jrubyc attr_accessor :bytecode_version # Extra configuration for web.xml. Controls how the dynamically-generated web.xml # file is generated. # # * webxml.jndi -- the name of one or more JNDI data sources name to be # available to the application. Places appropriate <resource-ref> entries # in the file. # * webxml.ignored -- array of key names that will be not used to # generate a context param. Defaults to ['jndi', 'booter'] # # Any other key/value pair placed in the open structure will be dumped as a # context parameter in the web.xml file. Some of the recognized values are: # # * webxml.rails.env -- the Rails environment to use for the # running application, usually either development or production (the # default). # * webxml.gem.path -- the path to your bundled gem directory # * webxml.jruby.min.runtimes -- minimum number of pooled runtimes to # keep around during idle time # * webxml.jruby.max.runtimes -- maximum number of pooled Rails # application runtimes # # Note that if you attempt to access webxml configuration keys in a conditional, # you might not obtain the result you want. For example: # <%= webxml.maybe.present.key || 'default' %> # doesn't yield the right result. Instead, you need to generate the context parameters: # <%= webxml.context_params['maybe.present.key'] || 'default' %> attr_accessor :webxml # Embedded webserver to use. Currently supported webservers are: # * winstone (default) - Winstone 0.9.10 from sourceforge # * jenkins-ci.winstone - Improved Winstone from Jenkins CI # * jetty - Embedded Jetty from Eclipse attr_accessor :webserver # If set to true, Warbler will move jar files into the WEB-INF/lib directory of the # created war file. This may be needed for some web servers. Defaults to false. attr_accessor :move_jars_to_webinf_lib # These file will be placed in the META-INF directory of the jar or war that warbler # produces. They are primarily used as launchers by the runnable feature. attr_accessor :script_files attr_reader :warbler_templates attr_reader :warbler_scripts def initialize(warbler_home = WARBLER_HOME) super() @warbler_home = warbler_home @warbler_templates = "#{WARBLER_HOME}/lib/warbler/templates" @features = Set.new @dirs = TOP_DIRS.select {|d| File.directory?(d)} @includes = FileList['*file'] # [r/R]akefile gets included @excludes = FileList[] @java_libs = FileList[] @java_classes = FileList[] @gems = Warbler::Gems.new @gem_dependencies = true @gem_excludes = [] @exclude_logs = true @public_html = FileList[] @jar_name = File.basename(Dir.getwd) @jar_extension = 'jar' @webinf_files = FileList[] @init_filename = 'META-INF/init.rb' @init_contents = ["#{@warbler_templates}/config.erb"] @override_gem_home = true @script_files = [] @warbler_scripts = "#{WARBLER_HOME}/lib/warbler/scripts" @move_jars_to_webinf_lib = false @compile_gems = false before_configure yield self if block_given? after_configure @compiled_ruby_files ||= FileList[*@dirs.map {|d| "#{d}/**/*.rb"}] @excludes += ["tmp/war", "tmp/war/**/*"] if File.directory?("tmp/war") @excludes += ["tmp/cache/**/*"] if File.directory?("tmp/cache") @excludes += warbler_vendor_excludes(warbler_home) @excludes += FileList["**/*.log"] if @exclude_logs end def gems=(value) @gems = Warbler::Gems.new(value) end def relative_gem_path @gem_path[1..-1] end def define_tasks task "gemjar" do self.features << "gemjar" end task "executable" do self.features << "executable" end task "runnable" do self.features << "runnable" end end # Deprecated def war_name $stderr.puts "config.war_name deprecated; replace with config.jar_name" #:nocov: jar_name #:nocov: end # Deprecated def war_name=(w) $stderr.puts "config.war_name deprecated; replace with config.jar_name" #:nocov: self.jar_name = w #:nocov: end private def warbler_vendor_excludes(warbler_home) warbler = File.expand_path(warbler_home) if warbler =~ %r{^#{Dir.getwd}/(.*)} FileList["#{$1}"] else [] end end def dump YAML::dump(self.dup.tap{|c| c.dump_traits }) end public :dump end end