http://jruby-gradle.org/ JRuby/Gradle News 2015-09-10T15:24:41-07:00 http://jruby-gradle.org/news/2015/09/01/gradle-spotlight-continuous-build/ Gradle Feature Spotlight: Continuous Build 2015-09-10T15:24:41-07:00 2015-09-01T00:00:00+00:00 Earlier this year the Gradle project released version 2.5 with a heap of new features and improvements. One of the most touted of those features is an incubating feature (read: beta) named Continuous Build which automatically re-executes tasks after a file change. Rubyists may recognize that this functionality is similar to what the guard gem provides. What makes "continuous build" special is that it makes use of the existing build data present in your Gradle build. Using a task’s inputs the continuous build feature can automatically "watch" the appropriate files to re-execute your task, or your tasks dependent tasks, automatically as they change! For users JRuby/Gradle this means that upgrading to Gradle 2.5 or... <div class="paragraph"> <p>Earlier this year the <a href="http://gradle.org">Gradle</a> project released version <a href="https://docs.gradle.org/2.5/release-notes">2.5</a> with a heap of new features and improvements. One of the most touted of those features is an incubating feature (read: beta) named <a href="https://docs.gradle.org/current/userguide/continuous_build.html">Continuous Build</a> which automatically re-executes tasks after a file change. Rubyists may recognize that this functionality is similar to what <a href="http://guardgem.org/">the guard gem</a> provides.</p> </div> <div class="paragraph"> <p>What makes "continuous build" special is that it makes use of the <em>existing</em> build data present in your Gradle build. Using a <a href="https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:task_inputs_outputs">task’s inputs</a> the continuous build feature can automatically "watch" the appropriate files to re-execute your task, or your tasks dependent tasks, automatically as they change!</p> </div> <div class="paragraph"> <p>For users JRuby/Gradle this means that upgrading to Gradle 2.5 or later, and ensuring your <code>build.gradle</code> declares task inputs and continuous build will "just work!" Consider the following example for running <a href="http://rspec.info">RSpec</a> tests:</p> </div> <div class="listingblock"> <div class="title">build.gradle</div> <div class="content"> <pre class="CodeRay highlight nowrap"><code data-lang="gradle">buildscript { repositories { jcenter() } dependencies { classpath "com.github.jruby-gradle:jruby-gradle-plugin:1.0.3" <i class="conum" data-value="1"></i><b>(1)</b> } } apply plugin: 'com.github.jruby-gradle.base' <i class="conum" data-value="2"></i><b>(2)</b> dependencies { jrubyExec 'rubygems:rspec:3.3.0' <i class="conum" data-value="3"></i><b>(3)</b> } import com.github.jrubygradle.JRubyExec task spec(type: JRubyExec) { group 'JRuby' description 'Execute the RSpecs in JRuby' script 'rspec' inputs.source fileTree('spec').include('**/*.rb'), fileTree('lib').include('**/*.rb') <i class="conum" data-value="4"></i><b>(4)</b> }</code></pre> </div> </div> <div class="colist arabic"> <table> <tr> <td><i class="conum" data-value="1"></i><b>1</b></td> <td>Specify our dependency on the JRuby/Gradle <a href="http://jruby-gradle.org/base/">base plugin</a></td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>Apply the plugin to our current project</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>Define our RSpec gem dependency</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>Set our task inputs to the <code>.rb</code> files in <code>spec/</code> and in <code>lib/</code></td> </tr> </table> </div> <div class="paragraph"> <p>Using the <code>build.gradle</code> above, I can auto-execute my tests whenever a Ruby file inside of the <code>spec/</code> (my tests) or <code>lib/</code> (my code under test) with the following command:</p> </div> <div class="literalblock"> <div class="content"> <pre class="nowrap">% ./gradlew -t spec</pre> </div> </div> <div class="paragraph"> <p>Here’s some example output from my example project:</p> </div> <div class="listingblock"> <div class="content"> <pre class="nowrap">example-project git:(master) % ./gradlew -t spec Continuous build is an incubating feature. :spec Randomized with seed 37453 .............................................. Finished in 0.52 seconds (files took 3.82 seconds to load) 46 examples, 0 failures Randomized with seed 37453 BUILD SUCCESSFUL Total time: 8.77 secs Waiting for changes to input files of tasks... (ctrl-d to exit)</pre> </div> </div> <div class="paragraph"> <p>At this point the Gradle process is patiently waiting until I write my most recent changes, then it kicks off the same task:</p> </div> <div class="listingblock"> <div class="content"> <pre class="nowrap">Change detected, executing build... :spec Randomized with seed 64935 .............................................. Finished in 0.502 seconds (files took 3.5 seconds to load) 46 examples, 0 failures Randomized with seed 64935 BUILD SUCCESSFUL Total time: 7.341 secs Waiting for changes to input files of tasks... (ctrl-d to exit)</pre> </div> </div> <div class="paragraph"> <p>Pretty neat huh?</p> </div> <div class="paragraph"> <p>What makes this functionality exceptionally powerful for JRuby/Gradle users is that it respects the task inputs but also the task dependency graph. If my <code>spec</code> task declares a dependency on the <code>compileJava</code> task, whenever my Java source code changes, that will trigger a re-execution of <code>compileJava</code> and in turn <code>spec</code>!</p> </div> <div class="paragraph"> <p>So when you’re authoring tasks, even if you’re not this feature right now, be sure to declare task inputs. That build metadata can unlock lots of interesting functionality as Gradle continues to improve!</p> </div> <div class="paragraph"> <p>Continuous build is one of many examples of powerful Gradle functionality which can easily used in JRuby/Gradle, I hope you find it useful!</p> </div> http://jruby-gradle.org/news/2015/08/16/introduction-at-jrubyconfeu/ JRuby/Gradle at JRubyConf EU 2015 2015-09-10T15:24:41-07:00 2015-08-16T00:00:00+00:00 A couple weeks ago, Schalk, Christian and I were fortunate enough to participate in the wonderful JRubyConf EU 2015 in Potsdam Germany. In the days that preceeded the conference we pulled together and finished up what would become the 1.0 release of the core plugins. Just in time for my presentation to introduce the JRuby/Gradle toolchain to the audience. Below is a video recoded by Confreaks.tv of the talk titled JRuby/Gradle: Bringing Java Powertools to Ruby: The other sessions are also worth checking out as there was a lot of great, in-depth, technical content presented at the single-track one-day conference. On behalf of the JRuby/Gradle core team, I’d like to thank the conference organizers (especially Tobi)... <div class="paragraph"> <p>A couple weeks ago, <a href="https://github.com/ysb33r">Schalk</a>, <a href="https://github.com/mkristian">Christian</a> and <a href="https://github.com/rtyler">I</a> were fortunate enough to participate in the wonderful <a href="http://2015.jrubyconf.eu">JRubyConf EU 2015</a> in Potsdam Germany. In the days that preceeded the conference we pulled together and finished up what would become the <a href="http://jruby-gradle.org/news/2015/08/04/jrubygradle-one-point-oh/">1.0 release</a> of the core plugins. Just in time for my presentation to introduce the JRuby/Gradle toolchain to the audience.</p> </div> <div class="paragraph"> <p>Below is a video recoded by <a href="http://confreaks.tv">Confreaks.tv</a> of the talk titled <strong>JRuby/Gradle: Bringing Java Powertools to Ruby</strong>:</p> </div> <center><iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/kZt6Ga20lD0" width="560"></iframe></center> <div class="paragraph"> <p>The <a href="http://confreaks.tv/events/jrubyconf2015">other sessions</a> are also worth checking out as there was a lot of great, in-depth, technical content presented at the single-track one-day conference.</p> </div> <div class="paragraph"> <p>On behalf of the <a href="https://www.flickr.com/photos/agentdero/20372579815/">JRuby/Gradle core team</a>, I’d like to thank the conference organizers (especially <a href="https://github.com/pragtob">Tobi</a>) for hosting such a wonderful event and allowing us the opportunity to participate. Hopefully we’ll be back next year with more to talk about!</p> </div> http://jruby-gradle.org/news/2015/08/04/jrubygradle-one-point-oh/ JRuby/Gradle 1.0 Announced 2015-09-10T15:24:41-07:00 2015-08-04T00:00:00+00:00 Less than one year after the JRuby/Gradle project was founded, we are pleased to announce the release of 1.0 for the core plugins, which includes the base plugin, the jar plugin and an alpha version of the war plugin. This release marks the stability of the core task and configuration APIs for the lifetime of the 1.x branch of development. Notable Features This release includes a number of notable features which can help developers build high quality Ruby projects, based on JRuby. Defaulted to the major milestone release: JRuby 9.0.0.0 Native Java dependency resolution via Gradle’s built-in support of Maven repositories and with Gem dependency resolution via a rubygems.org proxy. Execution of local... <div id="preamble"> <div class="sectionbody"> <div class="paragraph"> <p>Less than one year after the <a href="http://github.com/jruby-gradle">JRuby/Gradle</a> project was founded, we are pleased to announce the release of <strong>1.0</strong> for the core plugins, which includes <a href="http://jruby-gradle.org/base/">the base plugin</a>, <a href="http://jruby-gradle.org/jar/">the jar plugin</a> and an alpha version of the <a href="http://jruby-gradle.org/war/">war plugin</a>. This release marks the stability of the core task and configuration APIs for the lifetime of the <code>1.x</code> branch of development.</p> </div> </div> </div> <div class="sect1"> <h2 id="notable-features"><a class="anchor" href="#notable-features"></a>Notable Features</h2> <div class="sectionbody"> <div class="paragraph"> <p>This release includes a number of notable features which can help developers build high quality Ruby projects, based on <a href="http://jruby.org">JRuby</a>.</p> </div> <div class="ulist"> <ul> <li> <p>Defaulted to the major milestone release: <a href="jruby.org/2015/07/22/jruby-9-0-0-0.html">JRuby 9.0.0.0</a></p> </li> <li> <p>Native Java dependency resolution via Gradle’s built-in support of Maven repositories and with Gem dependency resolution via a <a href="http://rubygems.org">rubygems.org</a> <a href="http://rubygems.lasagna.io/proxy/maven/releases">proxy</a>.</p> </li> <li> <p>Execution of local Ruby script via the <a href="http://jruby-gradle.org/base/#jrubyexec">JRubyExec task</a></p> </li> <li> <p>Execution of scripts provided by a gem dependency, e.g. <code>rspec</code> via <a href="http://jruby-gradle.org/base/#jrubyexec">JRubyExec task</a></p> </li> <li> <p>Support for distinct <a href="https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.Configuration.html">configurations</a> to isolate dependencies, even JRuby versions, between <a href="http://jruby-gradle.org/base/#jrubyexec">JRubyExec tasks</a>.</p> </li> <li> <p>Similar support for different configurations between <a href="http://jruby-gradle.org/jar/#jrubyjar">JRubyJar tasks</a></p> </li> </ul> </div> </div> </div> <div class="sect1"> <h2 id="project-history"><a class="anchor" href="#project-history"></a>Project History</h2> <div class="sectionbody"> <div class="paragraph"> <p>The JRuby/Gradle project was originally started to address the challenges faced when attempting to build complex Ruby applications based on <a href="http://jruby.org">JRuby</a>. With such applications it is desirable to leverage the vast libraries available to JVM-based languages, as well as many of the user-friendly gems built by Ruby developers</p> </div> <div class="paragraph"> <p>After trying to make multiple tools, which weren’t designed to support non-Java projects, work with Ruby <a href="https://github.com/rtyler">R. Tyler Croy</a> started building a prototype with Gradle to package up a JRuby application as a jar. Shortly after publishing the prototype, <a href="https://github.com/ysb33r">Schalke W. Cronje</a> discovered the fledgling project and with his Gradle development experience helped bring it from a weekend hack project to a well-tested, well-structured set of Gradle plugins. Eventually <a href="https://github.com/mkristian">Christian Meier</a>, whose link:https://github.com/torquebox/rubygems-servlets] code helped make the project originally possible, joined the team to help improve support in JRuby itself for the different embedded operating modes that the JRuby/Gradle toolchain makes use of.</p> </div> </div> </div>