Publié par

Il y a 10 ans -

Temps de lecture 7 minutes

Où en est JRuby on Rails ?

Le projet JRuby fournit aux développeurs une implémentation native Java du langage Ruby. Le but est d’interfacer sans douleur des classes Java et des scripts Ruby. La star du monde Ruby est bien entendu Ruby On Rails, le fameux framework réputé tellement productif qu’il suffit de penser le projet pour voir les lignes de code apparaître … Depuis quelques temps, on entend parler dans la blogosphère de JRuby on Rails. Nous allons tenter de voir si cette solution est mûre ou non pour les développements d’applications web.

Découverte

Pour les débutants sur JRuby, le Wiki officiel JRuby contient plein de ressources intéressantes. Dans la section JRuby on Rails, nous pouvons voir un alléchant lien intitulé « Deploying a Rails App in Tomcat with JRuby« , que je vous invite à suivre. Il est simple et permet d’appréhender en douceur le fonctionnement des applications Rails, entièrement avec JRuby.

En fin de tutoriel, nous sommes invités à visualiser l’url http://localhost:8080/phonebook/people pour voir le résultat de notre micro-application, et à la place, on obtient ce superbe message :

sorry_but_smtg_went_wrong

Et dans les logs tomcat, on peut voir des insultes ressemblant à ceci :

GRAVE: unable to create shared application instance
org.jruby.rack.RackInitializationException: undefined method 'new' for "Rack::Lock":String
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/gems/gems/actionpack-2.3.3/lib/action_controller/middleware_stack.rb:116:in 'inject'
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/gems/gems/actionpack-2.3.3/lib/action_controller/middleware_stack.rb:116:in 'build'
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/gems/gems/actionpack-2.3.3/lib/action_controller/dispatcher.rb:82:in 'initialize'
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/gems/gems/actionpack-2.3.3/lib/action_controller/dispatcher.rb:52:in 'run_prepare_callbacks'
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/gems/gems/rails-2.3.3/lib/initializer.rb:631:in 'prepare_dispatcher'
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/gems/gems/rails-2.3.3/lib/initializer.rb:185:in 'process'
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/gems/gems/rails-2.3.3/lib/initializer.rb:113:in 'run'
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/config/environment.rb:9
	from /home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/config/environment.rb:26:in 'load'
	from file:/home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/lib/jruby-rack-0.9.4.jar!/jruby/rack/rails.rb:26:in 'load_environment'
	from file:/home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/lib/jruby-rack-0.9.4.jar!/jruby/rack/rails.rb:151:in 'new'
	from <script>:2
	from file:/home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/lib/jruby-rack-0.9.4.jar!/rack/builder.rb:29:in 'instance_eval'
	from file:/home/amaury/JAVA/apache-tomcat-5.5.26/webapps/phonebook/WEB-INF/lib/jruby-rack-0.9.4.jar!/rack/builder.rb:29:in 'initialize'
	from <script>:2
	at org.jruby.rack.DefaultRackApplicationFactory$4.init(DefaultRackApplicationFactory.java:153)
	at org.jruby.rack.DefaultRackApplicationFactory.getApplication(DefaultRackApplicationFactory.java:50)
	at org.jruby.rack.SharedRackApplicationFactory.init(SharedRackApplicationFactory.java:26)
	at org.jruby.rack.RackServletContextListener.contextInitialized(RackServletContextListener.java:39)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3764)
...

Ne vous inquiétez pas, le problème vient d’une petite incompatibilité entre jruby-rack 0.9.4 et rails 2.3.3. Le bug est connu, la solution apparaît dans le JIRA de jruby-rack. Pour plus de clarté, voici les étapes qui pourraient se greffer en fin de tutoriel pour obtenir un résultat probant :

  • récupérer le dernier jar snapshot de jruby-rack version 0.9.5
  • le placer dans le répertoire lib/ de notre projet rails
  • éditer le fichier config/warble.rb et y ajouter les lignes suivantes :
# ligne existante
Warbler::Config.new do |config|

#lignes à insérer
config.java_libs.delete_if {|f| f =~ /jruby-rack/ }
config.java_libs += FileList["lib/jruby-rack*.jar"]

#ligne existante
end

Cela forcera le plugin Warbler à utiliser le jar présent dans le répertoire lib/ plutôt que la version fournie par l’installation JRuby.

  • lancer les commandes suivantes pour reconstruire le war :
warble war:clean
warble
  • Redéployer le nouveau war dans Tomcat.

Rails dans un serveur d’applications Java

Avec ce tutoriel de découverte, nous venons de voir une solution viable pour intégrer du Rails dans un environnement à dominante Java : développer en Rails et déployer dans un serveur d’application Java classique. Ainsi, on peut mettre en place des équipes de développeurs Ruby sans avoir à gérer de nouveaux services côté exploitation. JRuby est désormais considéré comme une plate-forme tout à fait viable pour déployer des applications Rails. Le projet est même cité sur le site officiel de Ruby on Rails comme solution de déploiement idéale pour introduire Ruby en entreprise.

Cette solution permet de diminuer les risques de l’adoption du langage Ruby en les cantonnant aux équipes de développement. De plus, on peut facilement coder des ajouts Java, comme des beans JMX. Monitorer des applications Ruby on Rails avec Hyperic ? C’est possible !

Spring on Rails

