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.
Puede usar el kit de herramientas de implementación y ejecutar el archivo jar a través de jnlp. https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/deployment_toolkit.html La ventaja de ejecutar archivos jar a través de jnlp es la capacidad de pasar parámetros de javascript a su archivo jar. De esta forma, puede personalizar dinámicamente su programa Java.
Para este tipo de problema , querrá abordarlo de la siguiente manera:
Por experiencia, una forma decente de manejar los argumentos en un proceso es pasarlos como una matriz (cadena). Esto es ventajoso porque no tiene que recurrir a la interpolación y manipulación innecesaria de cadenas. También es más legible, lo que es una ventaja en esta configuración de problemas.
Una forma decente de lidiar con la salida es usar un modelo basado en oyentes/eventos. De esta forma, responde de forma adecuada a los eventos en lugar de tener bloques if para stderr y stdout. Nuevamente, esto hace que las cosas sean legibles y le permite manejar la salida de una manera más fácil de mantener.
Si profundiza un poco más en esto, también tendrá que resolver un problema de cómo inyectar variables de entorno en su programa de destino . Como ejemplo, es posible que desee ejecutar Java con un depurador o con menos memoria en el futuro, por lo que su solución también debería tener esto en cuenta.
Esta es sólo una forma de resolver este tipo de problema . Si el nodo es su plataforma, eche un vistazo a Child Process , que admite todas estas técnicas.