2010-01-07 5 views
4

Je n'arrive pas à trouver la syntaxe actuelle pour utiliser les classes java dans Jruby. Cette link text listes d'articles:Syntaxe correcte de jruby pour requérir java et inclure des classes java

include Java 
include 'java' 
require 'java' 

Comme options valides, même si elle dit la dernière option est pré 1.0 et ne fonctionne pas.
Le Jruby Wiki dit cependant à utiliser require 'java'

Et pour y compris les classes que j'ai vu

MyClass = Java::some.package.MyClass 
include_class Java::some.package.MyClass 
include_class 'some.package.MyClass' 
java_import Java::some.package.MyClass 

Y at-il une méthode préférée?

Actuellement, je reçois un message "redéfinir X" car j'ai quelques classes java nommées comme ma classe ruby. Quelle est la meilleure méthode pour conserver l'espace de nom java alors je ne les obtiens pas, et y a-t-il des problèmes (mis à part la classe Java qui précède la classe ruby) avec cette redéfinition si je n'utilise jamais les deux classes ruby ​​/ java le même fichier?

Répondre

1

Je préfère

require 'java' 
java_import java.lang.System 

Je pense que le choix de require 'java' n'est pas que l'importation et est juste préférence personnelle. D'autre part, JRubyWiki dit java_import est préféré, en raison de this bug report.

Pour le conflit de noms entre classes Java et JRuby. Pour des raisons de lisibilité du code ou de maintenance, je suggère d'éviter d'utiliser le même nom pour 2 classes différentes, sauf si vous voulez le rouvrir.

Mise à jour: Êtes-vous sûr que l'erreur 'Redefine X ...' est causée par le même nom pour votre classe Java et JRuby? Je reçois généralement cette erreur parce que je java_import la même classe Java plusieurs fois (parfois dans des endroits différents, parfois je charge le même fichier plusieurs fois).

+0

hmm ... je n'ai jamais pensé à ça, je vais y jeter un coup d'œil, il semble – brad

+0

que ça semble être en conflit. Quand j'instancie un objet qui inclut un tas de classes Java (une seule fois), je reçois ce message. J'ai une classe "Fournisseur" ruby ​​et j'inclue aussi une classe java "new.my_app.Supplier" avec include_class – brad

1

Personnellement, j'utilise toujours require 'java'

Si vous éprouvez des affrontements d'espaces de noms, je vous suggère de ne pas inclure ou d'importer, mais en spécifiant les noms de classe entièrement qualifiés, par exemple

my_instance = Java::JavaUtil::Date.new

... où Java:: est le module de haut niveau pour toutes les classes java, JavaUtil:: est le nom de package complet pour la classe que je veux, en bon cas et tassent et Date est le nom de la classe réelle .