tsantos-rakejava 1.0.4

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.
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
+