Chiama il programma java dal Nodo.applicazione js


Da quello che ho letto, ci sono un paio di modi per eseguire i file java in un'applicazione node.js. Un modo è generare un processo figlio: (il codice java è confezionato con dipendenze in un eseguibile 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'altro modo è usare il modulo java - npm ( link), un wrapper su JNI (questo mi permetterà di creare objects, impostare e ottenere attributes, eseguire methods).

In un ambiente di produzione, quando voglio il mio node.js (Express) server per chiamare un programma java (salva solo un'immagine alla directory locale), per favore avvisami su quale sarebbe il modo migliore per farlo (in termini di migliori pratiche). Inoltre, c'è una lunga lista di arguments che ho bisogno di passare alla classe main e farlo sulla riga di comando è un po ' difficile. Dovrei invece far leggere il programma java da un file di input?

Author: raul, 2017-04-11

4 answers

1) Se usi exec, eseguirai un intero programma, mentre se usi un'interfaccia JNI, sarai in grado di interagire direttamente con le librerie e le classi nel jar e fare cose come chiamare una singola funzione o creare un'istanza di una classe. Tuttavia, se non hai bisogno di qualcosa del genere, penso che usare exec sia molto più semplice e funzionerà anche più velocemente. Sembra che tu voglia solo eseguire l'applicazione Java come processo autonomo e registrare se l'applicazione è terminata correttamente o con errori. Direi che probabilmente è meglio usare solo exec per quello. Eseguire un processo figlio in questo modo è anche molto meglio per il debug, il debug degli errori JNI può essere molto difficile a volte.

2) Per quanto riguarda se leggere o meno argomenti da un file, sì, di solito è meglio leggere da una sorta di file anziché passare direttamente gli argomenti. È meno incline all'errore umano(es. digitando argomenti ogni volta), e molto più configurabile. Se qualcuno come un ingegnere QA ha solo bisogno per modificare un file di configurazione per scambiare le opzioni, non è necessario comprendere l'intera base di codice per testarlo. Personalmente uso i file di configurazione per ogni programma Java che scrivo.

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

È possibile utilizzare deployment toolkit ed eseguire il jar tramite jnlp. https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/deployment_toolkit.html Il vantaggio di eseguire jar tramite jnlp è la possibilità di passare parametri da javascript al tuo jar. In questo modo è possibile personalizzare dinamicamente il programma java.

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

Per questo tipo di problema dovresti affrontarlo nel modo seguente:

  • Esiste un modo decente per eseguire processi con argomenti nella mia lingua / framework
  • Esiste un modo decente per gestire l'output dei programmi?

Per esperienza, un modo decente per gestire gli argomenti in un processo è passarli come array (string). Questo è vantaggioso in quanto non è necessario ricorrere a interpolazioni e manipolazioni di stringhe non necessarie. È anche più anche leggibile che è un vantaggio in questa impostazione del problema.

Un modo decente per gestire l'output è utilizzare un modello basato su listener/eventi. In questo modo, rispondi in modo appropriato agli eventi invece di avere blocchi if per stderr e stdout. Ancora una volta, questo rende le cose leggibili e consente di gestire l'output in modo più gestibile.

Se vai un po ' oltre in questo, dovrai anche risolvere un problema di come iniettare variabili d'ambiente nel tuo programma di destinazione. Come ad esempio, potresti voler eseguire java con un debugger o con meno memoria in futuro, quindi anche la tua soluzione dovrebbe soddisfare questo.

Questo è solo un modo per risolvere questo tipo di problema . Se node è la tua piattaforma, dai un'occhiata al Processo figlio che supporta tutte queste tecniche.

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

Prova questo nel file nodejs:
https://www.npmjs.com/package/java
O questo nel file di risposta html:
<object width="400" height="400" data="helloworld.swf"></object> L'inconveniente è che legge solo .file swf... ...tranne che aggiungi il tipo java:

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