Appelez le programme java à partir du nœud.application js


D'après ce que j'ai lu, il existe plusieurs façons d'exécuter des fichiers java dans une application node.js. Une façon est de générer un processus enfant: (le code java est empaqueté avec des dépendances dans un exécutable jar.)

var exec = require('child_process').exec, child;    
child = exec('java -jar file.jar arg1 arg2',
      function (error, stdout, stderr){
        console.log('stdout: ' + stdout);
        console.log('stderr: ' + stderr);
        if(error !== null){
          console.log('exec error: ' + error);
        }
    });

L'autre façon est d'utiliser le module java - npm ( link), un wrapper sur JNI (cela me permettra de créer objects, de définir et d'obtenir attributes, d'exécuter methods).

Dans un environnement de production, quand je veux mon node.js (Express) serveur pour appeler un programme java (il enregistre simplement une image dans le répertoire local), veuillez m'indiquer quelle serait la meilleure façon d'y parvenir (en termes de meilleures pratiques). En outre, il y a une longue liste de arguments que je dois passer à la classe main et faire cela sur la ligne de commande est un peu difficile. Dois-je plutôt faire lire le programme java à partir d'un fichier d'entrée?

Author: raul, 2017-04-11

4 answers

1) Si vous utilisez exec, vous exécuterez un programme entier, alors que si vous utilisez une interface JNI, vous pourrez interagir directement avec les bibliothèques et les classes du jar et faire des choses comme appeler une seule fonction ou créer une instance d'une classe. Cependant, si vous n'avez besoin de rien de tel, je pense que l'utilisation de exec est beaucoup plus simple et fonctionnera également plus rapidement. Il semble que vous souhaitiez simplement exécuter l'application Java en tant que processus autonome et enregistrer simplement si l'application s'est terminée avec succès ou avec des erreurs. Je dirais qu'il est probablement préférable d'utiliser simplement exec pour cela. L'exécution d'un processus enfant de cette façon est également bien meilleure pour le débogage, le débogage des erreurs JNI peut parfois être très difficile.

2) Quant à savoir s'il faut lire ou non des arguments à partir d'un fichier, oui, il est généralement préférable de lire à partir d'une sorte de fichier plutôt que de passer directement des arguments. Il est moins sujet à l'erreur humaine (ie. taper des arguments à chaque fois), et beaucoup plus configurable. Si quelqu'un comme un ingénieur QA a seulement besoin pour modifier un fichier de configuration pour échanger des options, ils n'ont pas besoin de comprendre l'ensemble de votre base de code pour le tester. Personnellement, j'utilise des fichiers de configuration pour chaque programme Java que j'écris.

 4
Author: Ananth Rao, 2017-04-20 21:14:08

Vous pouvez utiliser deployment toolkit et exécuter le jar via jnlp. https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/deployment_toolkit.html L'avantage de l'exécution de jars via jnlp est la possibilité de transmettre des paramètres de javascript à votre jar. De cette façon, vous pouvez personnaliser dynamiquement votre programme java.

 0
Author: Gunesh Shefkedov, 2017-04-25 12:35:31

De cette type de problème vous voulez l'aborder de la manière suivante:

  • Existe-t-il un moyen décent d'exécuter des processus avec des arguments dans mon langage/framework
  • Existe - t-il un moyen décent de gérer la sortie des programmes?

Par expérience, une façon décente de traiter les arguments dans un processus est de les passer en tant que tableau (chaîne). Ceci est avantageux dans la mesure où vous n'avez pas à recourir à une interpolation et à une manipulation inutiles de chaînes. Il est également plus lisible aussi, ce qui est un plus dans ce paramètre de problème.

Une façon décente de gérer la sortie consiste à utiliser un modèle basé sur un écouteur/un événement. De cette façon, vous répondez de manière appropriée aux événements au lieu d'avoir des blocs if pour stderr et stdout. Encore une fois, cela rend les choses lisibles et vous permet de gérer la sortie d'une manière plus maintenable.

Si vous allez un peu plus loin dans le présent, vous devrez également résoudre un problème de comment injecter des variables d'environnement dans votre programme cible. Comme un par exemple, vous voudrez peut-être exécuter java avec un débogueur ou avec moins de mémoire à l'avenir, de sorte que votre solution devrait également répondre à cela.

Ce n'est qu'une façon de résoudre ce type de problème . Si node est votre plate-forme, alors jetez un oeil à Processus enfant qui prend en charge toutes ces techniques.

 0
Author: Shiraaz.M, 2017-04-26 13:07:56

Essayez ceci dans le fichier nodejs:
https://www.npmjs.com/package/java
Ou ceci dans le fichier de réponse html:
<object width="400" height="400" data="helloworld.swf"></object> L'inconvénient est que seul lit .les fichiers swf... ...sauf que vous ajoutez le type java:

 0
Author: Enderman Tesla, 2017-04-27 23:38:05