ruby2jar 0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +674 -0
- data/README +48 -0
- data/Rakefile +83 -0
- data/TODO +2 -0
- data/lib/ruby2jar.rb +31 -0
- data/lib/ruby2jar/builder.rb +436 -0
- data/lib/ruby2jar/console.rb +34 -0
- data/lib/ruby2jar/error.rb +23 -0
- data/lib/ruby2jar/jartask.rb +85 -0
- data/lib/ruby2jar/listener.rb +38 -0
- data/spec/builder/before_spec.rb +105 -0
- data/spec/builder/builder_spec.rb +100 -0
- data/spec/builder/copy_spec.rb +138 -0
- data/spec/builder/create_init_spec.rb +69 -0
- data/spec/builder/fixtures/app/ext/greeters/JavaGreeter.java +7 -0
- data/spec/builder/fixtures/app/greeters/english.rb +8 -0
- data/spec/builder/fixtures/app/main.rb +4 -0
- data/spec/builder/fixtures/jruby/lib/jruby.jar +0 -0
- data/spec/builder/package_spec.rb +52 -0
- data/spec/builder/spec_helper.rb +121 -0
- data/spec/console/console_spec.rb +27 -0
- data/spec/console/spec_helper.rb +17 -0
- data/spec/jartask/jartask_spec.rb +37 -0
- data/spec/listener/listener_spec.rb +49 -0
- data/spec/spec_helper.rb +1 -0
- metadata +90 -0
data/README
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
= Ruby2Jar - build JAR from Ruby script
|
2
|
+
|
3
|
+
Ruby2Jar build JAR from Ruby script. It copy gems, compile sources and
|
4
|
+
package JAR. It is a easy way to distribute your JRuby application or to
|
5
|
+
create Applet or Java Web Start.
|
6
|
+
|
7
|
+
You must have Java SDK to use JAR builder. Also you should run it from JRuby
|
8
|
+
for correct platform in gems.
|
9
|
+
|
10
|
+
If program containt Java files it must be in ext/ dir. Source Java files
|
11
|
+
without class files will be compiled.
|
12
|
+
|
13
|
+
== Installation
|
14
|
+
Use Gem to download and install Ruby2Jar.
|
15
|
+
|
16
|
+
gem install ruby2jar
|
17
|
+
|
18
|
+
== Usage
|
19
|
+
Add to your Rakefile:
|
20
|
+
|
21
|
+
require "ruby2jar"
|
22
|
+
|
23
|
+
PKG_NAME = "program"
|
24
|
+
PKG_VERSION = "0.1"
|
25
|
+
|
26
|
+
Ruby2Jar::Rake::JarTask.new do |jar|
|
27
|
+
jar.files = FileList["lib/**/*", "bin/*"]
|
28
|
+
jar.main = "bin/program"
|
29
|
+
jar.name = PKG_NAME
|
30
|
+
jar.version = PKG_VERSION
|
31
|
+
jar.add_dependency "rspec"
|
32
|
+
end
|
33
|
+
|
34
|
+
== Limitation
|
35
|
+
In current JRuby version (1.1.2) you can't use Ruby file system functions
|
36
|
+
and +__FILE__+ constant in JAR. So didn't use <tt>Dir.glob</tt> to require
|
37
|
+
all files in dir or somethink like this.
|
38
|
+
|
39
|
+
== Gem config
|
40
|
+
Gem can contain building config <tt>java.yaml</tt> in gem root. Builder will
|
41
|
+
find list of exclude file patterns in <tt>jar.exclude</tt> config node.
|
42
|
+
|
43
|
+
== License
|
44
|
+
Ruby2Jar is licensed under the GNU General Public License version 3.
|
45
|
+
You can read it in LICENSE file or in http://www.gnu.org/licenses/gpl.html .
|
46
|
+
|
47
|
+
== Author
|
48
|
+
Andrey "A.I." Sitnik <andrey@sitnik.ru>
|
data/Rakefile
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require "rake/rdoctask"
|
4
|
+
require 'spec/rake/spectask'
|
5
|
+
require 'rake/gempackagetask'
|
6
|
+
|
7
|
+
require File.join(File.dirname(__FILE__), "lib", "ruby2jar")
|
8
|
+
|
9
|
+
##############################################################################
|
10
|
+
# Tests
|
11
|
+
##############################################################################
|
12
|
+
|
13
|
+
desc "Run all specs"
|
14
|
+
Spec::Rake::SpecTask.new('specs') do |t|
|
15
|
+
t.spec_opts = ["--format", "specdoc", "--colour"]
|
16
|
+
t.spec_files = Dir['spec/**/*_spec.rb'].sort
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "Run a specific spec with TASK=xxxx"
|
20
|
+
Spec::Rake::SpecTask.new('spec') do |t|
|
21
|
+
t.spec_opts = ["--format", "specdoc", "--colour"]
|
22
|
+
t.libs = ['lib']
|
23
|
+
t.spec_files = ["spec/**/#{ENV['TASK']}_spec.rb"]
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "Run all specs output html"
|
27
|
+
Spec::Rake::SpecTask.new('specs_html') do |t|
|
28
|
+
t.spec_opts = ["--format", "html"]
|
29
|
+
t.libs = ['lib']
|
30
|
+
t.spec_files = Dir['spec/**/*_spec.rb'].sort
|
31
|
+
end
|
32
|
+
|
33
|
+
desc "RCov"
|
34
|
+
Spec::Rake::SpecTask.new('rcov') do |t|
|
35
|
+
t.spec_opts = ["--format", "specdoc", "--colour"]
|
36
|
+
t.spec_files = Dir['spec/**/*_spec.rb'].sort
|
37
|
+
t.libs = ['lib']
|
38
|
+
t.rcov = true
|
39
|
+
end
|
40
|
+
|
41
|
+
##############################################################################
|
42
|
+
# Documentation and distribution
|
43
|
+
##############################################################################
|
44
|
+
|
45
|
+
Rake::RDocTask.new do |rdoc|
|
46
|
+
rdoc.main = "README"
|
47
|
+
rdoc.rdoc_files.include("README", "LICENSE", "lib/**/*.rb")
|
48
|
+
rdoc.title = "Ruby2Jar docs"
|
49
|
+
rdoc.rdoc_dir = "doc"
|
50
|
+
rdoc.options << "--all"
|
51
|
+
end
|
52
|
+
|
53
|
+
spec = Gem::Specification.new do |s|
|
54
|
+
s.platform = Gem::Platform::RUBY
|
55
|
+
s.name = "ruby2jar"
|
56
|
+
s.version = "0.1"
|
57
|
+
s.summary = "Build JAR from Ruby script."
|
58
|
+
s.description = <<-EOF
|
59
|
+
Ruby2Jar build JAR from Ruby script. It copy gems, compile sources and
|
60
|
+
package JAR. It is a easy way to distribute your JRuby application or to
|
61
|
+
create Applet or Java Web Start.
|
62
|
+
EOF
|
63
|
+
|
64
|
+
s.files = FileList[
|
65
|
+
"lib/**/*",
|
66
|
+
"spec/**/*",
|
67
|
+
"LICENSE",
|
68
|
+
"TODO",
|
69
|
+
"Rakefile",
|
70
|
+
"README"]
|
71
|
+
s.require_path = 'lib'
|
72
|
+
|
73
|
+
s.add_dependency 'rake'
|
74
|
+
|
75
|
+
s.author = 'Andrey "A.I." Sitnik'
|
76
|
+
s.email = "andrey@sitnik.ru"
|
77
|
+
s.homepage = "http://ruby2jar.rubyforge.org/"
|
78
|
+
s.rubyforge_project = "ruby2jar"
|
79
|
+
end
|
80
|
+
|
81
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
82
|
+
pkg.gem_spec = spec
|
83
|
+
end
|
data/TODO
ADDED
data/lib/ruby2jar.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
=begin
|
2
|
+
Load all neccessary classes.
|
3
|
+
|
4
|
+
Copyright (C) 2008 Andrey "A.I." Sitnik <andrey@sitnik.ru>
|
5
|
+
|
6
|
+
This program is free software: you can redistribute it and/or modify
|
7
|
+
it under the terms of the GNU General Public License as published by
|
8
|
+
the Free Software Foundation, either version 3 of the License, or
|
9
|
+
(at your option) any later version.
|
10
|
+
|
11
|
+
This program is distributed in the hope that it will be useful,
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
GNU General Public License for more details.
|
15
|
+
|
16
|
+
You should have received a copy of the GNU General Public License
|
17
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
=end
|
19
|
+
|
20
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__)) unless
|
21
|
+
$LOAD_PATH.include?(File.dirname(__FILE__)) ||
|
22
|
+
$LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
|
23
|
+
|
24
|
+
require "ruby2jar/builder"
|
25
|
+
|
26
|
+
module Ruby2Jar
|
27
|
+
autoload :Listener, "ruby2jar/listener"
|
28
|
+
autoload :Console, "ruby2jar/console"
|
29
|
+
autoload :Error, "ruby2jar/error"
|
30
|
+
autoload :JarTask, "ruby2jar/jartask"
|
31
|
+
end
|
@@ -0,0 +1,436 @@
|
|
1
|
+
=begin
|
2
|
+
Build JAR from Ruby script.
|
3
|
+
|
4
|
+
Copyright (C) 2008 Andrey "A.I." Sitnik <andrey@sitnik.ru>
|
5
|
+
|
6
|
+
This program is free software: you can redistribute it and/or modify
|
7
|
+
it under the terms of the GNU General Public License as published by
|
8
|
+
the Free Software Foundation, either version 3 of the License, or
|
9
|
+
(at your option) any later version.
|
10
|
+
|
11
|
+
This program is distributed in the hope that it will be useful,
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
GNU General Public License for more details.
|
15
|
+
|
16
|
+
You should have received a copy of the GNU General Public License
|
17
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
=end
|
19
|
+
|
20
|
+
require "tmpdir"
|
21
|
+
require "tempfile"
|
22
|
+
require "yaml"
|
23
|
+
require "fileutils"
|
24
|
+
|
25
|
+
require "rubygems"
|
26
|
+
require "rake"
|
27
|
+
|
28
|
+
module Ruby2Jar
|
29
|
+
# Ruby2Jar build JAR from Ruby script. It copy gems, compile sources and
|
30
|
+
# package JAR. It is a easy way to distribute your JRuby application or to
|
31
|
+
# create Applet or Java Web Start.
|
32
|
+
#
|
33
|
+
# == Examples
|
34
|
+
# === Build from Rake task (best production way)
|
35
|
+
#
|
36
|
+
# require "ruby2jar"
|
37
|
+
#
|
38
|
+
# PKG_NAME = "program"
|
39
|
+
# PKG_VERSION = "0.1"
|
40
|
+
#
|
41
|
+
# Ruby2Jar::Rake::JarTask.new do |jar|
|
42
|
+
# jar.files = FileList["lib/**/*", "bin/*"]
|
43
|
+
# jar.main = "bin/program"
|
44
|
+
# jar.name = PKG_NAME
|
45
|
+
# jar.version = PKG_VERSION
|
46
|
+
# jar.add_dependency "rspec"
|
47
|
+
# end
|
48
|
+
#
|
49
|
+
# === Build with console output
|
50
|
+
#
|
51
|
+
# require "ruby2jar"
|
52
|
+
#
|
53
|
+
# builder = Ruby2Jar::Builder.new
|
54
|
+
# console = Ruby2Jar::Console.new(builder) # Add console error output
|
55
|
+
# builder.path = "/path/to/ruby/program/" # Set program to build
|
56
|
+
# builder.files = Rake::FileList["/lib/**/*"] # Select files
|
57
|
+
# builder.add_dependency "actionsupport" # Add gems
|
58
|
+
# builder.add_dependency "rspec", ">=1.0.0" # Add gem with special version
|
59
|
+
# builde.build # Start building
|
60
|
+
#
|
61
|
+
# == Extension
|
62
|
+
# You can add some action in building work. For example, to show warning
|
63
|
+
# dialogs or to create special manifest file. Just add new Proc or Method
|
64
|
+
# object to "before_*" arrays with neccessary building step.
|
65
|
+
#
|
66
|
+
# You can also extend Ruby2Jar::Listener to create extension, which
|
67
|
+
# automatically connect all function to builder.
|
68
|
+
#
|
69
|
+
# === Example
|
70
|
+
#
|
71
|
+
# require "ruby2jar"
|
72
|
+
#
|
73
|
+
# builder = Ruby2Jar::Builder.new
|
74
|
+
# builder.path = "/path/to/ruby/program/"
|
75
|
+
# builder.add_dependency "rspec"
|
76
|
+
#
|
77
|
+
# builder.before_start << lambda { # Add function, which will be
|
78
|
+
# puts "Jar building is start" # call before builder start and
|
79
|
+
# } # set system variables
|
80
|
+
#
|
81
|
+
# builder.before_finish << lambda { # Function, which will be call
|
82
|
+
# puts "Jar building is finish" # before builder finish it work
|
83
|
+
# } # and delete temporal files
|
84
|
+
#
|
85
|
+
class Builder
|
86
|
+
# Script or directory to build JAR
|
87
|
+
attr_accessor :path
|
88
|
+
|
89
|
+
# List of files to be included in the JAR.
|
90
|
+
attr_accessor :files
|
91
|
+
|
92
|
+
# Path to main script, which will be run whtn you execute JAR.
|
93
|
+
# If in +path+ you set file, main script will be equal +path+.
|
94
|
+
attr_accessor :main
|
95
|
+
|
96
|
+
# Does builder must create Manifest file in JAR with +main+ script, which
|
97
|
+
# will be start on JAR executing (default if true).
|
98
|
+
attr_accessor :create_manifest
|
99
|
+
|
100
|
+
# Custom content of Manifest file in JAR as hash. If parameters will be not
|
101
|
+
# set, builder add Manifest-Version and Main-Class if +main+ exist.
|
102
|
+
attr_accessor :manifest
|
103
|
+
|
104
|
+
# Path to result JAR (default is +path+/pkg/{last dirname in +path+}.jar).
|
105
|
+
attr_accessor :jar
|
106
|
+
|
107
|
+
# Does builder must copy JRuby to JAR (default if true). With JRuby
|
108
|
+
# resulting JAR can be started on any Java Runtime, but file will be has
|
109
|
+
# bigger size.
|
110
|
+
attr_accessor :include_jruby
|
111
|
+
|
112
|
+
# Path to JRuby JAR (default is $JRUBY_HOME/lib/jruby/jar). Used only
|
113
|
+
# if +include_jruby+ is true.
|
114
|
+
attr_accessor :jruby
|
115
|
+
|
116
|
+
# Arguments for Java compiler
|
117
|
+
attr_accessor :javac_args
|
118
|
+
|
119
|
+
# Path in script, which will be added to <tt>$LOAD_PATH</tt> in init script
|
120
|
+
# (default is root and lib dir of application)
|
121
|
+
attr_accessor :require_paths
|
122
|
+
|
123
|
+
# Create builder instance
|
124
|
+
def initialize
|
125
|
+
@path = Dir.pwd
|
126
|
+
@create_manifest = false
|
127
|
+
@manifest = {"Manifest-Version" => "1.0"}
|
128
|
+
@include_jruby = true
|
129
|
+
@target = "1.6"
|
130
|
+
@require_paths = ["lib", ""]
|
131
|
+
@javac_args = ""
|
132
|
+
@gems_index = Gem.source_index
|
133
|
+
|
134
|
+
@before_start = []
|
135
|
+
@before_find_gems = []
|
136
|
+
@before_copy = []
|
137
|
+
@before_create_init = []
|
138
|
+
@before_compile = []
|
139
|
+
@before_package = []
|
140
|
+
@before_finish = []
|
141
|
+
@on_error = []
|
142
|
+
|
143
|
+
@gems = []
|
144
|
+
@configs = {}
|
145
|
+
end
|
146
|
+
|
147
|
+
# Add a dependency gem
|
148
|
+
def add_dependency(gem, *requirements)
|
149
|
+
@gems << [gem, requirements]
|
150
|
+
end
|
151
|
+
|
152
|
+
# Start building JAR. You must set +path+ before call it.
|
153
|
+
def build
|
154
|
+
@stop = false
|
155
|
+
%w{start copy create_init compile package}.each do |step|
|
156
|
+
method("before_#{step}").call.each do |proc|
|
157
|
+
proc.call
|
158
|
+
end
|
159
|
+
if @stop
|
160
|
+
break
|
161
|
+
end
|
162
|
+
method(step).call
|
163
|
+
end
|
164
|
+
rescue => error
|
165
|
+
@error_rescued = false
|
166
|
+
on_error.each do |proc|
|
167
|
+
@error_rescued |= proc.call error
|
168
|
+
end
|
169
|
+
if not @error_rescued
|
170
|
+
raise error
|
171
|
+
end
|
172
|
+
ensure
|
173
|
+
begin
|
174
|
+
before_finish.each do |proc|
|
175
|
+
proc.call
|
176
|
+
end
|
177
|
+
ensure
|
178
|
+
finish
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
attr_accessor :before_start
|
183
|
+
attr_accessor :before_copy
|
184
|
+
attr_accessor :before_create_init
|
185
|
+
attr_accessor :before_compile
|
186
|
+
attr_accessor :before_package
|
187
|
+
attr_accessor :before_finish
|
188
|
+
attr_accessor :on_error
|
189
|
+
|
190
|
+
# Path to work dir, which be used to copy all neccessary files.
|
191
|
+
# It will be set automatically and has public access only for extensions.
|
192
|
+
attr_accessor :build_dir
|
193
|
+
|
194
|
+
# Gems, which using in program. Use +add_dependency+ to add gem.
|
195
|
+
attr_accessor :gems
|
196
|
+
|
197
|
+
# Gem's configs with building information, which was loaded from
|
198
|
+
# <tt>GEM_DIR/java.yaml</tt>. It will has information after +copy+ step.
|
199
|
+
attr_accessor :configs
|
200
|
+
|
201
|
+
# Paths to add to <tt>$LOAD_PATH</tt> in init script
|
202
|
+
attr_accessor :init_require_paths
|
203
|
+
|
204
|
+
# Gem's source index. It available as variable for testing and hacking.
|
205
|
+
attr_accessor :gems_index
|
206
|
+
|
207
|
+
# Gems, which is added to JAR. Contain @gems and they dependencies.
|
208
|
+
attr_accessor :loaded_gems
|
209
|
+
|
210
|
+
# Stop JAR building and delete temporal files. Must be runned from extension
|
211
|
+
# on error or when building is not necessary yet.
|
212
|
+
def stop
|
213
|
+
@stop = true
|
214
|
+
end
|
215
|
+
|
216
|
+
protected
|
217
|
+
|
218
|
+
# Check for errors and create temporal directory
|
219
|
+
def start
|
220
|
+
raise Error, "You didn't set path to source dir or file." if @path.nil?
|
221
|
+
raise Error, "Source path is already exist." if not File.exist? @path
|
222
|
+
|
223
|
+
@path = File.expand_path(@path)
|
224
|
+
if File.directory? @path
|
225
|
+
Dir.chdir(@path) do
|
226
|
+
@files = Rake::FileList["**/*"] if @files.nil?
|
227
|
+
@files.map! { |i| File.expand_path(i) }
|
228
|
+
end
|
229
|
+
end
|
230
|
+
if @jar.nil?
|
231
|
+
if File.directory? @path
|
232
|
+
@jar = File.join(@path, "pkg", "#{@path.split('/').last}.jar")
|
233
|
+
else
|
234
|
+
@jar = File.join(File.dirname(@path),
|
235
|
+
"#{File.basename(@path, File.extname(@path))}.jar")
|
236
|
+
end
|
237
|
+
end
|
238
|
+
@jar = File.expand_path(@jar)
|
239
|
+
|
240
|
+
if File.exist? @jar
|
241
|
+
raise Error, "File #{@jar} already exist. Delete it or change jar name"
|
242
|
+
end
|
243
|
+
|
244
|
+
if not @main.nil?
|
245
|
+
@create_manifest = true
|
246
|
+
path = File.join(@path, @main)
|
247
|
+
if not File.exist? path
|
248
|
+
raise Error, "Main script isn't exist in #{path}."
|
249
|
+
end
|
250
|
+
end
|
251
|
+
if @main.nil? and not File.directory? @path
|
252
|
+
@main = File.basename(@path)
|
253
|
+
end
|
254
|
+
|
255
|
+
if @include_jruby
|
256
|
+
if @jruby.nil?
|
257
|
+
if ENV['JRUBY_HOME'].nil?
|
258
|
+
raise Error, "Can't find JRuby, please set it manually."
|
259
|
+
else
|
260
|
+
@jruby = File.join(ENV['JRUBY_HOME'], "lib", "jruby.jar")
|
261
|
+
end
|
262
|
+
end
|
263
|
+
if not File.exist? @jruby
|
264
|
+
raise Error, "JRuby isn't exist in #{@jruby}."
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
number = Time.now.to_i
|
269
|
+
begin
|
270
|
+
number += 1
|
271
|
+
@build_dir = File.join(Dir.tmpdir, "ruby2jar#{number}")
|
272
|
+
end while File.exist? @build_dir
|
273
|
+
@app_dir = File.join(@build_dir, "ruby", "app")
|
274
|
+
@gems_dir = File.join(@build_dir, "ruby", "gems")
|
275
|
+
|
276
|
+
@init_require_paths = @require_paths.map { |i| "ruby/app/#{i}"}
|
277
|
+
|
278
|
+
Dir.mkdir @build_dir
|
279
|
+
File.chmod 0700, @build_dir
|
280
|
+
Dir.mkdir File.join(@build_dir, "ruby")
|
281
|
+
Dir.mkdir @app_dir
|
282
|
+
Dir.mkdir @gems_dir
|
283
|
+
|
284
|
+
# Change current dir
|
285
|
+
@last_current_dir = Dir.pwd
|
286
|
+
Dir.chdir @build_dir
|
287
|
+
end
|
288
|
+
|
289
|
+
# Copy application, gems and JRuby
|
290
|
+
def copy
|
291
|
+
if File.directory? @path
|
292
|
+
@files.each do |src|
|
293
|
+
dest = File.join(@app_dir, src[@path.length..-1])
|
294
|
+
if File.directory? src
|
295
|
+
FileUtils.mkdir_p(dest)
|
296
|
+
else
|
297
|
+
FileUtils.mkdir_p(File.dirname(dest))
|
298
|
+
FileUtils.copy src, dest
|
299
|
+
end
|
300
|
+
end
|
301
|
+
else
|
302
|
+
FileUtils.copy @path, @app_dir
|
303
|
+
end
|
304
|
+
|
305
|
+
@loaded_gem_versions = []
|
306
|
+
@loaded_gems = []
|
307
|
+
@gems.each { |gem| copy_gem(gem[0], gem[1]) }
|
308
|
+
|
309
|
+
([@app_dir] + Dir.glob(File.join(@gems_dir, "*"))).each do |dir|
|
310
|
+
ext = File.join(dir, "ext")
|
311
|
+
Dir.glob(File.join(ext, "**", "*.{java,class}")).each do |file|
|
312
|
+
if ".java" == File.extname(file)
|
313
|
+
if File.exist? file[0..-6] + ".class"
|
314
|
+
File.delete file
|
315
|
+
next
|
316
|
+
end
|
317
|
+
end
|
318
|
+
dest = File.join(@build_dir, file[ext.length..-1])
|
319
|
+
FileUtils.makedirs File.dirname(dest)
|
320
|
+
FileUtils.move file, dest
|
321
|
+
end
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
# Find gems and copy it and it's dependencies
|
326
|
+
def copy_gem(gem, version = nil)
|
327
|
+
specs = @gems_index.find_name(gem, version)
|
328
|
+
if specs.empty?
|
329
|
+
raise Error, "Can't find gem #{gem}"
|
330
|
+
end
|
331
|
+
spec = specs.first
|
332
|
+
|
333
|
+
if @loaded_gem_versions.include? spec.full_name
|
334
|
+
return
|
335
|
+
end
|
336
|
+
if @loaded_gems.include? gem
|
337
|
+
raise Error, "Gem #{spec.name} is already added with different version"
|
338
|
+
end
|
339
|
+
|
340
|
+
gem_dir = File.join(@gems_dir, gem)
|
341
|
+
FileUtils.cp_r File.join(spec.full_gem_path, "."), gem_dir
|
342
|
+
|
343
|
+
config = File.join(@gems_dir, gem, "java.yaml")
|
344
|
+
if File.exist? config
|
345
|
+
@configs[gem] = YAML::load_file(config)
|
346
|
+
File.delete config
|
347
|
+
jar = @configs[gem]['jar']
|
348
|
+
if not jar.nil? and not jar['exclude'].nil?
|
349
|
+
jar['exclude'].map { |i| File.join(gem_dir, i) }.each do |files|
|
350
|
+
FileUtils.rm Dir.glob(files)
|
351
|
+
end
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
@loaded_gem_versions << spec.full_name
|
356
|
+
@loaded_gems << gem
|
357
|
+
@init_require_paths += spec.require_paths.map{|i| "ruby/gems/#{gem}/#{i}"}
|
358
|
+
|
359
|
+
spec.dependencies.each { |i| copy_gem(i) }
|
360
|
+
end
|
361
|
+
|
362
|
+
# Create init script to set rubygems variables and start main script
|
363
|
+
def create_init
|
364
|
+
return if @main.nil?
|
365
|
+
|
366
|
+
File.open(File.join(@build_dir, "ruby", "init.rb"), "w") do |file|
|
367
|
+
file.puts "module Kernel"
|
368
|
+
file.puts " def gem(name, *version); end"
|
369
|
+
file.puts " alias ruby2jar_original_require require"
|
370
|
+
file.puts " def require(file)"
|
371
|
+
file.puts " ruby2jar_original_require(file)"
|
372
|
+
file.puts " rescue LoadError => error"
|
373
|
+
file.puts " raise error if not error.message.include? 'no such file to load'"
|
374
|
+
file.puts " $LOAD_PATH.each do |path|"
|
375
|
+
file.puts " begin"
|
376
|
+
file.puts " ruby2jar_original_require(File.join(path, file))"
|
377
|
+
file.puts " return"
|
378
|
+
file.puts " rescue LoadError => error"
|
379
|
+
file.puts " raise error if not error.message.include? 'no such file to load'"
|
380
|
+
file.puts " end"
|
381
|
+
file.puts " end"
|
382
|
+
file.puts " end"
|
383
|
+
file.puts "end"
|
384
|
+
@init_require_paths.each do |path|
|
385
|
+
file.puts '$LOAD_PATH << "' + path + '"'
|
386
|
+
end
|
387
|
+
file.puts 'require "ruby/app/' + @main.sub(/\.rb$/, '') + '"'
|
388
|
+
end
|
389
|
+
@manifest["Main-Class"] = "ruby.init" if not @manifest.include? "Main-Class"
|
390
|
+
end
|
391
|
+
|
392
|
+
# Compile Ruby and Java sources
|
393
|
+
def compile
|
394
|
+
`jrubyc -p "" ./`
|
395
|
+
|
396
|
+
Dir.glob(File.join(@build_dir, "**", "*.java")).each do |file|
|
397
|
+
`javac #{@javac_args} -sourcepath ./ "#{file}"`
|
398
|
+
end
|
399
|
+
|
400
|
+
Dir.glob(File.join(@build_dir, "**", "*.{rb,java}")).each do |file|
|
401
|
+
File.delete file
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
# Package files in one JAR
|
406
|
+
def package
|
407
|
+
if @include_jruby
|
408
|
+
`jar -xf "#{@jruby}"`
|
409
|
+
end
|
410
|
+
|
411
|
+
FileUtils.makedirs File.dirname(@jar)
|
412
|
+
|
413
|
+
if @create_manifest
|
414
|
+
@manifest_file = Tempfile.new("ruby2jar_manifest")
|
415
|
+
@manifest.each_pair do |name, value|
|
416
|
+
@manifest_file.puts "#{name}: #{value}"
|
417
|
+
end
|
418
|
+
@manifest_file.close(false)
|
419
|
+
|
420
|
+
`jar -cvfm "#{@jar}" "#{@manifest_file.path}" ./`
|
421
|
+
else
|
422
|
+
`jar -cf "#{@jar}" ./`
|
423
|
+
end
|
424
|
+
end
|
425
|
+
|
426
|
+
# Delete all temporal files
|
427
|
+
def finish
|
428
|
+
if not @last_current_dir.nil?
|
429
|
+
Dir.chdir @last_current_dir
|
430
|
+
end
|
431
|
+
if not @build_dir.nil?
|
432
|
+
FileUtils.rm_r @build_dir
|
433
|
+
end
|
434
|
+
end
|
435
|
+
end
|
436
|
+
end
|