web-dev-qa-db-fra.com

Comment compiler de manière croisée Java Code source en JavaScript?

Étant donné un ensemble de Java, comment puis-je les compiler en un ou plusieurs fichiers JavaScript pouvant être utilisés avec du JavaScript fabriqué à la main?

GWT est une option, mais chaque exemple que j'ai vu jusqu'à présent vise à créer des sites Web de fantaisie. Le cas d'utilisation simple de simplement convertir Java en Javascript qui peut être utilisé avec du JavaScript artisanal n'a pas été bien documenté .

J'ai commencé un fil sur la liste de diffusion de GWT sur ce sujet, mais les opinions semblent partagées sur la faisabilité de cela.

Une personne a donné un conseil très utile, qui consistait à vérifier GWT-Exporter . Le problème est que ni le code source ni la documentation ne sont facilement disponibles, bien qu'il y ait this et this .

edit: le code source de GWT-Exporter est ici

J'ai également vu Java2Script . Mais encore une fois, je n'ai pas pu trouver d'exemples sur la façon de résoudre mon cas d'utilisation simple.

Quelle est la meilleure approche de ce problème? Y a-t-il quelque chose de mieux qui me manque?

50
Rich Apodaca

Lorsque vous utilisez GWT, vous convertissez essentiellement la partie d'interface utilisateur en Javascript (et cela suppose que vous utilisez les widgets d'interface utilisateur fournis lorsque vous écrivez votre Java). Seules certaines des bibliothèques Java sont accessibles dans Javascript. Généralement, dans une application GWT, tout ce qui fait un usage intensif des bibliothèques Java s'exécute côté serveur et se connecte au Javascript en tant que AJAX (que GWT gère pour vous). GWT ne convertit donc pas nécessairement votre application complète en Javascript (bien que cela soit possible si vous êtes prêt à limiter votre utilisation des bibliothèques Java et de certaines fonctionnalités).

En tout cas, si cette approche (appel à Java fonctionnant sur un serveur à partir de Javascript) vous plaît, une option intéressante est DWR , qui permet essentiellement à votre Javascript d'appeler directement des méthodes dans les classes Java s'exécutant sur le serveur (sans que vous ayez à créer un service Web ou autre interface). Pas ce que tu as demandé, je sais.

Plus pertinent, il semble qu'il y ait du code source pour un exemple d'application démontrant l'utilisation de gwt-exporter .

10
Jacob Mattison

Je ne sais pas si cela correspond à votre cas d'utilisation, mais si vous acceptez de supprimer Java API et utilisez les API JavaScript de Java, vous pouvez utiliser JSweet , a = Java vers un transpilateur JavaScript construit sur le dessus de TypeScript. Il vous donne accès à des centaines d'API JavaScript bien typées (DOM, jQuery, underscore, angularjs, etc.). Il génère du code JavaScript et vous pouvez mélangez-le avec du code JavaScript et TypeScript hérité.

Remarque: JSweet ne fonctionnera pas pour l'héritage Java et héritage Java Java , mais votre cas d'utilisation ne mentionnait pas la réutilisation de l'ancien code.

[MISE À JOUR] Depuis la version 1.1, JSweet prend désormais également en charge certaines API Java telles que Collections (Java.util). Il est donc possible de réutiliser l'héritage Java dans une certaine mesure. Il est également assez simple d'ajouter votre propre support pour les API Java.

9
Renaud Pawlak

Alors que la question concerne la compilation de Java sources en JavaScript, je pense qu'il vaut la peine de mentionner qu'il y a TeaVM qui compile Java bytecode en JavaScript) Je ne l'ai jamais essayé, mais cela semble très prometteur.

8
Katona

Étant donné un ensemble de Java, comment puis-je les compiler en un ou plusieurs fichiers JavaScript pouvant être utilisés avec du JavaScript fabriqué à la main?

Bien qu'il existe de nombreuses solutions pour convertir Java en Javascript , vous êtes intéressé par une solution dans laquelle le nouveau code javascript peut interagir avec le code résultant. Ceci est une mise à jour (comme 2018) des autres réponses.

Il existe différents types d'outils. Par exemple, vous pouvez trouver des outils qui vous permettent (1) de convertir Java en javascript; (2) de convertir le bytecode en javascript, asm.js ou webassembly; (3) d'exécuter Java applications directement dans le navigateur et (4) créer des solutions qui combinent Java et javascript. Vous devez sélectionner la solution à utiliser en fonction de vos besoins).


Conversion de Java code source en Javascript

