É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?
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 .
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.
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.
É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.
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.
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 .javaMethods.get(..).invoke(...)
.@MethodAlias(alias="windows.method1")
et invoquer à partir de javascript en utilisant window.method1()
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é)
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
Voici deux autres options, des choses à examiner et une troisième option ne se convertissant pas, juste vivre ensemble.
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.
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.
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).
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).
É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.