jbundler 0.8.0.pre → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +15 -13
- data/Readme.md +103 -15
- data/bin/jbundle +40 -40
- data/lib/jbundler.rb +47 -5
- data/lib/jbundler/aether.rb +139 -0
- data/lib/jbundler/classpath_file.rb +115 -0
- data/lib/jbundler/cli.rb +146 -0
- data/lib/jbundler/config.rb +191 -0
- data/lib/jbundler/configurator.rb +27 -0
- data/lib/jbundler/context.rb +34 -0
- data/lib/jbundler/dependency_pom.rb +30 -0
- data/lib/jbundler/gemfile_lock.rb +69 -0
- data/lib/jbundler/jarfile_lock.rb +67 -0
- data/lib/jbundler/jruby_complete.rb +44 -0
- data/lib/jbundler/jruby_complete_pom.rb +31 -0
- data/lib/jbundler/lock_down.rb +166 -0
- data/lib/jbundler/pom.rb +145 -27
- data/lib/jbundler/pom_runner.rb +71 -0
- data/lib/jbundler/show.rb +53 -0
- data/lib/jbundler/tree.rb +31 -0
- data/lib/jbundler/vendor.rb +52 -0
- data/spec/classpath_file_spec.rb +138 -0
- data/spec/config_spec.rb +180 -0
- data/spec/pom_spec.rb +30 -0
- data/spec/project/Settings.xml +0 -0
- data/spec/project/settings.xml +0 -0
- data/spec/setup.rb +16 -0
- data/spec/vendor_spec.rb +60 -0
- metadata +77 -37
- data/lib/jbundler/executor.rb +0 -107
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'jbundler/configurator'
|
2
|
+
module JBundler
|
3
|
+
class Configurator
|
4
|
+
|
5
|
+
attr_accessor :groups, :bootstrap, :verbose, :compile, :work_dir
|
6
|
+
|
7
|
+
def initialize( config )
|
8
|
+
@config = config
|
9
|
+
end
|
10
|
+
|
11
|
+
def configure( maven )
|
12
|
+
maven.property( 'jbundler.basedir', @config.basedir )
|
13
|
+
maven.property( 'jbundler.jarfile', @config.jarfile )
|
14
|
+
maven.property( 'jbundler.gemfile', @config.gemfile )
|
15
|
+
maven.property( 'jbundler.workdir', work_dir )
|
16
|
+
maven.property( 'jbundler.groups', @groups )
|
17
|
+
maven.property( 'jbundler.bootstrap', @bootstrap )
|
18
|
+
maven.property( 'maven.repo.local', @config.local_repository ) if @config.local_repository
|
19
|
+
maven.options[ '-s' ] = @config.settings if @config.settings
|
20
|
+
maven.options[ '-o' ] = nil if @config.offline
|
21
|
+
end
|
22
|
+
|
23
|
+
def work_dir
|
24
|
+
@work_dir ||= File.expand_path( @config.work_dir )
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'maven/tools/jarfile'
|
2
|
+
require 'jbundler/classpath_file'
|
3
|
+
require 'jbundler/vendor'
|
4
|
+
require 'jbundler/gemfile_lock'
|
5
|
+
require 'jbundler/aether'
|
6
|
+
|
7
|
+
module JBundler
|
8
|
+
|
9
|
+
class Context
|
10
|
+
|
11
|
+
attr_reader :config
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@config = JBundler::Config.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def jarfile
|
18
|
+
@jarfile ||= Maven::Tools::Jarfile.new( @config.jarfile )
|
19
|
+
end
|
20
|
+
|
21
|
+
def vendor
|
22
|
+
@vendor ||= JBundler::Vendor.new( @config.vendor_dir )
|
23
|
+
end
|
24
|
+
|
25
|
+
def classpath
|
26
|
+
@classpath ||= JBundler::ClasspathFile.new( @config.classpath_file )
|
27
|
+
end
|
28
|
+
|
29
|
+
def gemfile_lock
|
30
|
+
@gemfile_lock ||= JBundler::GemfileLock.new( jarfile,
|
31
|
+
@config.gemfile_lock )
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
bdir = java.lang.System.getProperty( "jbundler.basedir" )
|
2
|
+
jfile = java.lang.System.getProperty( "jbundler.jarfile" )
|
3
|
+
gfile = java.lang.System.getProperty( "jbundler.gemfile" )
|
4
|
+
jworkdir = java.lang.System.getProperty( "jbundler.workdir" )
|
5
|
+
|
6
|
+
basedir( bdir )
|
7
|
+
if basedir != bdir
|
8
|
+
# older maven-tools needs this
|
9
|
+
self.instance_variable_set( :@basedir, bdir )
|
10
|
+
end
|
11
|
+
|
12
|
+
( 0..(java.lang.System.getProperty( "jbundler.jars.size" ).to_i - 1) ).each do |i|
|
13
|
+
coord = java.lang.System.getProperty( "jbundler.jars.#{i}" )
|
14
|
+
dependency_artifact( Maven::Tools::Artifact.from_coordinate( coord.to_s ) )
|
15
|
+
end
|
16
|
+
|
17
|
+
jarfile( jfile )
|
18
|
+
|
19
|
+
build do
|
20
|
+
directory = jworkdir
|
21
|
+
end
|
22
|
+
|
23
|
+
properties( 'project.build.sourceEncoding' => 'utf-8',
|
24
|
+
'tesla.dump.readOnly' => true,
|
25
|
+
'tesla.dump.pom' => 'tree.pom.xml' )
|
26
|
+
|
27
|
+
plugin( :dependency, '2.8',
|
28
|
+
:includeTypes => 'jar',
|
29
|
+
:outputAbsoluteArtifactFilename => true,
|
30
|
+
:outputFile => java.lang.System.getProperty( "jbundler.outputFile" ) )
|
@@ -0,0 +1,69 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2013 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
|
+
require 'rubygems'
|
22
|
+
require 'jbundler/pom'
|
23
|
+
require 'bundler'
|
24
|
+
|
25
|
+
module JBundler
|
26
|
+
|
27
|
+
class GemfileLock
|
28
|
+
|
29
|
+
def initialize(jarfile, lockfile = 'Gemfile.lock')
|
30
|
+
@jarfile = jarfile
|
31
|
+
@lockfile = lockfile if File.exists?(lockfile)
|
32
|
+
end
|
33
|
+
|
34
|
+
def exists?
|
35
|
+
!@lockfile.nil?
|
36
|
+
end
|
37
|
+
|
38
|
+
def newer?( mtime )
|
39
|
+
exists? && ( self.mtime > mtime )
|
40
|
+
end
|
41
|
+
|
42
|
+
def mtime
|
43
|
+
File.mtime(@lockfile) if @lockfile
|
44
|
+
end
|
45
|
+
|
46
|
+
def populate_dependencies(aether)
|
47
|
+
if @lockfile
|
48
|
+
# assuming we run in Bundler context here
|
49
|
+
# since we have a Gemfile.lock :)
|
50
|
+
Bundler.load.specs.each do |spec|
|
51
|
+
jars = []
|
52
|
+
spec.requirements.each do |rr|
|
53
|
+
rr.split(/\n/).each do |r|
|
54
|
+
jars << r if r =~ /^\s*(jar|pom)\s/
|
55
|
+
end
|
56
|
+
end
|
57
|
+
unless jars.empty?
|
58
|
+
pom = Pom.new(spec.name, spec.version, jars, "pom")
|
59
|
+
aether.install(pom.coordinate, pom.file)
|
60
|
+
unless @jarfile.locked?(pom.coordinate)
|
61
|
+
aether.add_artifact(pom.coordinate)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,67 @@
|
|
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
|
+
require 'jar_dependencies'
|
22
|
+
require 'maven/tools/dsl/jarfile_lock'
|
23
|
+
module JBundler
|
24
|
+
class JarfileLock < Maven::Tools::DSL::JarfileLock
|
25
|
+
|
26
|
+
def require( scope = :runtime )
|
27
|
+
coordinates( scope ).each do |coord|
|
28
|
+
Jars.require_jar( coord.split( /:/ ) )
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def classpath( scope = :runtime )
|
33
|
+
coordinates( scope ).collect do |coord|
|
34
|
+
path_to_jar( coord.split( /:/ ) )
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def downloaded?
|
39
|
+
classpath.member?( nil ) == false &&
|
40
|
+
classpath( :test ).member?( nil ) == false
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
# TODO should move into jar-dependencies
|
46
|
+
def to_path( group_id, artifact_id, *classifier_version )
|
47
|
+
version = classifier_version[ -1 ]
|
48
|
+
classifier = classifier_version[ -2 ]
|
49
|
+
|
50
|
+
jar = to_jar( group_id, artifact_id, version, classifier )
|
51
|
+
( [ Jars.home ] + $LOAD_PATH ).each do |path|
|
52
|
+
if File.exists?( f = File.join( path, jar ) )
|
53
|
+
return f
|
54
|
+
end
|
55
|
+
end
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
|
59
|
+
# TODO this is copy and paste from jar-dependncies
|
60
|
+
def to_jar( group_id, artifact_id, version, classifier )
|
61
|
+
file = "#{group_id.gsub( /\./, '/' )}/#{artifact_id}/#{version}/#{artifact_id}-#{version}"
|
62
|
+
file << "-#{classifier}" if classifier
|
63
|
+
file << '.jar'
|
64
|
+
file
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'jbundler/pom_runner'
|
2
|
+
require 'fileutils'
|
3
|
+
module JBundler
|
4
|
+
class JRubyComplete < PomRunner
|
5
|
+
|
6
|
+
def initialize( config, options )
|
7
|
+
super options
|
8
|
+
work_dir = File.expand_path( config.work_dir )
|
9
|
+
maven.property( 'jbundler.workdir', work_dir )
|
10
|
+
maven.property( 'jbundler.basedir', config.basedir )
|
11
|
+
maven.property( 'jbundler.jarfile', config.jarfile )
|
12
|
+
maven.property( 'jbundler.gemfile', config.gemfile )
|
13
|
+
@tree = File.join( work_dir, 'tree.txt' )
|
14
|
+
maven.property( 'jbundler.outputFile', @tree )
|
15
|
+
end
|
16
|
+
|
17
|
+
def pom_file
|
18
|
+
File.join( File.dirname( __FILE__ ), 'jruby_complete_pom.rb' )
|
19
|
+
end
|
20
|
+
|
21
|
+
def show_versions
|
22
|
+
puts '...'
|
23
|
+
|
24
|
+
FileUtils.rm_f( @tree )
|
25
|
+
|
26
|
+
exec( 'dependency:tree' )
|
27
|
+
|
28
|
+
if File.exists?( @tree )
|
29
|
+
puts File.read( @tree )
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def packit
|
34
|
+
puts '...'
|
35
|
+
exec( :package )
|
36
|
+
|
37
|
+
puts
|
38
|
+
puts 'now you can use jruby like this'
|
39
|
+
puts
|
40
|
+
puts "\tjava -jar jruby_complete_custom.jar"
|
41
|
+
puts
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
jfile = ::Maven::Tools::Jarfile.new( java.lang.System.getProperty( "jbundler.jarfile" ) )
|
2
|
+
workdir = java.lang.System.getProperty( "jbundler.workdir" )
|
3
|
+
jworkdir = File.join( workdir, 'jruby_complete' )
|
4
|
+
FileUtils.mkdir_p( jworkdir )
|
5
|
+
|
6
|
+
build.directory = jworkdir
|
7
|
+
|
8
|
+
properties( 'maven.test.skip' => true,
|
9
|
+
'project.build.sourceEncoding' => 'utf-8' )
|
10
|
+
|
11
|
+
jfile.populate_unlocked do |dsl|
|
12
|
+
setup_jruby( dsl.jruby || JRUBY_VERSION, :compile )
|
13
|
+
dsl.artifacts.select do |a|
|
14
|
+
a[ :scope ] == :provided
|
15
|
+
end.each do |a|
|
16
|
+
a[ :scope ] = :compile
|
17
|
+
artifact( a )
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
plugin( :shade, '2.1',
|
22
|
+
:outputFile => "${user.dir}/jruby-complete-custom.jar",
|
23
|
+
:transformers => [ { '@implementation' => 'org.apache.maven.plugins.shade.resource.ManifestResourceTransformer',
|
24
|
+
:mainClass => 'org.jruby.Main' } ] ) do
|
25
|
+
execute_goals( 'shade', :phase => 'package' )
|
26
|
+
end
|
27
|
+
|
28
|
+
plugin( :dependency, '2.8',
|
29
|
+
:includeTypes => 'jar',
|
30
|
+
:outputAbsoluteArtifactFilename => true,
|
31
|
+
:outputFile => java.lang.System.getProperty( "jbundler.outputFile" ) )
|
@@ -0,0 +1,166 @@
|
|
1
|
+
require 'jbundler/configurator'
|
2
|
+
require 'jbundler/classpath_file'
|
3
|
+
require 'jbundler/vendor'
|
4
|
+
require 'jbundler/gemfile_lock'
|
5
|
+
require 'jbundler/show'
|
6
|
+
require 'maven/tools/gemspec_dependencies'
|
7
|
+
require 'maven/tools/jarfile'
|
8
|
+
require 'maven/ruby/maven'
|
9
|
+
require 'fileutils'
|
10
|
+
require 'jar_installer'
|
11
|
+
|
12
|
+
module JBundler
|
13
|
+
class LockDown
|
14
|
+
|
15
|
+
def initialize( config )
|
16
|
+
@config = config
|
17
|
+
@configurator = Configurator.new( config )
|
18
|
+
end
|
19
|
+
|
20
|
+
def vendor
|
21
|
+
@vendor ||= JBundler::Vendor.new( @config.vendor_dir )
|
22
|
+
end
|
23
|
+
|
24
|
+
def update( debug = false, verbose = false )
|
25
|
+
if vendor.vendored?
|
26
|
+
raise 'can not update vendored jars'
|
27
|
+
end
|
28
|
+
|
29
|
+
FileUtils.rm_f( @config.jarfile_lock )
|
30
|
+
|
31
|
+
lock_down( false, debug, verbose )
|
32
|
+
end
|
33
|
+
|
34
|
+
def lock_down( needs_vendor = false, debug = false, verbose = false )
|
35
|
+
jarfile = Maven::Tools::Jarfile.new( @config.jarfile )
|
36
|
+
classpath = JBundler::ClasspathFile.new( @config.classpath_file )
|
37
|
+
if jarfile.exists_lock? && classpath.exists?
|
38
|
+
needs_update = false
|
39
|
+
else
|
40
|
+
needs_update = needs_update?( jarfile, classpath )
|
41
|
+
end
|
42
|
+
if ( ! needs_update && ! needs_vendor ) || vendor.vendored?
|
43
|
+
|
44
|
+
puts 'Jar dependencies are up to date !'
|
45
|
+
|
46
|
+
if needs_update?( jarfile, classpath )
|
47
|
+
f = classpath.file.sub(/#{Dir.pwd}#{File::SEPARATOR}/, '' )
|
48
|
+
"the #{f} is stale, i.e. Gemfile or Jarfile is newer. `jbundle update` will update it"
|
49
|
+
end
|
50
|
+
else
|
51
|
+
|
52
|
+
puts '...'
|
53
|
+
|
54
|
+
deps = install_dependencies( debug, verbose, jarfile.exists_lock? )
|
55
|
+
|
56
|
+
update_files( classpath, collect_jars( deps ) ) if needs_update
|
57
|
+
|
58
|
+
vendor_it( vendor, deps ) if needs_vendor
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def needs_update?( jarfile, classpath )
|
66
|
+
gemfile_lock = JBundler::GemfileLock.new( jarfile,
|
67
|
+
@config.gemfile_lock )
|
68
|
+
classpath.needs_update?( jarfile, gemfile_lock )
|
69
|
+
end
|
70
|
+
|
71
|
+
def vendor_it( vendor, deps )
|
72
|
+
puts "vendor directory: #{@config.vendor_dir}"
|
73
|
+
vendor.vendor_dependencies( deps )
|
74
|
+
puts
|
75
|
+
end
|
76
|
+
|
77
|
+
def collect_jars( deps )
|
78
|
+
jars = {}
|
79
|
+
deps.each do |d|
|
80
|
+
case d.scope
|
81
|
+
when :provided
|
82
|
+
( jars[ :jruby ] ||= [] ) << d
|
83
|
+
when :test
|
84
|
+
( jars[ :test ] ||= [] ) << d
|
85
|
+
else
|
86
|
+
( jars[ :runtime ] ||= [] ) << d
|
87
|
+
end
|
88
|
+
end
|
89
|
+
jars
|
90
|
+
end
|
91
|
+
|
92
|
+
def update_files( classpath_file, jars )
|
93
|
+
if jars.values.flatten.size == 0
|
94
|
+
FileUtils.rm_f @config.jarfile_lock
|
95
|
+
else
|
96
|
+
lock = Maven::Tools::DSL::JarfileLock.new( @config.jarfile )
|
97
|
+
lock.replace( jars )
|
98
|
+
lock.dump
|
99
|
+
end
|
100
|
+
classpath_file.generate( (jars[ :runtime ] || []).collect { |j| j.file },
|
101
|
+
(jars[ :test ] || []).collect { |j| j.file },
|
102
|
+
(jars[ :jruby ] || []).collect { |j| j.file },
|
103
|
+
@config.local_repository )
|
104
|
+
end
|
105
|
+
|
106
|
+
def install_dependencies( debug, verbose, exclude_transitive = false )
|
107
|
+
deps_file = File.join( File.expand_path( @config.work_dir ),
|
108
|
+
'dependencies.txt' )
|
109
|
+
|
110
|
+
exec_maven( debug, verbose, deps_file, exclude_transitive )
|
111
|
+
|
112
|
+
result = []
|
113
|
+
File.read( deps_file ).each_line do |line|
|
114
|
+
dep = Jars::JarInstaller::Dependency.new( line )
|
115
|
+
result << dep if dep
|
116
|
+
end
|
117
|
+
result
|
118
|
+
ensure
|
119
|
+
FileUtils.rm_f( deps_file ) if deps_file
|
120
|
+
end
|
121
|
+
|
122
|
+
def exec_maven( debug, verbose, output, exclude_transitive = false )
|
123
|
+
m = Maven::Ruby::Maven.new
|
124
|
+
m.options[ '-f' ] = File.join( File.dirname( __FILE__ ),
|
125
|
+
'dependency_pom.rb' )
|
126
|
+
m.property( 'verbose', debug || verbose )
|
127
|
+
m.options[ '-q' ] = nil if !debug and !verbose
|
128
|
+
m.options[ '-e' ] = nil if !debug and verbose
|
129
|
+
m.options[ '-X' ] = nil if debug
|
130
|
+
m.options[ '-DexcludeTransitive' ] = exclude_transitive
|
131
|
+
m.verbose = debug
|
132
|
+
m.property( 'jbundler.outputFile', output )
|
133
|
+
|
134
|
+
@configurator.configure( m )
|
135
|
+
|
136
|
+
attach_jar_coordinates( m )
|
137
|
+
|
138
|
+
m.exec( 'dependency:list' )
|
139
|
+
end
|
140
|
+
|
141
|
+
private
|
142
|
+
|
143
|
+
def attach_jar_coordinates( maven )
|
144
|
+
load_path = $LOAD_PATH.dup
|
145
|
+
require 'bundler/setup'
|
146
|
+
done = []
|
147
|
+
index = 0
|
148
|
+
Gem.loaded_specs.each do |name, spec|
|
149
|
+
# TODO get rid of this somehow
|
150
|
+
deps = Maven::Tools::GemspecDependencies.new( spec )
|
151
|
+
deps.java_dependency_artifacts.each do |a|
|
152
|
+
unless done.include? a.key
|
153
|
+
maven.property( "jbundler.jars.#{index}", a.to_s )
|
154
|
+
index += 1
|
155
|
+
done << a.key
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
if index > 0
|
160
|
+
maven.property( "jbundler.jars.size", index )
|
161
|
+
end
|
162
|
+
ensure
|
163
|
+
$LOAD_PATH.replace( load_path )
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|