La question qui vient ensuite est de savoir si on peut poser une application Rails sur une stack Spring classique pour bénéficier du meilleur des 2 mondes. La réponse, pour l’heure, est : « Bonne question ! ». Certaines initiatives ont vu le jour ces derniers temps pour aller dans ce sens. Cependant il n’y a pour l’instant aucune méthode officiellement soutenue par JRuby.

Du coté de Spring, le support des langages dynamiques inclut déjà JRuby. Cependant l’injection de dépendances force a faire des modification lourdes sur les controlleurs en Ruby. Ajouter des getter/setter dans des scripts Ruby n’a pas bonne presse.

Certains bricoleurs ont réussi à accéder au contexte d’application de Spring depuis les contrôleurs Ruby mais pour l’instant les questions essentielles restent sans réponse, notamment :

  • Comment injecter automatiquement les dépendances dans les contrôleurs Ruby ?
  • Comment réutiliser les classes Ruby du modèle de données ?
  • Comment faire le branchement Rails vers Spring sans entraîner un temps de modification important ?

D’une façon générale, les modifications nécessaires à l’intégration Spring ont tendance à faire perdre les avantages des développements hautement productifs de Rails. Cependant, d’après les mailing lists, améliorer cette intégration semble faire partie des objectifs du projet JRuby pour l’avenir. L’outillage Maven a déjà commencé : dans les sources du projet JRuby on peut voir apparaître un certain plugin maven jruby-rake (Rake est le make de Ruby). Le présent est flou, mais l’avenir semble prometteur.

Conclusions

Certes, l’impression laissée par l’entrée en matière n’est pas forcément des plus flatteuses. Mais il faut replacer ce que nous venons de voir dans son contexte. Le projet JRuby s’est jusqu’à présent concentré sur le support du langage Ruby. Aujourd’hui cet objectif est atteint puisque la version stable recommandée par Ruby (1.8.6) est pleinement supportée. C’est également la version conseillée par le projet Ruby on Rails.

L’intégration de Rails dans les développements web à la sauce Java n’est pas si ancienne que ça et semble être une des priorités du projet pour le futur, notamment l’amélioration de l’intégration Spring qui devrait ouvrir de nombreuses possibilités. Les interactions entre JRuby et le projet Ruby on Rails sont fortes et pourraient être la porte d’entrée du langage Ruby dans les applications web en entreprise.

Pour l’instant JRuby on Rails semble être une solution plutôt floue et peu sûre. Ces réticences proviennent plus du saut vers Ruby qu’implique ce choix technique. JRuby est aujourd’hui une plate-forme fiable et performante pour Ruby on Rails. Grails est né en réponse notamment à RoR, et JRuby se maintient comme un concurrent à ne pas négliger. En effet, Ruby on Rails compte un grand nombre de fanatiques très motivés pour implanter le Ruby en entreprise, et la communauté des développeurs Java en entreprise est… disons conséquente. Un projet capable de les réunir autour d’une table a de quoi motiver les troupes.

Publié par

Publié par Aurélien Maury

Aurélien est passionné par les frameworks web haute productivité comme Grails, JRuby on Rails ou Play! framework. Il est également intéressé par tous les aspects de performance et d'optimisation (mais aussi par la phytothérapie, la PNL, la basse électrique, la philosophie et pleins d'autres sujets). Il est également formateur au sein de Xebia Training .

Commentaire

5 réponses pour " Où en est JRuby on Rails ? "

  1. Publié par , Il y a 10 ans

    Je ne partage pas du tout ce point de vu :
    – j’emploie jruby on rails pour des applications en production.
    – la stack JEE (officiel Sun) tourne très bien avec.
    – je fait tourner des applis 100% ruby dessus sans modification (que de la config) pour des perfs très très bonnes.
    – J’ai intégré des libs ruby dans du JEE sans gros problème.
    – intégration glassfish (v3) très bien réalisée

  2. Publié par , Il y a 10 ans

    Je pense que mes propos ont été mal compris. Si j’ai marqué dans la conclusion que :

    « JRuby est aujourd’hui une plate-forme fiable et performante pour Ruby on Rails. »

    C’est bien parce que je suis d’accord avec vous. :)

    Ce qui est plus difficile et que je met en avant ici, c’est de placer une application Rails par dessus une stack Spring. Certains ont tenté de le faire, mais ce n’est pas dans l’esprit de Rails et ça alourdit le code Ruby inutilement. Ce n’est à mon avis pas la bonne voie.

    En revanche, faire tourner des applications 100% Rails sur JRuby ne pose aucun problème et est même relativement répandu aujourd’hui. J’espère vous avoir apporter un peu de clarté sur mon point de vue.

  3. Publié par , Il y a 10 ans

    Ok parfait

    Alors je complète en disant qu’en revanche ça se fait pas mal en JEE(5 ou plutôt 6)

  4. Publié par , Il y a 10 ans

    Aurélien,

    Je m’excuse pour mes pauvres français écrit…

    Warbler 0.9.14 est nouveau, alors vous ne trouverais plus l’erreur.

    S’il vous plait, contactez-moi si vous avez de plus idées pour intégrer Sprint et JRuby. Si vous pensez d’une example de quel vous voulez faire, je veux l’essayer.

    Salutations,
    /Nick

  5. Publié par , Il y a 10 ans

    Effectivement, la mise à jour de Warbler est tombée pendant le bouclage de cet article. Le problème décrit est maintenant résolu dans la dernière version stable.

    Thank you for this update Nick.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous recrutons

Être un Xebian, c'est faire partie d'un groupe de passionnés ; C'est l'opportunité de travailler et de partager avec des pairs parmi les plus talentueux.