<div dir="ltr"><div class="gmail_quote"><div>JRubyists,</div><div><br></div><div>I have recently come into an issue getting my maven build to produce a war file, and the only big change is an upgrade from 9.2.4 to 9.2.7.</div><div>During a maven build, the build hangs forever in some warbler code.</div><div><br></div><div>The file <i>'gems\warbler-2.0.5\lib\warbler\traits\bundler.rb' </i>has the following method (only top portion shown) that goes into an infinite loop during my maven build. Running via <b><i>rake war</i></b> does not exhibit this issue. Look for the text: <span style="color:rgb(0,0,0);font-family:"Courier New";font-size:7.2pt">#LOOP IS INFINITE</span></div><div><pre style="color:rgb(0,0,0);font-family:"Courier New";font-size:7.2pt"><span style="color:rgb(0,0,128);font-weight:bold">def </span><span style="color:rgb(0,0,255);font-style:italic">add_bundler_gems</span>; <span style="font-style:italic">require </span><span style="color:rgb(0,128,0);font-weight:bold">'bundler'<br></span><span style="color:rgb(0,128,0);font-weight:bold">  </span><span style="color:rgb(128,128,128);font-style:italic"># config.gems.clear allow to add `config.gems` on top of those bundled<br></span><span style="color:rgb(128,128,128);font-style:italic">  </span>config.gem_dependencies = <span style="color:rgb(0,0,128);font-weight:bold">false </span><span style="color:rgb(128,128,128);font-style:italic"># Bundler takes care of these<br></span><span style="color:rgb(128,128,128);font-style:italic">  </span>config.bundler = {} <span style="color:rgb(0,0,128);font-weight:bold">if </span>config.bundler == <span style="color:rgb(0,0,128);font-weight:bold">true<br></span><span style="color:rgb(0,0,128);font-weight:bold"><br></span><span style="color:rgb(0,0,128);font-weight:bold">  </span>bundler_specs.each <span style="color:rgb(0,0,128);font-weight:bold">do </span>|<span style="color:rgb(195,117,34);font-style:italic">spec</span>|<br>    <span style="color:rgb(195,117,34);font-style:italic">spec </span>= to_spec(<span style="color:rgb(195,117,34);font-style:italic">spec</span>)<br>    <span style="color:rgb(128,128,128);font-style:italic"># Bundler HAX -- fixup bad #loaded_from attribute in fake<br></span><span style="color:rgb(128,128,128);font-style:italic">    # bundler gemspec from bundler/source.rb<br></span><span style="color:rgb(128,128,128);font-style:italic">    </span><span style="color:rgb(0,0,128);font-weight:bold">if </span><span style="color:rgb(195,117,34);font-style:italic">spec</span>.name == <span style="color:rgb(0,128,0);font-weight:bold">'bundler'<br></span><span style="color:rgb(0,128,0);font-weight:bold">      </span><span style="color:rgb(0,60,90);font-style:italic">full_gem_path </span>= <span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">Pathname</span>.new(<span style="color:rgb(195,117,34);font-style:italic">spec</span>.full_gem_path)<br>      <span style="color:rgb(0,0,128);font-weight:bold">while </span>! <span style="color:rgb(0,60,90);font-style:italic">full_gem_path</span>.join(<span style="color:rgb(0,128,0);font-weight:bold">'bundler.gemspec'</span>).exist? #LOOP IS INFINITE<br>        <span style="color:rgb(0,60,90);font-style:italic">full_gem_path </span>= <span style="color:rgb(0,60,90);font-style:italic">full_gem_path</span>.dirname<br>        <span style="color:rgb(128,128,128);font-style:italic"># </span><span style="color:rgb(128,128,128);font-weight:bold;font-style:italic">if </span><span style="color:rgb(128,128,128);font-style:italic">at top of the path, meaning we cannot find bundler.gemspec, abort.<br></span><span style="color:rgb(128,128,128);font-style:italic">        </span><span style="color:rgb(0,0,128);font-weight:bold">if </span><span style="color:rgb(0,60,90);font-style:italic">full_gem_path</span>.to_s =~ <span style="color:rgb(128,0,0);font-weight:bold">/</span>^[\.<span style="color:rgb(0,0,128);font-weight:bold">\/</span>]$<span style="color:rgb(128,0,0);font-weight:bold">/<br></span><span style="color:rgb(128,0,0);font-weight:bold">          </span>warn(<span style="color:rgb(0,128,0);font-weight:bold">"Unable to detect bundler spec under '</span><span style="background-color:rgb(235,235,235)">#{</span><span style="color:rgb(195,117,34);font-style:italic">spec</span>.full_gem_path<span style="background-color:rgb(235,235,235)">}</span><span style="color:rgb(0,128,0);font-weight:bold">'' and its sub-dirs"</span>)<br>          exit<br>        <span style="color:rgb(0,0,128);font-weight:bold">end<br></span><span style="color:rgb(0,0,128);font-weight:bold">      end</span></pre><pre style="color:rgb(0,0,0);font-family:"Courier New";font-size:7.2pt">#rest of method not shown</pre><pre style=""><font color="#000000" face="Courier New" size="1">