Certaines solutions prennent Java code source et produisent une version équivalente à javascript. Habituellement, ces solutions transforment le Java en Javascript, mais ne prennent pas en charge tous les comportements et bibliothèques du runtime Java. Le code résultant peut ne pas prendre en charge certaines bibliothèques standard Java. En règle générale, elles sont utilisées pour créer une application HTML à l'aide de Java mais pas pour la migration du code. Avantages: La solution résultante peut inclure de très petits fichiers. Vous pouvez l'utiliser pour réutiliser votre propre logique métier sans prendre en compte les bibliothèques spécifiques à l'interface graphique ou à la plate-forme. Inconvénients: il est possible que vous ne puissiez pas utiliser certaines fonctionnalités de Java Il nécessite un accès au code source.

  • JSweet convertit Java en javascript. Il comprend des liaisons API pour plus de 1000 bibliothèques javascript. Vous pouvez écrire Java code qui utilise ces bibliothèques.
  • j2s , est le compilateur utilisé par la plate-forme Eclipse RAP pour traduire Java code en javascript. Il est utilisé ici pour convertir les widgets SWT (GUI) en javascript et HTML. Il ne prend pas en charge toutes les bibliothèques Java standard

Conversion du bytecode Javascript en javascript

Ces solutions prennent le code Java Java (fichiers .class) compilé et produisent un code équivalent en javascript, asm.js ou webassembly. Considérant que le code Java Java peut dépendre de Java bibliothèques standard (ie, le JRE), ces solutions incluent généralement des bibliothèques portées et précompilées. Avantages: vous n'avez pas besoin de changer quoi que ce soit dans votre code. Vous n'avez pas non plus besoin du code source. Inconvénients: la solution résultante peut nécessiter beaucoup de chargement de fichiers.

  • Bck2Brwsr , un Java VM qui peut compiler à l'avance le Java bytecode en javascript. Il produit un fichier javascript pour chaque fichier .jar.
    • Vous pouvez utiliser l'objet vm javascript pour charger une classe en javascript et exécuter des méthodes statiques (à l'aide de vm.loadClass(.., function(class){..}}). Il y a un exemple dans la documentation pour le plugin gradle et la tâche maven .
  • TeaVM , est un autre Java VM qui peut convertir à l'avance le code en javascript). contrairement à Bck2Brwsr, il prend en charge les threads, produit un fichier unique pour toutes vos classes et offre une meilleure prise en charge du débogage.
  • DukeScript , transpile Java code et bytecode en javascript à l'aide de Bck2Brwsr ou TeaVM.
  • Dragome , transpile Java bytecode to javascript.
  • CheerpJ (un produit commercial) peut s'exécuter complètement Java applications utilisant Swing et AWT. Il fournit un très environnement javascript complet prenant en charge le système d'exploitation, les threads et les fonctionnalités réseau.
    • Il fournit une API d'exécution complète . Vous pouvez exécuter une méthode main en utilisant cheerpjRunMain( <class>, <jar> ). Vous pouvez créer des objets à l'aide de cjNew( <class>, <params>...) et appeler des méthodes statiques à l'aide de cjCall( <class>,<method>,<params>...). Il existe de nombreuses autres méthodes que vous pourriez envisager.

En cours d'exécution Java en Javascript

DoppioJVM est une JVM complète écrite en TypeScript. Avantages: Il émule de nombreux éléments du système d'exploitation, y compris les systèmes de fichiers, les consoles TTY et les threads. Inconvénients: Étant donné qu'il s'agit d'un interpètre, il peut en résulter plus lentement que d'autres solutions. (Je ne l'ai pas testé)

  • DoppioJVM est une machine virtuelle Java écrite en TypeScript
    • La documentation inclut des extraits de code pour charger et exécuter les classes. Vous pouvez exécuter une méthode statique à l'aide de jvm.runClass( <class>, [ <args>...], function(response){..}). Vous pouvez exécuter un fichier Jar et effectuer de nombreuses autres tâches.

Créez des applications combinant Java et Javascript

Certaines autres solutions fournissent, non seulement les outils pour compiler le code, mais aussi des cadres et des solutions pour créer Java et solutions javascript. Par exemple, CheerpJ a des versions complètes des bibliothèques Swing et AWT pour les graphiques mais elles peuvent être très lentes. Vous pouvez remplacer l'interface utilisateur en utilisant de nouvelles versions HTML qui s'exécutent plus rapidement sur le navigateur. Avantages: Vous pouvez réutiliser le code existant sans modifications, principalement certaines bibliothèques et la logique métier. Vous pouvez supprimer de vos solutions des bibliothèques qui ne fonctionnent pas efficacement dans le navigateur. Inconvénients: Si vous veux continuer à maintenir votre Java version de bureau, vous devez gérer un code différent pour le navigateur.


