jar-dependencies 0.1.8 → 0.1.10
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.
- checksums.yaml +4 -4
- data/Mavenfile +2 -4
- data/jar-dependencies.gemspec +1 -1
- data/lib/jar_dependencies.rb +32 -5
- data/lib/jar_install_post_install_hook.rb +1 -11
- data/lib/jar_installer.rb +1 -295
- data/lib/jars/classpath.rb +73 -0
- data/lib/jars/installer.rb +187 -0
- data/lib/jars/jar_pom.rb +7 -3
- data/lib/jars/jars_lock_pom.rb +18 -0
- data/lib/jars/lock.rb +77 -0
- data/lib/jars/maven_exec.rb +129 -0
- data/lib/jars/post_install_hook.rb +31 -0
- data/lib/rubygems_plugin.rb +1 -1
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8285b7214e47fe153c7757817c250fe9a7752fdc
|
4
|
+
data.tar.gz: f99b7597244bdbf340fb945c7cf39a699734b15a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b55db0cfecaaf73eac4d95cc3b7d061d809d112afe815afffd2a8a12b83ed4d3c8beb0cbfb19e27ff2f14ece87068d3267c49e79298dda32d273cbbc69f0284b
|
7
|
+
data.tar.gz: 5bcf7abf25d8709a98ff405a94bdba3f219450bf58b8a2c0d6a99b2499f1067f0870277d4f32fd7520a50b3095ec3bb1315616a34606c5d57e88f6695086174b
|
data/Mavenfile
CHANGED
@@ -10,14 +10,12 @@ jruby_plugin( :minitest, :minispecDirectory => "specs/*_spec.rb" ) do
|
|
10
10
|
gem 'ruby-maven', '3.1.1.0.8'
|
11
11
|
end
|
12
12
|
|
13
|
-
#snapshot_repository :jruby, 'http://ci.jruby.org/snapshots/maven'
|
14
|
-
|
15
13
|
# (jruby-1.6.8 mode 1.8 produces a lot of yaml errors parsing gemspecs)
|
16
|
-
properties( 'jruby.versions' => ['1.6.8', '1.7.12', '
|
14
|
+
properties( 'jruby.versions' => ['1.6.8', '1.7.12', '${jruby.version}', '9.0.0.0.pre1'
|
17
15
|
].join(','),
|
18
16
|
'jruby.modes' => ['1.9', '2.0', '2.1'].join(','),
|
19
17
|
# just lock the version
|
20
|
-
'jruby.version' => '1.7.
|
18
|
+
'jruby.version' => '1.7.19',
|
21
19
|
'tesla.dump.pom' => 'pom.xml',
|
22
20
|
'tesla.dump.readonly' => true )
|
23
21
|
|
data/jar-dependencies.gemspec
CHANGED
data/lib/jar_dependencies.rb
CHANGED
@@ -21,16 +21,25 @@
|
|
21
21
|
|
22
22
|
module Jars
|
23
23
|
unless defined? Jars::MAVEN_SETTINGS
|
24
|
-
HOME = 'JARS_HOME'.freeze
|
25
24
|
MAVEN_SETTINGS = 'JARS_MAVEN_SETTINGS'.freeze
|
25
|
+
# where the locally stored jars are search for or stored
|
26
|
+
HOME = 'JARS_HOME'.freeze
|
26
27
|
# skip the gem post install hook
|
27
28
|
SKIP = 'JARS_SKIP'.freeze
|
28
29
|
# just do not require any jars
|
29
30
|
NO_REQUIRE = 'JARS_NO_REQUIRE'.freeze
|
31
|
+
# no more warnings on conflict. this still requires jars but will
|
32
|
+
# not warn. it is needed to load jars from (default) gems which
|
33
|
+
# do contribute to any dependency manager (maven, gradle, jbundler)
|
30
34
|
QUIET = 'JARS_QUIET'.freeze
|
35
|
+
# show maven output
|
31
36
|
VERBOSE = 'JARS_VERBOSE'.freeze
|
37
|
+
# maven debug
|
32
38
|
DEBUG = 'JARS_DEBUG'.freeze
|
39
|
+
# vendor jars inside gem when installing gem
|
33
40
|
VENDOR = 'JARS_VENDOR'.freeze
|
41
|
+
# resolve jars from Jars.lock
|
42
|
+
RESOLVE = 'JARS_RESOLVE'.freeze
|
34
43
|
end
|
35
44
|
|
36
45
|
class << self
|
@@ -48,9 +57,6 @@ module Jars
|
|
48
57
|
|
49
58
|
def to_boolean( key )
|
50
59
|
prop = to_prop( key )
|
51
|
-
# prop == nil => false
|
52
|
-
# prop == 'false' => false
|
53
|
-
# anything else => true
|
54
60
|
prop == '' or prop == 'true'
|
55
61
|
end
|
56
62
|
|
@@ -78,6 +84,10 @@ module Jars
|
|
78
84
|
to_boolean( VENDOR )
|
79
85
|
end
|
80
86
|
|
87
|
+
def resolve?
|
88
|
+
to_boolean( RESOLVE )
|
89
|
+
end
|
90
|
+
|
81
91
|
def no_more_warnings
|
82
92
|
@silent = true
|
83
93
|
end
|
@@ -141,7 +151,24 @@ module Jars
|
|
141
151
|
@_jars_home_
|
142
152
|
end
|
143
153
|
|
154
|
+
def require_jars_lock
|
155
|
+
@@jars_lock ||= false
|
156
|
+
unless @@jars_lock
|
157
|
+
# be lazy and only load if there are jar dependencies
|
158
|
+
require 'jars/classpath'
|
159
|
+
classpath = Jars::Classpath.new
|
160
|
+
if @@jars_lock = classpath.jars_lock
|
161
|
+
classpath.require
|
162
|
+
self.no_more_warnings
|
163
|
+
else
|
164
|
+
@@jars_lock = true
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
144
169
|
def require_jar( group_id, artifact_id, *classifier_version )
|
170
|
+
require_jars_lock
|
171
|
+
|
145
172
|
version = classifier_version[ -1 ]
|
146
173
|
classifier = classifier_version[ -2 ]
|
147
174
|
|
@@ -210,7 +237,7 @@ module Jars
|
|
210
237
|
require jar
|
211
238
|
end
|
212
239
|
rescue LoadError => e
|
213
|
-
raise "\n\n\tyou might need to reinstall the gem which depends on the missing jar\n\n" + e.message + " (LoadError)"
|
240
|
+
raise "\n\n\tyou might need to reinstall the gem which depends on the missing jar or in case there is Jars.lock then JARS_RESOLVE=true will install the missing jars\n\n" + e.message + " (LoadError)"
|
214
241
|
end
|
215
242
|
|
216
243
|
end # class << self
|
@@ -18,14 +18,4 @@
|
|
18
18
|
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
19
19
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
20
|
#
|
21
|
-
|
22
|
-
if defined?( JRUBY_VERSION ) && Gem.post_install_hooks.empty?
|
23
|
-
Gem.post_install do |gem_installer|
|
24
|
-
unless (ENV['JARS_SKIP'] || ENV_JAVA['jars.skip']) == 'true'
|
25
|
-
require 'jar_installer'
|
26
|
-
jars = Jars::JarInstaller.new( gem_installer.spec )
|
27
|
-
jars.ruby_maven_install_options = gem_installer.options || {}
|
28
|
-
jars.vendor_jars
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
21
|
+
require 'jars/post_install_hook'
|
data/lib/jar_installer.rb
CHANGED
@@ -1,295 +1 @@
|
|
1
|
-
require '
|
2
|
-
require 'uri'
|
3
|
-
module Jars
|
4
|
-
class JarInstaller
|
5
|
-
|
6
|
-
class Dependency
|
7
|
-
|
8
|
-
attr_reader :path, :file, :gav, :scope, :type, :coord
|
9
|
-
|
10
|
-
def self.new( line )
|
11
|
-
if line.match /:jar:|:pom:/
|
12
|
-
super
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def setup_type( line )
|
17
|
-
if line.match /:pom:/
|
18
|
-
@type = :pom
|
19
|
-
elsif line.match /:jar:/
|
20
|
-
@type = :jar
|
21
|
-
end
|
22
|
-
end
|
23
|
-
private :setup_type
|
24
|
-
|
25
|
-
def setup_scope( line )
|
26
|
-
@scope =
|
27
|
-
case line
|
28
|
-
when /:provided:/
|
29
|
-
:provided
|
30
|
-
when /:test:/
|
31
|
-
:test
|
32
|
-
else
|
33
|
-
:runtime
|
34
|
-
end
|
35
|
-
end
|
36
|
-
private :setup_scope
|
37
|
-
|
38
|
-
def initialize( line )
|
39
|
-
setup_type( line )
|
40
|
-
|
41
|
-
line.sub!( /^\s+/, '' )
|
42
|
-
@coord = line.sub( /:[^:]+:([A-Z]:\\)?[^:]+$/, '' )
|
43
|
-
first, second = @coord.split( /:#{type}:/ )
|
44
|
-
group_id, artifact_id = first.split( /:/ )
|
45
|
-
parts = group_id.split( '.' )
|
46
|
-
parts << artifact_id
|
47
|
-
parts << second.split( /:/ )[ -1 ]
|
48
|
-
parts << File.basename( line.sub /.:/, '' )
|
49
|
-
@path = File.join( parts ).strip
|
50
|
-
|
51
|
-
setup_scope( line )
|
52
|
-
|
53
|
-
reg = /:jar:|:pom:|:test:|:compile:|:runtime:|:provided:|:system:/
|
54
|
-
@file = line.slice(@coord.length, line.length).sub(reg, '').strip
|
55
|
-
@system = nil != (line =~ /:system:/)
|
56
|
-
@gav = @coord.sub(reg, ':')
|
57
|
-
end
|
58
|
-
|
59
|
-
def system?
|
60
|
-
@system
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def self.install_jars( write_require_file = false )
|
65
|
-
new.install_jars( write_require_file )
|
66
|
-
end
|
67
|
-
|
68
|
-
def self.vendor_jars( write_require_file = false )
|
69
|
-
new.vendor_jars( write_require_file )
|
70
|
-
end
|
71
|
-
|
72
|
-
def self.load_from_maven( file )
|
73
|
-
result = []
|
74
|
-
File.read( file ).each_line do |line|
|
75
|
-
dep = Dependency.new( line )
|
76
|
-
result << dep if dep
|
77
|
-
end
|
78
|
-
result
|
79
|
-
end
|
80
|
-
|
81
|
-
def self.write_require_file( require_filename )
|
82
|
-
FileUtils.mkdir_p( File.dirname( require_filename ) )
|
83
|
-
comment = '# this is a generated file, to avoid over-writing it just delete this comment'
|
84
|
-
if ! File.exists?( require_filename ) || File.read( require_filename ).match( comment )
|
85
|
-
f = File.open( require_filename, 'w' )
|
86
|
-
f.puts comment
|
87
|
-
f.puts "require 'jar_dependencies'"
|
88
|
-
f.puts
|
89
|
-
f
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
def self.vendor_file( dir, dep )
|
94
|
-
vendored = File.join( dir, dep.path )
|
95
|
-
FileUtils.mkdir_p( File.dirname( vendored ) )
|
96
|
-
FileUtils.cp( dep.file, vendored ) unless dep.system?
|
97
|
-
end
|
98
|
-
|
99
|
-
def self.write_dep( file, dir, dep, vendor )
|
100
|
-
return if dep.type != :jar || dep.scope != :runtime
|
101
|
-
if dep.system?
|
102
|
-
file.puts( "require( '#{dep.file}' )" ) if file
|
103
|
-
elsif dep.scope == :runtime
|
104
|
-
vendor_file( dir, dep ) if vendor
|
105
|
-
file.puts( "require_jar( '#{dep.gav.gsub( /:/, "', '" )}' )" ) if file
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def self.install_deps( deps, dir, require_filename, vendor )
|
110
|
-
f = write_require_file( require_filename ) if require_filename
|
111
|
-
deps.each do |dep|
|
112
|
-
write_dep( f, dir, dep, vendor )
|
113
|
-
end
|
114
|
-
yield f if block_given? and f
|
115
|
-
ensure
|
116
|
-
f.close if f
|
117
|
-
end
|
118
|
-
|
119
|
-
def find_spec( allow_no_file )
|
120
|
-
specs = Dir[ '*.gemspec' ]
|
121
|
-
case specs.size
|
122
|
-
when 0
|
123
|
-
raise 'no gemspec found' unless allow_no_file
|
124
|
-
when 1
|
125
|
-
specs.first
|
126
|
-
else
|
127
|
-
raise 'more then one gemspec found. please specify a specfile' unless allow_no_file
|
128
|
-
end
|
129
|
-
end
|
130
|
-
private :find_spec
|
131
|
-
|
132
|
-
def initialize( spec = nil )
|
133
|
-
setup( spec )
|
134
|
-
end
|
135
|
-
|
136
|
-
def setup( spec = nil, allow_no_file = false )
|
137
|
-
spec ||= find_spec( allow_no_file )
|
138
|
-
|
139
|
-
case spec
|
140
|
-
when String
|
141
|
-
@specfile = File.expand_path( spec )
|
142
|
-
@basedir = File.dirname( @specfile )
|
143
|
-
spec = eval( File.read( spec ) )
|
144
|
-
when Gem::Specification
|
145
|
-
if File.exists?( spec.spec_file )
|
146
|
-
@basedir = spec.gem_dir
|
147
|
-
@specfile = spec.spec_file
|
148
|
-
else
|
149
|
-
# this happens with bundle and local gems
|
150
|
-
# there the spec_file is "not installed" but inside
|
151
|
-
# the gem_dir directory
|
152
|
-
Dir.chdir( spec.gem_dir ) do
|
153
|
-
setup( nil, true )
|
154
|
-
end
|
155
|
-
end
|
156
|
-
when NilClass
|
157
|
-
else
|
158
|
-
raise 'spec must be either String or Gem::Specification'
|
159
|
-
end
|
160
|
-
|
161
|
-
@spec = spec
|
162
|
-
rescue
|
163
|
-
# for all those strange gemspec we skip looking for jar-dependencies
|
164
|
-
end
|
165
|
-
|
166
|
-
def ruby_maven_install_options=( options )
|
167
|
-
@options = options.dup
|
168
|
-
@options.delete( :ignore_dependencies )
|
169
|
-
end
|
170
|
-
|
171
|
-
def vendor_jars( write_require_file = true )
|
172
|
-
return unless has_jars?
|
173
|
-
case Jars.to_prop( Jars::VENDOR )
|
174
|
-
when 'true'
|
175
|
-
do_vendor = true
|
176
|
-
when 'false'
|
177
|
-
do_vendor = false
|
178
|
-
else
|
179
|
-
# if the spec_file does not exists this means it is a local gem
|
180
|
-
# coming via bundle :path or :git
|
181
|
-
do_vendor = File.exists?( @spec.spec_file )
|
182
|
-
end
|
183
|
-
do_install( do_vendor, write_require_file )
|
184
|
-
end
|
185
|
-
|
186
|
-
def install_jars( write_require_file = true )
|
187
|
-
return unless has_jars?
|
188
|
-
do_install( false, write_require_file )
|
189
|
-
end
|
190
|
-
|
191
|
-
private
|
192
|
-
|
193
|
-
def has_jars?
|
194
|
-
# first look if there are any requirements in the spec
|
195
|
-
# and then if gem depends on jar-dependencies
|
196
|
-
# only then install the jars declared in the requirements
|
197
|
-
! @spec.requirements.empty? && @spec.dependencies.detect { |d| d.name == 'jar-dependencies' && d.type == :runtime }
|
198
|
-
end
|
199
|
-
|
200
|
-
def do_install( vendor, write_require_file )
|
201
|
-
vendor_dir = File.join( @basedir, @spec.require_path )
|
202
|
-
jars_file = File.join( vendor_dir, "#{@spec.name}_jars.rb" )
|
203
|
-
|
204
|
-
# write out new jars_file it write_require_file is true or
|
205
|
-
# check timestamps:
|
206
|
-
# do not generate file if specfile is older then the generated file
|
207
|
-
if ! write_require_file &&
|
208
|
-
File.exists?( jars_file ) &&
|
209
|
-
File.mtime( @specfile ) < File.mtime( jars_file )
|
210
|
-
# leave jars_file as is
|
211
|
-
jars_file = nil
|
212
|
-
end
|
213
|
-
self.class.install_deps( install_dependencies, vendor_dir,
|
214
|
-
jars_file, vendor )
|
215
|
-
end
|
216
|
-
|
217
|
-
def setup_arguments( deps )
|
218
|
-
args = [ 'dependency:list',
|
219
|
-
"-DoutputFile=#{deps}",
|
220
|
-
'-DoutputAbsoluteArtifactFilename=true',
|
221
|
-
'-DincludeTypes=jar',
|
222
|
-
'-DoutputScope=true',
|
223
|
-
'-f', File.dirname( __FILE__ ) + '/jars/jar_pom.rb',
|
224
|
-
"-Djars.specfile=#{@specfile}" ]
|
225
|
-
|
226
|
-
if Jars.debug?
|
227
|
-
args << '-X'
|
228
|
-
elsif not Jars.verbose?
|
229
|
-
args << '--quiet'
|
230
|
-
end
|
231
|
-
|
232
|
-
if Jars.maven_user_settings.nil? && (proxy = Gem.configuration[ :proxy ]).is_a?( String )
|
233
|
-
uri = URI.parse( proxy )
|
234
|
-
args << "-DproxySet=true"
|
235
|
-
args << "-DproxyHost=#{uri.host}"
|
236
|
-
args << "-DproxyPort=#{uri.port}"
|
237
|
-
end
|
238
|
-
|
239
|
-
if defined? JRUBY_VERSION
|
240
|
-
args << "-Dmaven.repo.local=#{java.io.File.new( Jars.home ).absolute_path}"
|
241
|
-
else
|
242
|
-
args << "-Dmaven.repo.local=#{File.expand_path( Jars.home )}"
|
243
|
-
end
|
244
|
-
|
245
|
-
args
|
246
|
-
end
|
247
|
-
|
248
|
-
def lazy_load_maven
|
249
|
-
require 'maven/ruby/maven'
|
250
|
-
rescue LoadError
|
251
|
-
install_ruby_maven
|
252
|
-
require 'maven/ruby/maven'
|
253
|
-
end
|
254
|
-
|
255
|
-
def install_ruby_maven
|
256
|
-
require 'rubygems/dependency_installer'
|
257
|
-
jars = Gem.loaded_specs[ 'jar-dependencies' ]
|
258
|
-
dep = jars.dependencies.detect { |d| d.name == 'ruby-maven' }
|
259
|
-
req = dep.nil? ? Gem::Requirement.create( '>0' ) : dep.requirement
|
260
|
-
inst = Gem::DependencyInstaller.new( @options || {} )
|
261
|
-
inst.install 'ruby-maven', req
|
262
|
-
rescue => e
|
263
|
-
warn e.backtrace.join( "\n" ) if Jars.verbose?
|
264
|
-
raise "there was an error installing 'ruby-maven'. please install it manually: #{e.inspect}"
|
265
|
-
end
|
266
|
-
|
267
|
-
def monkey_patch_gem_dependencies
|
268
|
-
# monkey patch to NOT include gem dependencies
|
269
|
-
require 'maven/tools/gemspec_dependencies'
|
270
|
-
eval <<EOF
|
271
|
-
class ::Maven::Tools::GemspecDependencies
|
272
|
-
def runtime; []; end
|
273
|
-
def development; []; end
|
274
|
-
end
|
275
|
-
EOF
|
276
|
-
end
|
277
|
-
|
278
|
-
def install_dependencies
|
279
|
-
lazy_load_maven
|
280
|
-
|
281
|
-
monkey_patch_gem_dependencies
|
282
|
-
|
283
|
-
deps = File.join( @basedir, 'deps.lst' )
|
284
|
-
|
285
|
-
maven = Maven::Ruby::Maven.new
|
286
|
-
maven.verbose = Jars.verbose?
|
287
|
-
puts " jar dependencies for #{@spec.spec_name} . . ." unless Jars.quiet?
|
288
|
-
maven.exec( *setup_arguments( deps ) )
|
289
|
-
|
290
|
-
self.class.load_from_maven( deps )
|
291
|
-
ensure
|
292
|
-
FileUtils.rm_f( deps ) if deps
|
293
|
-
end
|
294
|
-
end
|
295
|
-
end
|
1
|
+
require 'jars/installer'
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'jars/maven_exec'
|
2
|
+
require 'jars/lock'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
module Jars
|
6
|
+
|
7
|
+
class Classpath
|
8
|
+
|
9
|
+
def initialize( spec = nil )
|
10
|
+
@mvn = MavenExec.new( spec )
|
11
|
+
end
|
12
|
+
|
13
|
+
def workdir( dirname )
|
14
|
+
dir = File.join( @mvn.basedir, dirname )
|
15
|
+
dir if File.directory?( dir )
|
16
|
+
end
|
17
|
+
|
18
|
+
def jars_lock
|
19
|
+
deps = File.join( @mvn.basedir || '.', 'Jars.lock' )
|
20
|
+
deps if File.exists?( deps )
|
21
|
+
end
|
22
|
+
|
23
|
+
def dependencies_list
|
24
|
+
deps = jars_lock
|
25
|
+
if deps and File.exists?( deps )
|
26
|
+
@mvn.resolve_dependencies( deps ) if Jars.resolve?
|
27
|
+
deps
|
28
|
+
else
|
29
|
+
resolve_dependencies
|
30
|
+
end
|
31
|
+
end
|
32
|
+
private :dependencies_list
|
33
|
+
|
34
|
+
DEPENDENCY_LIST = 'dependencies.list'
|
35
|
+
def resolve_dependencies
|
36
|
+
basedir = workdir( 'pkg' ) || workdir( 'target' ) || workdir( '' )
|
37
|
+
deps = File.join( basedir, DEPENDENCY_LIST )
|
38
|
+
@mvn.resolve_dependencies( deps )
|
39
|
+
deps
|
40
|
+
end
|
41
|
+
private :resolve_dependencies
|
42
|
+
|
43
|
+
def require( scope = nil )
|
44
|
+
process( scope ) do |jar|
|
45
|
+
if jar.scope == :system
|
46
|
+
Kernel.require jar.path
|
47
|
+
else
|
48
|
+
require_jar( *jar.gacv )
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def classpath( scope = nil )
|
54
|
+
classpath = []
|
55
|
+
process( scope ) do |jar|
|
56
|
+
classpath << jar.file
|
57
|
+
end
|
58
|
+
classpath
|
59
|
+
end
|
60
|
+
|
61
|
+
def process( scope, &block )
|
62
|
+
deps = dependencies_list
|
63
|
+
Lock.new( deps ).process( scope, &block )
|
64
|
+
ensure
|
65
|
+
FileUtils.rm_f( DEPENDENCY_LIST ) if deps
|
66
|
+
end
|
67
|
+
private :process
|
68
|
+
|
69
|
+
def classpath_string( scope = nil )
|
70
|
+
classpath( scope ).join( File::PATH_SEPARATOR )
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,187 @@
|
|
1
|
+
require 'jar_dependencies'
|
2
|
+
require 'jars/maven_exec'
|
3
|
+
require 'uri'
|
4
|
+
module Jars
|
5
|
+
class Installer
|
6
|
+
|
7
|
+
class Dependency
|
8
|
+
|
9
|
+
attr_reader :path, :file, :gav, :scope, :type, :coord
|
10
|
+
|
11
|
+
def self.new( line )
|
12
|
+
if line.match /:jar:|:pom:/
|
13
|
+
super
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def setup_type( line )
|
18
|
+
if line.match /:pom:/
|
19
|
+
@type = :pom
|
20
|
+
elsif line.match /:jar:/
|
21
|
+
@type = :jar
|
22
|
+
end
|
23
|
+
end
|
24
|
+
private :setup_type
|
25
|
+
|
26
|
+
def setup_scope( line )
|
27
|
+
@scope =
|
28
|
+
case line
|
29
|
+
when /:provided:/
|
30
|
+
:provided
|
31
|
+
when /:test:/
|
32
|
+
:test
|
33
|
+
else
|
34
|
+
:runtime
|
35
|
+
end
|
36
|
+
end
|
37
|
+
private :setup_scope
|
38
|
+
|
39
|
+
def initialize( line )
|
40
|
+
setup_type( line )
|
41
|
+
|
42
|
+
line.sub!( /^\s+/, '' )
|
43
|
+
@coord = line.sub( /:[^:]+:([A-Z]:\\)?[^:]+$/, '' )
|
44
|
+
first, second = @coord.split( /:#{type}:/ )
|
45
|
+
group_id, artifact_id = first.split( /:/ )
|
46
|
+
parts = group_id.split( '.' )
|
47
|
+
parts << artifact_id
|
48
|
+
parts << second.split( /:/ )[ -1 ]
|
49
|
+
parts << File.basename( line.sub /.:/, '' )
|
50
|
+
@path = File.join( parts ).strip
|
51
|
+
|
52
|
+
setup_scope( line )
|
53
|
+
|
54
|
+
reg = /:jar:|:pom:|:test:|:compile:|:runtime:|:provided:|:system:/
|
55
|
+
@file = line.slice(@coord.length, line.length).sub(reg, '').strip
|
56
|
+
@system = nil != (line =~ /:system:/)
|
57
|
+
@gav = @coord.sub(reg, ':')
|
58
|
+
end
|
59
|
+
|
60
|
+
def system?
|
61
|
+
@system
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.install_jars( write_require_file = false )
|
66
|
+
new.install_jars( write_require_file )
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.vendor_jars( write_require_file = false )
|
70
|
+
new.vendor_jars( write_require_file )
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.load_from_maven( file )
|
74
|
+
result = []
|
75
|
+
File.read( file ).each_line do |line|
|
76
|
+
dep = Dependency.new( line )
|
77
|
+
result << dep if dep && dep.scope == :runtime
|
78
|
+
end
|
79
|
+
result
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.write_require_file( require_filename )
|
83
|
+
FileUtils.mkdir_p( File.dirname( require_filename ) )
|
84
|
+
comment = '# this is a generated file, to avoid over-writing it just delete this comment'
|
85
|
+
if ! File.exists?( require_filename ) || File.read( require_filename ).match( comment )
|
86
|
+
f = File.open( require_filename, 'w' )
|
87
|
+
f.puts comment
|
88
|
+
f.puts "require 'jar_dependencies'"
|
89
|
+
f.puts
|
90
|
+
f
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.vendor_file( dir, dep )
|
95
|
+
vendored = File.join( dir, dep.path )
|
96
|
+
FileUtils.mkdir_p( File.dirname( vendored ) )
|
97
|
+
FileUtils.cp( dep.file, vendored ) unless dep.system?
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.write_dep( file, dir, dep, vendor )
|
101
|
+
return if dep.type != :jar || dep.scope != :runtime
|
102
|
+
if dep.system?
|
103
|
+
file.puts( "require( '#{dep.file}' )" ) if file
|
104
|
+
elsif dep.scope == :runtime
|
105
|
+
vendor_file( dir, dep ) if vendor
|
106
|
+
file.puts( "require_jar( '#{dep.gav.gsub( /:/, "', '" )}' )" ) if file
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.install_deps( deps, dir, require_filename, vendor )
|
111
|
+
f = write_require_file( require_filename ) if require_filename
|
112
|
+
deps.each do |dep|
|
113
|
+
write_dep( f, dir, dep, vendor )
|
114
|
+
end
|
115
|
+
yield f if block_given? and f
|
116
|
+
ensure
|
117
|
+
f.close if f
|
118
|
+
end
|
119
|
+
|
120
|
+
def vendor_jars( write_require_file = true )
|
121
|
+
return unless has_jars?
|
122
|
+
case Jars.to_prop( Jars::VENDOR )
|
123
|
+
when 'true'
|
124
|
+
do_vendor = true
|
125
|
+
when 'false'
|
126
|
+
do_vendor = false
|
127
|
+
else
|
128
|
+
# if the spec_file does not exists this means it is a local gem
|
129
|
+
# coming via bundle :path or :git
|
130
|
+
do_vendor = File.exists?( @mvn.spec.spec_file )
|
131
|
+
end
|
132
|
+
do_install( do_vendor, write_require_file )
|
133
|
+
end
|
134
|
+
|
135
|
+
def install_jars( write_require_file = true )
|
136
|
+
return unless has_jars?
|
137
|
+
do_install( false, write_require_file )
|
138
|
+
end
|
139
|
+
|
140
|
+
def initialize( spec = nil )
|
141
|
+
@mvn = MavenExec.new( spec )
|
142
|
+
end
|
143
|
+
|
144
|
+
def ruby_maven_install_options=( options )
|
145
|
+
@mvn.ruby_maven_install_options=( options )
|
146
|
+
end
|
147
|
+
|
148
|
+
private
|
149
|
+
|
150
|
+
def has_jars?
|
151
|
+
# first look if there are any requirements in the spec
|
152
|
+
# and then if gem depends on jar-dependencies
|
153
|
+
# only then install the jars declared in the requirements
|
154
|
+
@mvn.spec != nil && ! @mvn.spec.requirements.empty? && @mvn.spec.dependencies.detect { |d| d.name == 'jar-dependencies' && d.type == :runtime }
|
155
|
+
end
|
156
|
+
|
157
|
+
def do_install( vendor, write_require_file )
|
158
|
+
vendor_dir = File.join( @mvn.basedir, @mvn.spec.require_path )
|
159
|
+
jars_file = File.join( vendor_dir, "#{@mvn.spec.name}_jars.rb" )
|
160
|
+
|
161
|
+
# write out new jars_file it write_require_file is true or
|
162
|
+
# check timestamps:
|
163
|
+
# do not generate file if specfile is older then the generated file
|
164
|
+
if ! write_require_file &&
|
165
|
+
File.exists?( jars_file ) &&
|
166
|
+
File.mtime( @mvn.specfile ) < File.mtime( jars_file )
|
167
|
+
# leave jars_file as is
|
168
|
+
jars_file = nil
|
169
|
+
end
|
170
|
+
self.class.install_deps( install_dependencies, vendor_dir,
|
171
|
+
jars_file, vendor )
|
172
|
+
end
|
173
|
+
|
174
|
+
def install_dependencies
|
175
|
+
deps = File.join( @mvn.basedir, 'deps.lst' )
|
176
|
+
|
177
|
+
puts " jar dependencies for #{@mvn.spec.spec_name} . . ." unless Jars.quiet?
|
178
|
+
@mvn.resolve_dependencies( deps )
|
179
|
+
|
180
|
+
self.class.load_from_maven( deps )
|
181
|
+
ensure
|
182
|
+
FileUtils.rm_f( deps ) if deps
|
183
|
+
end
|
184
|
+
end
|
185
|
+
# to stay backward compatible
|
186
|
+
JarInstaller = Installer
|
187
|
+
end
|
data/lib/jars/jar_pom.rb
CHANGED
@@ -1,14 +1,18 @@
|
|
1
|
-
# this file is maven DSL and used by maven via
|
1
|
+
# this file is maven DSL and used by maven via jars/maven_exec.rb
|
2
2
|
|
3
3
|
specfile = java.lang.System.getProperty('jars.specfile')
|
4
4
|
|
5
5
|
# needed since the gemspec does not allow absolute files
|
6
6
|
basedir( File.dirname( specfile ) )
|
7
7
|
|
8
|
+
# add jruby for compilation
|
9
|
+
jar 'org.jruby:jruby-core', JRUBY_VERSION, :scope => :provided
|
10
|
+
|
8
11
|
# get ALL depenedencies from the specfile
|
9
12
|
gemspec File.basename( specfile )
|
10
13
|
|
11
|
-
# we do not want those gem dependencies
|
14
|
+
# we do not want those gem dependencies, each gem takes care of its
|
15
|
+
# own jar dependencies
|
12
16
|
gems = model.dependencies.select do |d|
|
13
17
|
d.group_id == 'rubygems'
|
14
18
|
end
|
@@ -18,5 +22,5 @@ end
|
|
18
22
|
|
19
23
|
# some output
|
20
24
|
model.dependencies.each do |d|
|
21
|
-
puts " " + d.group_id + ':' + d.artifact_id + (d.classifier ? ":" + d.classifier : "" ) + ":" + d.version
|
25
|
+
puts " " + d.group_id + ':' + d.artifact_id + (d.classifier ? ":" + d.classifier : "" ) + ":" + d.version unless d.artifact_id == 'jruby-core'
|
22
26
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# this file is maven DSL and used by maven via jars/maven_exec.rb
|
2
|
+
|
3
|
+
require_relative 'lock'
|
4
|
+
require_relative '../jar_dependencies'
|
5
|
+
|
6
|
+
lock = Jars::Lock.new( java.lang.System.getProperty('outputFile') )
|
7
|
+
|
8
|
+
lock.process( :all ) do |coord|
|
9
|
+
|
10
|
+
options = { :scope => coord.scope }
|
11
|
+
options[ :systemPath ] = coord[ -1 ] if coord.scope == :system
|
12
|
+
options[ :classifier ] = coord.classifier
|
13
|
+
|
14
|
+
jar coord.group_id, coord.artifact_id, coord.version, options
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
properties :excludeTransitive => true
|
data/lib/jars/lock.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'jars/maven_exec'
|
2
|
+
|
3
|
+
module Jars
|
4
|
+
class JarDetails < Array
|
5
|
+
|
6
|
+
def scope
|
7
|
+
self[ -2 ].to_sym
|
8
|
+
end
|
9
|
+
|
10
|
+
def file
|
11
|
+
f = self[ -1 ].strip
|
12
|
+
if f.empty?
|
13
|
+
path
|
14
|
+
else
|
15
|
+
f
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def group_id
|
20
|
+
self[ 0 ]
|
21
|
+
end
|
22
|
+
|
23
|
+
def artifact_id
|
24
|
+
self[ 1 ]
|
25
|
+
end
|
26
|
+
|
27
|
+
def version
|
28
|
+
self[ -3 ]
|
29
|
+
end
|
30
|
+
|
31
|
+
def classifier
|
32
|
+
size == 5 ? nil : self[ 2 ]
|
33
|
+
end
|
34
|
+
|
35
|
+
def gacv
|
36
|
+
classifier ? self[ 0..3 ] : self[ 0..2 ]
|
37
|
+
end
|
38
|
+
|
39
|
+
def path
|
40
|
+
if scope == :system
|
41
|
+
# replace maven like system properties embedded into the string
|
42
|
+
self[ -1 ].gsub( /\$\{[a-zA-Z.]+\}/ ) do |a|
|
43
|
+
ENV_JAVA[ a[2..-2] ] || a
|
44
|
+
end
|
45
|
+
else
|
46
|
+
File.join( Jars.home, group_id.gsub(/[.]/, '/'), artifact_id, version, gacv[ 1..-1 ].join( '-' ) + '.jar' )
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class Lock
|
52
|
+
|
53
|
+
def initialize( file )
|
54
|
+
@file = file
|
55
|
+
end
|
56
|
+
|
57
|
+
def process( scope )
|
58
|
+
scope ||= :compile
|
59
|
+
File.read( @file ).each_line do |line|
|
60
|
+
next if not line =~ /:.+:/
|
61
|
+
jar = JarDetails.new( line.strip
|
62
|
+
.sub( /:jar:/, ':' )
|
63
|
+
.sub( /:$/, ': ' ).split( /:/ ) )
|
64
|
+
case scope
|
65
|
+
when :all
|
66
|
+
yield jar
|
67
|
+
when :compile
|
68
|
+
yield jar if jar.scope != :test
|
69
|
+
when :runtime
|
70
|
+
yield jar if jar.scope != :test and jar.scope != :provided
|
71
|
+
when :test
|
72
|
+
yield jar if jar.scope != :runtime
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'jar_dependencies'
|
2
|
+
require 'uri'
|
3
|
+
module Jars
|
4
|
+
class MavenExec
|
5
|
+
|
6
|
+
def find_spec( allow_no_file )
|
7
|
+
specs = Dir[ '*.gemspec' ]
|
8
|
+
case specs.size
|
9
|
+
when 0
|
10
|
+
raise 'no gemspec found' unless allow_no_file
|
11
|
+
when 1
|
12
|
+
specs.first
|
13
|
+
else
|
14
|
+
raise 'more then one gemspec found. please specify a specfile' unless allow_no_file
|
15
|
+
end
|
16
|
+
end
|
17
|
+
private :find_spec
|
18
|
+
|
19
|
+
attr_reader :basedir, :spec, :specfile
|
20
|
+
|
21
|
+
def initialize( spec = nil )
|
22
|
+
setup( spec )
|
23
|
+
end
|
24
|
+
|
25
|
+
def setup( spec = nil, allow_no_file = false )
|
26
|
+
spec ||= find_spec( allow_no_file )
|
27
|
+
|
28
|
+
case spec
|
29
|
+
when String
|
30
|
+
@specfile = File.expand_path( spec )
|
31
|
+
@basedir = File.dirname( @specfile )
|
32
|
+
spec = eval( File.read( spec ) )
|
33
|
+
when Gem::Specification
|
34
|
+
if File.exists?( spec.spec_file )
|
35
|
+
@basedir = spec.gem_dir
|
36
|
+
@specfile = spec.spec_file
|
37
|
+
else
|
38
|
+
# this happens with bundle and local gems
|
39
|
+
# there the spec_file is "not installed" but inside
|
40
|
+
# the gem_dir directory
|
41
|
+
Dir.chdir( spec.gem_dir ) do
|
42
|
+
setup( nil, true )
|
43
|
+
end
|
44
|
+
end
|
45
|
+
when NilClass
|
46
|
+
else
|
47
|
+
raise 'spec must be either String or Gem::Specification'
|
48
|
+
end
|
49
|
+
|
50
|
+
@spec = spec
|
51
|
+
rescue
|
52
|
+
# for all those strange gemspec we skip looking for jar-dependencies
|
53
|
+
end
|
54
|
+
|
55
|
+
def ruby_maven_install_options=( options )
|
56
|
+
@options = options.dup
|
57
|
+
@options.delete( :ignore_dependencies )
|
58
|
+
end
|
59
|
+
|
60
|
+
def resolve_dependencies( file )
|
61
|
+
lazy_load_maven
|
62
|
+
|
63
|
+
maven = Maven::Ruby::Maven.new
|
64
|
+
maven.verbose = Jars.verbose?
|
65
|
+
maven.exec( *setup_arguments( file ) )
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def setup_arguments( deps )
|
71
|
+
if File.basename( deps ) == 'Jars.lock'
|
72
|
+
pom = 'jars_lock_pom.rb'
|
73
|
+
goals = [ 'dependency:copy-dependencies' ]
|
74
|
+
else
|
75
|
+
pom = 'jar_pom.rb'
|
76
|
+
goals = [ 'dependency:copy-dependencies', 'dependency:list' ]
|
77
|
+
end
|
78
|
+
args = [ *goals,
|
79
|
+
"-DoutputFile=#{deps}",
|
80
|
+
'-DoutputAbsoluteArtifactFilename=true',
|
81
|
+
'-DincludeTypes=jar',
|
82
|
+
'-DoutputScope=true',
|
83
|
+
'-DuseRepositoryLayout=true',
|
84
|
+
"-DoutputDirectory=#{Jars.home}",
|
85
|
+
'-f', File.dirname( __FILE__ ) + '/' + pom,
|
86
|
+
"-Djars.specfile=#{@specfile}" ]
|
87
|
+
|
88
|
+
if Jars.debug?
|
89
|
+
args << '-X'
|
90
|
+
elsif not Jars.verbose?
|
91
|
+
args << '--quiet'
|
92
|
+
end
|
93
|
+
|
94
|
+
if Jars.maven_user_settings.nil? && (proxy = Gem.configuration[ :proxy ]).is_a?( String )
|
95
|
+
uri = URI.parse( proxy )
|
96
|
+
args << "-DproxySet=true"
|
97
|
+
args << "-DproxyHost=#{uri.host}"
|
98
|
+
args << "-DproxyPort=#{uri.port}"
|
99
|
+
end
|
100
|
+
|
101
|
+
if defined? JRUBY_VERSION
|
102
|
+
args << "-Dmaven.repo.local=#{java.io.File.new( Jars.home ).absolute_path}"
|
103
|
+
else
|
104
|
+
args << "-Dmaven.repo.local=#{File.expand_path( Jars.home )}"
|
105
|
+
end
|
106
|
+
|
107
|
+
args
|
108
|
+
end
|
109
|
+
|
110
|
+
def lazy_load_maven
|
111
|
+
require 'maven/ruby/maven'
|
112
|
+
rescue LoadError
|
113
|
+
install_ruby_maven
|
114
|
+
require 'maven/ruby/maven'
|
115
|
+
end
|
116
|
+
|
117
|
+
def install_ruby_maven
|
118
|
+
require 'rubygems/dependency_installer'
|
119
|
+
jars = Gem.loaded_specs[ 'jar-dependencies' ]
|
120
|
+
dep = jars.dependencies.detect { |d| d.name == 'ruby-maven' }
|
121
|
+
req = dep.nil? ? Gem::Requirement.create( '>0' ) : dep.requirement
|
122
|
+
inst = Gem::DependencyInstaller.new( @options || {} )
|
123
|
+
inst.install 'ruby-maven', req
|
124
|
+
rescue => e
|
125
|
+
warn e.backtrace.join( "\n" ) if Jars.verbose?
|
126
|
+
raise "there was an error installing 'ruby-maven'. please install it manually: #{e.inspect}"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2014 Christian Meier
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
5
|
+
# this software and associated documentation files (the "Software"), to deal in
|
6
|
+
# the Software without restriction, including without limitation the rights to
|
7
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
8
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
9
|
+
# subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in all
|
12
|
+
# copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
16
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
17
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
18
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
19
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
|
+
#
|
21
|
+
|
22
|
+
if defined?( JRUBY_VERSION ) && Gem.post_install_hooks.empty?
|
23
|
+
Gem.post_install do |gem_installer|
|
24
|
+
unless (ENV['JARS_SKIP'] || ENV_JAVA['jars.skip']) == 'true'
|
25
|
+
require 'jars/installer'
|
26
|
+
jars = Jars::Installer.new( gem_installer.spec )
|
27
|
+
jars.ruby_maven_install_options = gem_installer.options || {}
|
28
|
+
jars.vendor_jars
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/rubygems_plugin.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jar-dependencies
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- christian meier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -66,6 +66,12 @@ files:
|
|
66
66
|
- lib/jar-dependencies.rb
|
67
67
|
- lib/rubygems_plugin.rb
|
68
68
|
- lib/jars/jar_pom.rb
|
69
|
+
- lib/jars/jars_lock_pom.rb
|
70
|
+
- lib/jars/installer.rb
|
71
|
+
- lib/jars/lock.rb
|
72
|
+
- lib/jars/maven_exec.rb
|
73
|
+
- lib/jars/classpath.rb
|
74
|
+
- lib/jars/post_install_hook.rb
|
69
75
|
- bin/bundle-with-jars
|
70
76
|
- Rakefile
|
71
77
|
- Mavenfile
|