tsantos-rakejava 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/README +25 -0
  2. data/lib/rakejava.rb +271 -0
  3. metadata +55 -0
data/README ADDED
@@ -0,0 +1,25 @@
1
+ RakeJava is a ruby gem for use with Rake. It lets you compile and jar Java files.
2
+
3
+ Example:
4
+
5
+ require 'rakejava'
6
+ require 'rake/clean'
7
+
8
+ CLEAN.include 'build/*'
9
+
10
+ task :default => "myproj.jar"
11
+
12
+ jar "myproj.jar" => :compile do |t|
13
+ t.root = "build"
14
+ t.files << FileList["*.class"]
15
+ t.manifest = {:version => '1.0.0'}
16
+ end
17
+
18
+ javac :compile => "build" do |t|
19
+ t.src << Sources["src", "**/*.java"]
20
+ t.src << Sources["test", "*.java"]
21
+ t.dest = 'build'
22
+ end
23
+
24
+ directory "build"
25
+
data/lib/rakejava.rb ADDED
@@ -0,0 +1,271 @@
1
+ # RakeJava is a set of custom rake tasks for building Java projects
2
+ #
3
+ # Author: Tom Santos
4
+ # http://github.com/tsantos/rakejava/tree/master
5
+
6
+ =begin
7
+ Copyright 2009 Tom Santos
8
+
9
+ Licensed under the Apache License, Version 2.0 (the "License");
10
+ you may not use this file except in compliance with the License.
11
+ You may obtain a copy of the License at
12
+
13
+ http://www.apache.org/licenses/LICENSE-2.0
14
+
15
+ Unless required by applicable law or agreed to in writing, software
16
+ distributed under the License is distributed on an "AS IS" BASIS,
17
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ See the License for the specific language governing permissions and
19
+ limitations under the License.
20
+ =end
21
+
22
+ require 'rake'
23
+ require 'set'
24
+ require 'tempfile'
25
+
26
+ module RakeJavaUtil
27
+ def pushd dir
28
+ pushd_stack.unshift(Dir.pwd)
29
+ cd dir
30
+ end
31
+
32
+ def popd
33
+ cd pushd_stack.shift
34
+ end
35
+
36
+ def pushd_stack
37
+ unless defined?(@pushd_stack)
38
+ @pushd_stack = []
39
+ end
40
+ @pushd_stack
41
+ end
42
+
43
+ def path_esc str_ary
44
+ str_ary.map { |str| str.gsub('$', '\$').gsub(' ', '\ ') }
45
+ end
46
+
47
+ def path_sep str_ary
48
+ separate(str_ary, File::PATH_SEPARATOR)
49
+ end
50
+
51
+ def space_sep str_ary
52
+ separate(str_ary, ' ')
53
+ end
54
+
55
+ def separate str_ary, sep
56
+ result = ""
57
+ str_ary.each { |str| result << "#{str}#{sep}" }
58
+ result.chop!
59
+ end
60
+ end
61
+
62
+ class Sources < Rake::FileList
63
+ attr_accessor :root
64
+
65
+ def initialize *args
66
+ @root = args.shift
67
+ args = args.map { |arg| "#{@root}/#{arg}" }
68
+ super
69
+ end
70
+
71
+ class << self
72
+ def [] *args
73
+ new(*args)
74
+ end
75
+ end
76
+ end
77
+
78
+ class JarFiles < Rake::FileList
79
+ include RakeJavaUtil
80
+
81
+ attr_accessor :root
82
+
83
+ def initialize *args
84
+ @root = args.shift
85
+ @resolving = false
86
+ super
87
+ end
88
+
89
+ def resolve
90
+ unless @resolving
91
+ @resolving = true
92
+ pushd @root
93
+ super
94
+ # Hack time because the jar command is busted. Every arg after the
95
+ # first file listed after a -C needs to have paths relative to the
96
+ # command-launch rather than the -C specified dir. The first file arg
97
+ # after a -C works but subsequent ones fail.
98
+ hack = @items.shift
99
+ @items.map! { |i| "#{@root}#{File::SEPARATOR}#{i}" }
100
+ @items.unshift(hack)
101
+ popd
102
+ @resolving = false
103
+ end
104
+ self
105
+ end
106
+ end
107
+
108
+ module RakeJava
109
+ class JavacTask < Rake::Task
110
+ include RakeJavaUtil
111
+
112
+ attr_accessor :bootpath, :classpath, :src, :dest, :args
113
+ attr_accessor :src_ver, :dest_ver, :debug
114
+
115
+ def initialize name, app
116
+ super
117
+ @src = []
118
+ @srcpath = []
119
+ @bootpath = []
120
+ @classpath = []
121
+ end
122
+
123
+ def execute args=nil
124
+ super
125
+ files = src_files
126
+
127
+ unless files.empty?
128
+ srcpath = @src.map { |src| src.root }
129
+
130
+ cmd = "javac"
131
+ cmd << " -bootclasspath #{path_sep(@bootpath)}" unless @bootpath.empty?
132
+ cmd << " #{@args}" if @args
133
+ cmd << " -classpath #{path_sep(@classpath)}" unless @classpath.empty?
134
+ cmd << " -g" if @debug
135
+ cmd << " -source #{@src_ver}" if @src_ver
136
+ cmd << " -target #{@dest_ver}" if @dest_ver
137
+ cmd << " -sourcepath #{path_sep(srcpath)}" if srcpath
138
+ cmd << " -d #{@dest}" if @dest
139
+ cmd << " #{space_sep(files)}"
140
+
141
+ max_cmd_len = 500
142
+ if cmd.length < max_cmd_len
143
+ puts cmd
144
+ else
145
+ puts cmd[0..max_cmd_len] + "..."
146
+ end
147
+ puts "Compiling #{files.length} file(s)"
148
+ puts `#{cmd}`
149
+ else
150
+ puts "No files to compile"
151
+ end
152
+
153
+ end
154
+
155
+ def src_files
156
+ files = []
157
+
158
+ @src.each do |source|
159
+ files << changed_only(source)
160
+ end
161
+
162
+ files.flatten
163
+ end
164
+
165
+ def changed_only sources
166
+ # Retuns the files that have newer .java files than .class files
167
+ changed = []
168
+ sources.each do |src_file|
169
+ mod_time = File.mtime(src_file)
170
+ base = File.basename(src_file, ".java")
171
+ parent = File.dirname(src_file)
172
+ classfiles = []
173
+
174
+ if @dest
175
+ base_path = parent[sources.root.length+1..-1]
176
+ classfiles = Dir["#{@dest}/#{base_path}/#{base}*.class"]
177
+ else
178
+ # Look next to it
179
+ classfiles = Dir["#{parent}/#{base}*.class"]
180
+ end
181
+
182
+ unless classfiles.empty?
183
+ classfiles.each do |classfile|
184
+ if File.mtime(classfile) < mod_time
185
+ changed << src_file
186
+ break
187
+ end
188
+ end
189
+ else
190
+ changed << src_file
191
+ end
192
+ end
193
+ changed
194
+ end
195
+ end
196
+
197
+ class JarTask < Rake::Task
198
+ include RakeJavaUtil
199
+
200
+ attr_accessor :root, :files, :main_class, :manifest
201
+
202
+ def initialize name, app
203
+ super
204
+ @root = "."
205
+ @files = []
206
+ end
207
+
208
+ def execute args=nil
209
+ super
210
+
211
+ flags = "cf"
212
+ jar = File.expand_path(@name)
213
+
214
+ if @main_class
215
+ unless @manifest
216
+ @manifest = {}
217
+ end
218
+ @manifest["Main-Class"] = @main_class
219
+ end
220
+ manifest_path = " "
221
+ if @manifest
222
+ flags << "m"
223
+ if @manifest.kind_of? Hash
224
+ manifest_path << create_manifest
225
+ elsif @manifest.kind_of? String
226
+ manifest_path << File.expand_path(@manifest)
227
+ end
228
+ end
229
+
230
+ cmd = "jar #{flags} #{@name}#{manifest_path}"
231
+
232
+ @files.each do |file_list|
233
+ cmd << " -C #{file_list.root} #{space_sep(path_esc(file_list))}"
234
+ end
235
+
236
+ max_cmd_len = 500
237
+ if cmd.length < max_cmd_len
238
+ puts cmd
239
+ else
240
+ puts cmd[0..max_cmd_len] + "..."
241
+ end
242
+ puts `#{cmd}`
243
+ end
244
+
245
+ protected
246
+ def create_manifest
247
+ manifest = [
248
+ "Manifest-Version: 1.0",
249
+ "Created-By: rakejava"
250
+ ]
251
+
252
+ @manifest.each do |key, value|
253
+ manifest << "#{key}: #{value}"
254
+ end
255
+
256
+ file = Tempfile.new("manifest", "/tmp") do |f|
257
+ f.puts(manifest)
258
+ end
259
+
260
+ file.path
261
+ end
262
+ end
263
+ end
264
+
265
+ def javac *args, &block
266
+ RakeJava::JavacTask.define_task(*args, &block)
267
+ end
268
+
269
+ def jar *args, &block
270
+ RakeJava::JarTask.define_task(*args, &block)
271
+ end
metadata ADDED
@@ -0,0 +1,55 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tsantos-rakejava
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.4
5
+ platform: ruby
6
+ authors:
7
+ - Tom Santos
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-07-30 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Rake tasks for building Java stuff
17
+ email: santos.tom@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - README
26
+ - lib/rakejava.rb
27
+ has_rdoc: false
28
+ homepage: http://github.com/tsantos/rakejava
29
+ licenses:
30
+ post_install_message:
31
+ rdoc_options: []
32
+
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: "0"
40
+ version:
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
46
+ version:
47
+ requirements: []
48
+
49
+ rubyforge_project:
50
+ rubygems_version: 1.3.5
51
+ signing_key:
52
+ specification_version: 2
53
+ summary: Rake tasks for building Java stuff
54
+ test_files: []
55
+