</font><font face="Arial, Helvetica, sans-serif"><span style="white-space:normal">The reason the loop is infinite is the bundler gemspec is being looked for here:</span></font></pre><pre style="">uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/gems/bundler-1.16.6<font face="Arial, Helvetica, sans-serif"><span style="white-space:normal"><br></span></font></pre><pre style=""><pre><span style="font-family:Arial,Helvetica,sans-serif;white-space:normal">An inspection of JRuby's complete jar file shows it is here:</span>
</pre><pre>META-INF/jruby.home/lib/ruby/gems/shared/gems/bundler-1.16.6/<span style="font-family:Arial,Helvetica,sans-serif;white-space:normal"><br></span></pre></pre></div><div>To fix this issue locally, I have put the following monkey patch in my rake file. I use hashes to signify the lines I changed from the original</div><div> <span style="font-family:"Courier New";font-size:7.2pt;color:rgb(0,0,128);font-weight:bold">module </span><span style="font-family:"Courier New";font-size:7.2pt;color:rgb(102,14,122);font-weight:bold;font-style:italic">Warbler</span></div><pre style="color:rgb(0,0,0);font-family:"Courier New";font-size:7.2pt"><span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">  </span><span style="color:rgb(0,0,128);font-weight:bold">module </span><span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">Traits<br></span><span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">    </span><span style="color:rgb(0,0,128);font-weight:bold">class </span><span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">Bundler<br></span><span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">      </span><span style="color:rgb(0,0,128);font-weight:bold">def </span><span style="color:rgb(0,0,255);font-style:italic">bundler_specs<br></span><span style="color:rgb(0,0,255);font-style:italic">        </span><span style="color:rgb(0,60,90);font-style:italic">bundle_without </span>= config.bundle_without.map { |<span style="color:rgb(195,117,34);font-style:italic">s</span>| <span style="color:rgb(195,117,34);font-style:italic">s</span>.to_sym }<br>        <span style="color:rgb(0,60,90);font-style:italic">definition </span>= ::<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">Bundler</span>.definition<br>        <span style="color:rgb(0,60,90);font-style:italic">all </span>= <span style="color:rgb(0,60,90);font-style:italic">definition</span>.specs.to_a<br>        <span style="color:rgb(0,60,90);font-style:italic">requested </span>= <span style="color:rgb(0,60,90);font-style:italic">definition</span>.specs_for(<span style="color:rgb(0,60,90);font-style:italic">definition</span>.groups - <span style="color:rgb(0,60,90);font-style:italic">bundle_without</span>).to_a<br>        <span style="color:rgb(0,60,90);font-style:italic">excluded_git_specs </span>= (<span style="color:rgb(0,60,90);font-style:italic">all </span>- <span style="color:rgb(0,60,90);font-style:italic">requested</span>).select { |<span style="color:rgb(195,117,34);font-style:italic">spec</span>| ::<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">Bundler</span>::<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">Source</span>::<span style="color:rgb(102,14,122);font-weight:bold;font-style:italic">Git </span>=== <span style="color:rgb(195,117,34);font-style:italic">spec</span>.source }<br>        <span style="color:rgb(0,60,90);font-style:italic">excluded_git_specs</span>.each { |<span style="color:rgb(195,117,34);font-style:italic">spec</span>| <span style="color:rgb(195,117,34);font-style:italic">spec</span>.groups << <span style="color:rgb(102,14,122);font-weight:bold">:warbler_excluded </span>}<br>        <span style="color:rgb(0,60,90);font-style:italic">specs </span>= <span style="color:rgb(0,60,90);font-style:italic">requested </span>+ <span style="color:rgb(0,60,90);font-style:italic">excluded_git_specs<br></span><span style="color:rgb(0,60,90);font-style:italic">        bundler </span>= <span style="color:rgb(0,60,90);font-style:italic">specs</span>.select <span style="color:rgb(0,0,128);font-weight:bold">do </span>|<span style="color:rgb(195,117,34);font-style:italic">e</span>|  <span style="color:rgb(195,117,34);font-style:italic">e</span>.name.eql? <span style="color:rgb(0,128,0);font-weight:bold">'bundler' </span><span style="color:rgb(0,0,128);font-weight:bold">end</span>.first <span style="color:rgb(128,128,128);font-style:italic">########################################<br></span><span style="color:rgb(128,128,128);font-style:italic">        </span>p <span style="color:rgb(0,128,0);font-weight:bold">"Full gem path is </span><span style="background-color:rgb(235,235,235)">#{</span><span style="color:rgb(0,60,90);font-style:italic">bundler</span>.full_gem_path<span style="background-color:rgb(235,235,235)">}</span><span style="color:rgb(0,128,0);font-weight:bold">" </span><span style="color:rgb(128,128,128);font-style:italic">#######################################<br></span><span style="color:rgb(128,128,128);font-style:italic">        </span><span style="color:rgb(0,0,128);font-weight:bold">if </span>(<span style="color:rgb(0,60,90);font-style:italic">bundler</span>.full_gem_path =~ <span style="color:rgb(128,0,0);font-weight:bold">/</span><span style="color:rgb(0,0,128);font-weight:bold">\/</span>META-INF<span style="color:rgb(0,0,128);font-weight:bold">\/</span>jruby.home<span style="color:rgb(0,0,128);font-weight:bold">\/</span>lib<span style="color:rgb(0,0,128);font-weight:bold">\/</span>ruby<span style="color:rgb(0,0,128);font-weight:bold">\/</span>stdlib<span style="color:rgb(128,0,0);font-weight:bold">/</span>)<br>          <span style="color:rgb(128,128,128);font-style:italic">#in jruby's complete jar it isn't in the stdlib it is here:<br></span><span style="color:rgb(128,128,128);font-style:italic">          # META-INF/jruby.home/lib\ruby/gems/shared/gems/bundler-1.16.6/<br></span><span style="color:rgb(128,128,128);font-style:italic">          </span>p <span style="color:rgb(0,128,0);font-weight:bold">"Changing the full gem path"</span><span style="color:rgb(128,128,128);font-style:italic">########################################<br></span><span style="color:rgb(128,128,128);font-style:italic">          </span><span style="color:rgb(0,60,90);font-style:italic">bundler</span>.full_gem_path= <span style="color:rgb(0,128,0);font-weight:bold">'uri:classloader:/META-INF/jruby.home/lib/ruby/gems/shared/gems/bundler-1.16.6'</span><span style="color:rgb(128,128,128);font-style:italic">#########################################<br></span><span style="color:rgb(128,128,128);font-style:italic">          </span>p <span style="color:rgb(0,128,0);font-weight:bold">"Full gem path is now </span><span style="background-color:rgb(235,235,235)">#{</span><span style="color:rgb(0,60,90);font-style:italic">bundler</span>.full_gem_path<span style="background-color:rgb(235,235,235)">}</span><span style="color:rgb(0,128,0);font-weight:bold">"</span><span style="color:rgb(128,128,128);font-style:italic">######################################################<br></span><span style="color:rgb(128,128,128);font-style:italic">        </span><span style="color:rgb(0,0,128);font-weight:bold">end<br></span><span style="color:rgb(0,0,128);font-weight:bold">        </span><span style="color:rgb(0,60,90);font-style:italic">specs<br></span><span style="color:rgb(0,60,90);font-style:italic">      </span><span style="color:rgb(0,0,128);font-weight:bold">end<br></span><span style="color:rgb(0,0,128);font-weight:bold">    end<br></span><span style="color:rgb(0,0,128);font-weight:bold">  end<br></span><span style="color:rgb(0,0,128);font-weight:bold">end</span></pre><div>Output:</div><div>mvn clean package:</div>[INFO] "Full gem path is uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/gems/bundler-1.16.6"<br>[INFO] "Changing the full gem path"<br>[INFO] "Full gem path is now uri:classloader:/META-INF/jruby.home/lib/ruby/gems/shared/gems/bundler-1.16.6"<br><br>rake war:<br>"Full gem path is C:/languages/ruby/jruby-9.2.7.0/lib/ruby/gems/shared/gems/bundler-1.16.6"</div><div class="gmail_quote"><br></div><div class="gmail_quote">Thanks All,</div><div class="gmail_quote"><br></div><div class="gmail_quote">Cris</div></div>