jruby-warck 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # jruby-warck
2
+
3
+ jruby-warck takes any Rack-based application and sticks it in a .war file that you can run either
4
+
5
+ * with "java -jar" or
6
+ * inside a servlet container like Tomcat, JBoss or Jetty.
7
+
8
+ Yes, it's like Warbler, but far simpler.
9
+
10
+ ## Usage
11
+
12
+ ### Dependencies
13
+ * jruby-jars
14
+ * jruby-rack
15
+
16
+ ### Basic
17
+
18
+ 1. change directory to the root of your application
19
+ 2. run "rake assets:precompile" if you've a Rails application.
20
+ 3. run "warck package[war_name_here]"
21
+ 3a. if you need to compile the source code, use "warck package_compiled[war_name_here]" instead
22
+ 4. boom, a wild war_name_here.war appears!
23
+ 5. deploy in your app server or run it in the command line
24
+
25
+ ### Customizing what gets in the .war
26
+
27
+ #### Files
28
+ When packaging, jruby-warck will include all .rb files in the web archive.
29
+
30
+ Additionally, by default it will also include all .yml and .erb files, but there are two ways you can use to change this.
31
+
32
+ * To select exactly what files will be brought, create a "select.files" inside the application directory containing a glob pattern per line for the filenames you need. Note that this will override the default, so that no other files will be included.
33
+
34
+ * To keep any files from being included, create "reject.files" inside the app directory containing a glob pattern per line for the filenames you want to reject.
data/bin/warck ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env jruby
2
+ require 'jruby-warck'
3
+ JrubyWarck::Application.new.run
@@ -0,0 +1,62 @@
1
+ require 'rake'
2
+ require 'jruby-rack'
3
+
4
+ module JrubyWarck
5
+ module Constants
6
+ HOME = File.expand_path(File.dirname(__FILE__) + '/../..') unless defined?(HOME)
7
+
8
+ WEB_XML = <<-XML
9
+ <!DOCTYPE web-app PUBLIC
10
+ "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
11
+ "http://java.sun.com/dtd/web-app_2_3.dtd">
12
+ <web-app>
13
+ <filter>
14
+ <filter-name>RackFilter</filter-name>
15
+ <filter-class>org.jruby.rack.RackFilter</filter-class>
16
+ </filter>
17
+ <filter-mapping>
18
+ <filter-name>RackFilter</filter-name>
19
+ <url-pattern>/*</url-pattern>
20
+ </filter-mapping>
21
+
22
+ <listener>
23
+ <listener-class><%= context_listener %></listener-class>
24
+ </listener>
25
+ </web-app>
26
+ XML
27
+
28
+ CONTEXT_LISTENERS = {
29
+ :rack => "org.jruby.rack.RackServletContextListener",
30
+ :rails => "org.jruby.rack.rails.RailsServletContextListener"
31
+ }
32
+
33
+ MANIFEST_MF = <<-MANIFEST
34
+ Manifest-Version: 1.0
35
+ Created-By: jruby-warck
36
+ Main-Class: org.jruby.JarBootstrapMain
37
+ Class-Path: /opt/jruby/lib/jruby-complete/jruby-complete.jar #{::JRubyJars.jruby_rack_jar_path}
38
+ MANIFEST
39
+
40
+ INIT = <<-_INIT
41
+ # rack.version: #{JRuby::Rack::VERSION}
42
+ _INIT
43
+
44
+ RUNNING_FROM = Dir.pwd
45
+
46
+ BUILD_DIR = "/tmp/war-#{Time.now.to_i}"
47
+ WEB_INF = BUILD_DIR + "/WEB-INF"
48
+ META_INF = BUILD_DIR + "/META-INF"
49
+
50
+ RACKUP_FILE = "config.ru"
51
+
52
+ BOOTSTRAP_ERB = File.read(File.exist?(custom_bootstrap = RUNNING_FROM + "/jar-bootstrap.rb.erb") ? custom
53
+ : (HOME + "/lib/templates/jar-bootstrap.rb.erb"))
54
+
55
+ # additional filename patterns to be included inside the archive
56
+ # default is all yml files
57
+ SELECT_FILES = FileList[IO.readlines(Dir.pwd + "/select.files").map(&:chomp).reject { |line| line[0] == "#" }] rescue FileList["**/*.yml", "**/*.erb"]
58
+ # filename patterns to be rejected from the archive
59
+ # default is none
60
+ REJECT_FILES = FileList[IO.readlines(Dir.pwd + "/reject.files").map(&:chomp).reject { |line| line[0] == "#" }] rescue FileList[]
61
+ end
62
+ end
@@ -0,0 +1,140 @@
1
+ require 'rake'
2
+ require 'erb'
3
+ require 'jruby-warck/constants'
4
+
5
+ module JrubyWarck::Manipulations
6
+ include JrubyWarck::Constants
7
+
8
+ def create_archive_dirs
9
+ puts "++ Creating archive directories"
10
+ mkdir_p "#{BUILD_DIR}/assets" if Rake::Task.task_defined?("assets:precompile")
11
+ mkdir_p WEB_INF
12
+ mkdir_p META_INF
13
+ end
14
+
15
+ def add_manifest_file
16
+ puts "++ Adding MANIFEST to #{META_INF}"
17
+ manifest = File.new(META_INF + "/MANIFEST.MF", "w")
18
+ manifest.puts(MANIFEST_MF)
19
+ manifest.close
20
+ end
21
+
22
+ def generate_deployment_descriptor(path, framework = :rack)
23
+ puts "++ Generating web.xml"
24
+ context_listener = CONTEXT_LISTENERS[framework.to_sym]
25
+
26
+ web_xml = File.new(path, "w")
27
+ web_xml.puts(ERB.new(WEB_XML).result(binding))
28
+ web_xml.close
29
+ end
30
+
31
+ def add_deployment_descriptor(framework = :rack)
32
+ web_xml_path = "web.xml"
33
+
34
+ # if there is no web.xml file, generate it
35
+ generate_deployment_descriptor(web_xml_path, framework) if !File.exist?(web_xml_path)
36
+
37
+ puts "++ Adding web.xml to #{WEB_INF}"
38
+ cp web_xml_path, "#{WEB_INF}"
39
+ end
40
+
41
+ def add_init_file
42
+ puts "++ Generating init.rb"
43
+
44
+ init = File.new(META_INF + "/init.rb", "w")
45
+ init.puts(INIT)
46
+ init.close
47
+ end
48
+
49
+ def add_rackup_file
50
+ puts "++ Copying #{RACKUP_FILE} to #{WEB_INF}"
51
+ cp RACKUP_FILE, WEB_INF
52
+ end
53
+
54
+ def add_ruby_files
55
+ @ruby_files = FileList["**/*.rb"]
56
+ puts "++ Copying #{@ruby_files.size} Ruby sources to #{WEB_INF}"
57
+
58
+ @ruby_files.each do |file|
59
+ mkdir_p file.pathmap(WEB_INF + "/%d") unless File.exists? file.pathmap(WEB_INF + "/%d")
60
+ cp file, (WEB_INF + "/" + file)
61
+ end
62
+ end
63
+
64
+ def add_class_files
65
+ puts "++ Moving .class files to #{WEB_INF}"
66
+ puts "++ Generating .rb stubs in #{WEB_INF}"
67
+
68
+ @class_files.each do |file|
69
+ mkdir_p file.pathmap(WEB_INF + "/%d") unless File.exists? file.pathmap(WEB_INF + "/%d")
70
+ mv file, (WEB_INF + "/" + file)
71
+
72
+ stub = File.open((WEB_INF + "/" + file).sub(/\.class$/, ".rb"), "w")
73
+ stub.puts("load __FILE__.sub(/\.rb$/, '.class')")
74
+ stub.close
75
+ end
76
+ end
77
+
78
+ def add_public_files
79
+ puts "++ Copying public files to #{BUILD_DIR}"
80
+
81
+ (FileList["public/**/*"] - FileList[REJECT_FILES]).each do |file|
82
+ if File.directory?(file)
83
+ puts " ++ Creating #{file.pathmap("%{public,#{BUILD_DIR}}d/%f")
84
+ }"
85
+ mkdir_p file.pathmap("%{public,#{BUILD_DIR}}d/%f")
86
+ else
87
+ puts " ++ Copying #{file.pathmap("%{public,#{BUILD_DIR}}d/%f")
88
+ }"
89
+ cp file, file.pathmap("%{public,#{BUILD_DIR}}d/%f")
90
+ end
91
+ end
92
+ end
93
+
94
+ def add_additional_files
95
+ puts "++ Copying additional files to #{WEB_INF}"
96
+ FileList[SELECT_FILES].each do |file|
97
+ mkdir_p file.pathmap("#{WEB_INF}/%d") unless File.exists?(file.pathmap("#{WEB_INF}/%d"))
98
+ cp file, file.pathmap("#{WEB_INF}/%d/%f")
99
+ end
100
+ end
101
+
102
+ def add_bootstrap_script(archive_name)
103
+ puts "++ Creating bootstrapping script"
104
+ bootstrap = File.new("#{BUILD_DIR}/jar-bootstrap.rb", "w")
105
+ # archive_name gets passed in the binding
106
+ bootstrap.puts(ERB.new(BOOTSTRAP_ERB).result(binding))
107
+ bootstrap.close
108
+ end
109
+
110
+ def archive_war(archive_name)
111
+ puts "++ Creating war file #{archive_name}.war"
112
+
113
+ if File.exist? "#{archive_name}.war"
114
+ $stderr.puts "!! #{archive_name}.war already exists, aborting"
115
+ exit 1
116
+ end
117
+
118
+ Zip::ZipFile.open("#{RUNNING_FROM}/#{archive_name}.war", Zip::ZipFile::CREATE) do |zip|
119
+ Dir.chdir(BUILD_DIR)
120
+ Dir["**/"].each { |d| zip.mkdir(d, 0744) }
121
+ FileList["**/*"].exclude { |f| File.directory?(f) }.each { |f| puts " ++ Adding #{f}"; zip.add(f, f) }
122
+
123
+ zip.close
124
+ end
125
+ end
126
+
127
+ def compile_ruby_scripts
128
+ @ruby_files = FileList["**/*.rb"]
129
+
130
+ `jrubyc #{@ruby_files.join(" ")}`
131
+
132
+ @class_files = FileList["**/*.class"] - FileList["tmp/**/*"]
133
+
134
+ unless @ruby_files.size.eql?(@class_files.size)
135
+ puts "** Warning: it seems that some ruby files were not compiled"
136
+ puts ".rb files: #{@ruby_files.size}"
137
+ puts ".class files: #{@class_files.size}"
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,45 @@
1
+ require 'jruby-warck/manipulations'
2
+ require 'jruby-warck/constants'
3
+
4
+ include JrubyWarck::Manipulations
5
+ include JrubyWarck::Constants
6
+
7
+ desc "Create a .war package out of this application"
8
+ task :package, [:archive_name, :framework] do |t, args|
9
+ args.with_defaults(:archive_name => File.basename(RUNNING_FROM), :framework => :rack)
10
+
11
+ create_archive_dirs
12
+ add_manifest_file
13
+ add_deployment_descriptor(args[:framework])
14
+ add_rackup_file if File.exists?(RACKUP_FILE)
15
+ add_init_file
16
+ add_ruby_files
17
+ add_public_files
18
+ add_additional_files
19
+ add_bootstrap_script(args[:archive_name])
20
+ archive_war(args[:archive_name])
21
+ end
22
+
23
+ desc "Create a .war package out of this application, compiling Ruby sources to .class files"
24
+ task :package_compiled, [:archive_name, :framework] do |t, args|
25
+ args.with_defaults(:archive_name => File.basename(RUNNING_FROM), :framework => :rack)
26
+
27
+ create_archive_dirs
28
+ add_manifest_file
29
+ add_deployment_descriptor(args[:framework])
30
+ add_rackup_file if File.exists?(RACKUP_FILE)
31
+ add_init_file
32
+ compile_ruby_scripts
33
+ add_class_files
34
+ add_public_files
35
+ add_additional_files
36
+ add_bootstrap_script(args[:archive_name])
37
+ archive_war(args[:archive_name])
38
+ end
39
+
40
+ desc "Generate a deployment descriptor (web.xml) to be customized for this application"
41
+ task :webxml, :framework do |t, args|
42
+ args.with_defaults(:framework => :rack)
43
+
44
+ generate_deployment_descriptor("web.xml", args[:framework])
45
+ end
@@ -0,0 +1,13 @@
1
+ module JrubyWarck
2
+ module VERSION
3
+ MAJOR = 1
4
+ MINOR = 0
5
+ PATCH = 1
6
+
7
+ STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
+
9
+ def self.version
10
+ STRING
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,40 @@
1
+ require 'rake'
2
+ require 'jruby-warck/version'
3
+ require 'jruby-warck/constants'
4
+ require 'jruby-warck/manipulations'
5
+
6
+ require 'zip/zip'
7
+ require 'erb'
8
+
9
+ class JrubyWarck::Application < Rake::Application
10
+ include JrubyWarck::Constants
11
+ include JrubyWarck::Manipulations
12
+ include Rake::DSL
13
+
14
+ def name
15
+ 'warck'
16
+ end
17
+
18
+ def initialize
19
+ super
20
+ end
21
+
22
+ def load_rakefile
23
+ Rake::TaskManager.record_task_metadata = true
24
+ task :default do
25
+ options.show_tasks = :tasks
26
+ options.show_task_pattern = //
27
+ puts "#{name} #{JrubyWarck::VERSION.version} -- package your Rack application in a .war file that can be run from the command line or in a servlet container!"
28
+ puts "Available commands:"
29
+ display_tasks_and_comments
30
+ end
31
+
32
+ load 'jruby-warck/tasks/jruby.rake'
33
+ end
34
+
35
+ def run
36
+ Rake.application = self
37
+ super
38
+ end
39
+ end
40
+
@@ -0,0 +1,17 @@
1
+ require 'rubygems'
2
+ require 'zip/zip'
3
+
4
+ unless File.exist?("<%= archive_name %>.war.extracted")
5
+ puts "First run... extracting war contents to <%= archive_name %>.war.extracted..."
6
+ %x{unzip <%= archive_name %>.war -d<%= archive_name %>.war.extracted}
7
+ puts "Done."
8
+ end
9
+
10
+ puts "Loading Puma..."
11
+
12
+ Dir.chdir("<%= archive_name %>.war.extracted/WEB-INF")
13
+
14
+ NOT_IN_SERVLET_CONTAINER = true
15
+
16
+ gem 'puma'
17
+ load Gem.bin_path('puma', 'puma')
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jruby-warck
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Nuno Correia
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-10-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rack
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rubyzip
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: jruby-jars
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: jruby-rack
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: Kinda like warbler, except WAR-only and contained in a single Rakefile.
79
+ email:
80
+ - nuno-g-correia@ext.ptinovacao.pt
81
+ executables:
82
+ - warck
83
+ extensions: []
84
+ extra_rdoc_files: []
85
+ files:
86
+ - bin/warck
87
+ - lib/templates/jar-bootstrap.rb.erb
88
+ - lib/jruby-warck/tasks/jruby.rake
89
+ - lib/jruby-warck/manipulations.rb
90
+ - lib/jruby-warck/constants.rb
91
+ - lib/jruby-warck/version.rb
92
+ - lib/jruby-warck.rb
93
+ - README.md
94
+ homepage: http://github.com/ptinovacao/rubygem-jruby-warck
95
+ licenses: []
96
+ post_install_message:
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ! '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ requirements: []
113
+ rubyforge_project:
114
+ rubygems_version: 1.8.23
115
+ signing_key:
116
+ specification_version: 3
117
+ summary: Kinda like warbler, except our way
118
+ test_files: []