Por lo que leí, hay un par de formas de ejecutar archivos java en una aplicación node.js Una forma es generar un proceso secundario: (el código java está empaquetado con dependencias en un archivo jar ejecutable).
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); } }); La otra forma es usar el módulo java - npm ( enlace ), un contenedor sobre JNI (esto me permitirá crear objects , establecer y obtener attributes , ejecutar methods ).
En un entorno de producción, cuando quiero que mi node.js ( Express ) llame a un programa java (simplemente guarda una imagen en el directorio local), avíseme cuál sería la mejor manera de lograr esto (en términos de mejores prácticas). Además, hay una larga lista de arguments que necesito pasar a la clase main y hacerlo en la línea de comando es un poco complicado. ¿Debería hacer que el programa java lea desde un archivo de entrada?
1) Si usa exec , ejecutará un programa completo, mientras que si usa una interfaz JNI, podrá interactuar directamente con las bibliotecas y clases en el contenedor y hacer cosas como llamar a una sola función o crear una instancia de una clase Sin embargo, si no necesita nada de eso, creo que usar exec es mucho más simple y también se ejecutará más rápido. Parece que solo desea ejecutar la aplicación Java como un proceso independiente y simplemente registrar si la aplicación finalizó correctamente o con errores. Diría que probablemente sea mejor usar exec para eso. Ejecutar un proceso secundario de esta manera también es mucho mejor para la depuración, ya que la depuración de errores JNI puede ser muy difícil a veces.
2) En cuanto a leer o no los argumentos de un archivo, sí, por lo general es mejor leer de algún tipo de archivo en lugar de pasar los argumentos directamente. Es menos propenso al error humano (es decir, escribir argumentos cada vez) y mucho más configurable. Si alguien como un ingeniero de control de calidad solo necesita editar un archivo de configuración para intercambiar opciones, no necesita comprender todo su código base para probarlo. Personalmente, uso archivos de configuración para cada programa Java que escribo.
Simplemente puede llamar a un comando java, con classpath y argumentos, usando el módulo node-java-caller, incrusta la llamada para generar y también instalará automáticamente java si no está presente en el sistema
Podemos ejecutar todo el proyecto java creando un archivo .jar y ejecutarlo usando el comando en el shell y ejecutar ese archivo de shell. Para ejecutar el código java desde el proyecto nodejs, como sabemos, el proyecto podría ser una combinación de módulos java, js. Llame a la función exec () en el nodo para crear un proceso secundario para ejecutar el archivo de shell que tiene un comando para ejecutar el archivo .sh y también puede pasar algún argumento desde use.eg;
let fileName = 'someFile.txt'; let userName = 'Charlie Angle'; exec(`sh run.sh --context_param paramFilePath="./storage/${fileName}" --context_param userName="${userName}"`, (error, stdout, stderr) => {// Some code based on execution of above command})