Recommandation

  • Si vous voulez réutiliser quelques classes créées par vos propres moyens, vous pouvez essayer JSweet . Vous pouvez créer des modules javascript (bibliothèques) que vous pouvez utiliser facilement avec javascript et TypeScript.
  • Si vous voulez réutiliser une base de code moyenne à grande qui repose sur plusieurs bibliothèques Java, vous pouvez essayer CheerpJ , Dukescript ou Dragome . Vous pouvez réutiliser de grandes parties de votre code et créer (progressivement) l'interface utilisateur et les communications client-serveur à l'aide de technologies plus navigatrices. amical.
  • Si vous voulez exécuter des applications complètes Java sans changement, vous pouvez essayer CheerpJ . Il peut exécuter les interfaces utilisateur Swing et AWT. Il fournit également un Coureur d'applet .
5
Jaime

Voici deux autres options, des choses à examiner et une troisième option ne se convertissant pas, juste vivre ensemble.

  1. Java2Javascript

Je voulais essayer ceci - Regarde de plus près ce qui a été demandé. Citant la page Web:

un Eclipse Java au plug-in du compilateur JavaScript et une implémentation de la version JavaScript d'Eclipse Standard Widget Toolkit (SWT) avec d'autres utilitaires courants, tels que Java.lang. * et Java.util. *. You peut convertir votre plate-forme client enrichi (RCP) basée sur SWT en application Internet riche (RIA) par Pacemaker Java2Script.

Une expérience limitée Java dans l'expérience Javascript - Vous devrez porter vos dépendances nécessaires ou trouver des alternatives via des outils comme jQuery, etc.

  1. DukeScript

Comme je vois DukeScript, il compile du Javascript frontal et appelle Java derrière, à partir du Javascript du navigateur. Cela semble plus ou moins une approche hybride donc vous pouvez utiliser le Java richesse de bibliothèques à partir de Javascript. Je tomberai sous le coup d'une politique de sécurité du navigateur pour Java.

Un Javascript plus complet sur Java expérience en tirant parti de Java-runtime. Si je voulais cela en dehors de l'environnement du navigateur, j'utiliserais Javascript sur Java.

  1. Nashhorn

Considérez ceci comme un exemple d'utilisation des ressources Java comme fondement de Javascript: Nashorn et JavaFX, comme exemple pour un Javascript riche client opéré. Quoi qu'il en soit, avec un moteur Javascript à l'intérieur Java vous n'avez pas tellement besoin de traduire entre une machine virtuelle Javascript en code objet en une machine virtuelle Java).

3
will

Pas entièrement sur le sujet, mais Kotlin est un langage 100% compatible Java qui peut être compilé en JavaScript.

IntelliJ IDEA peut convertir automatiquement Java en Kotlin et le compiler pour l'exécuter sur Node ou le navigateur).

3
Fabian Zeindl

Étant donné un ensemble de Java, comment puis-je les compiler en un ou plusieurs fichiers JavaScript pouvant être utilisés avec du JavaScript fabriqué à la main?

Il n'y a pas de corrélation directe entre les fonctionnalités du langage Java API et Java Java) et celles de JavaScript. Ainsi, toute tentative de création d'un "convertisseur" va être incomplet. Comme exemple fondamental, les classes Java n'ont pas d'idiome JavaScript correspondant direct.

Il est impossible de savoir si un outil de conversion incomplet fonctionnera pour votre cas d'utilisation sans le code source.


Cela dit, ma suggestion pour résoudre votre problème serait d'essayer d'abord d'utiliser GWT : configurez un projet de démonstration, déposez la source de votre bibliothèque et appelez du côté JavaScript et voyez ce que GWT génère dans son fichier .js. Certains des autres outils proposés par d'autres affiches ici valent également la peine d'être vérifiés.

Si cela est fructueux et vous fait avancer, tant mieux.

À partir de là, vous devrez/voudrez faire le reste de la conversion à la main. Après tout, en supposant que vous vouliez que le code fonctionne correctement, une révision manuelle serait certainement de mise. Certains tests unitaires convertis en même temps seraient également idéaux.

Vous ne précisez pas la taille de la source de votre projet, mais si elle est petite (disons moins de mille lignes de code), même une conversion complète à la main ne devrait pas être extrêmement difficile. Si c'est beaucoup plus grand que cela, je suggère de vérifier si vous le souhaitez en tant que code JavaScript de toute façon.

1
Brad Peabody