Nach dem, was ich gelesen habe, gibt es ein paar Möglichkeiten, java
-Dateien in einer node.js
-Anwendung auszuführen. Eine Möglichkeit besteht darin, einen untergeordneten Prozess zu erzeugen: (Der Java-Code ist mit Abhängigkeiten in einer ausführbaren Datei jar
verpackt.)
Die andere Möglichkeit besteht darin, den java - npm
-Modul ( link ) zu verwenden, einen Wrapper über JNI
(this Lassen Sie mich objects
erstellen, setzen und attributes
abrufen, methods
) ausführen.
Wenn ich in einer Produktionsumgebung meinen node.js
( Express
) -Server ein java
-Programm aufrufen möchte (es speichert nur ein Bild im lokalen Verzeichnis), bitte teilen Sie mir mit, welches der bessere Weg wäre um dies zu erreichen (in Bezug auf Best Practices). Außerdem gibt es eine lange Liste von arguments
, die ich an die main
-Klasse weitergeben muss, und das in der Befehlszeile zu tun, ist etwas mühsam. Soll ich stattdessen das Programm java
aus einer Eingabedatei lesen?
1) Wenn Sie exec
verwenden, werden Sie ein ganzes Programm ausführen, während Sie, wenn Sie eine JNI-Schnittstelle verwenden, direkt mit den Bibliotheken und Klassen im jar interagieren und Dinge wie einen einzelnen aufrufen können Funktion oder erstellen Sie eine Instanz einer Klasse. Wenn Sie so etwas nicht benötigen, ist die Verwendung von exec
jedoch viel einfacher und wird auch schneller ausgeführt. Klingt so, als ob Sie die Java-Anwendung nur als eigenständigen Prozess ausführen und nur protokollieren möchten, ob die Anwendung erfolgreich oder mit Fehlern beendet wurde. Ich würde sagen, es ist wahrscheinlich besser, dafür exec
zu verwenden. Das Ausführen eines untergeordneten Prozesses auf diese Weise ist auch viel besser zum Debuggen, das Debugging von JNI-Fehlern kann manchmal sehr schwierig sein.
2) Für das Lesen von Argumenten aus einer Datei ist es in der Regel besser, aus einer Datei zu lesen, als Argumente direkt zu übergeben. Es ist weniger anfällig für menschliche Fehler (dh jedes Mal, wenn Argumente eingegeben werden) und viel konfigurierbarer. Wenn jemand wie ein QA-Techniker nur eine Konfigurationsdatei bearbeiten muss, um Optionen auszutauschen, müssen sie nicht Ihre gesamte Codebasis verstehen, um sie zu testen. Persönlich verwende ich Konfigurationsdateien für jedes Java-Programm, das ich schreibe.
Sie können das deployment toolkit verwenden und das jar über jnlp ausführen. Ссылка Der Vorteil, jars durch jnlp laufen zu lassen, ist die Fähigkeit, Parameter von Javascript an Ihr jar zu übergeben. Auf diese Weise können Sie Ihr Java-Programm dynamisch anpassen.
Für dieses Problem möchten Sie es wie folgt ansprechen:
Aus Erfahrung ist es ein guter Weg, mit Argumenten in einem Prozess umzugehen, sie als (String-) Array zu übergeben. Dies ist vorteilhaft, da Sie nicht auf unnötige Stringinterpolation und -manipulation zurückgreifen müssen. Es ist auch besser lesbar, was ein Plus in dieser Problemstellung ist.
Eine vernünftige Möglichkeit, mit der Ausgabe umzugehen, ist die Verwendung eines listener- / ereignisbasierten Modells. Auf diese Weise reagieren Sie angemessen auf die Ereignisse, anstatt Blöcke für stderr und stdout zu haben. Auch dies macht die Dinge lesbar und lässt Sie die Ausgabe in einer besser wartbaren Art handhaben.
Wenn Sie etwas weiter gehen, müssen Sie auch ein Problem lösen, wie Umgebungsvariablen in Ihr Zielprogramm injiziert werden . Als ein Beispiel möchten Sie möglicherweise das Java mit einem Debugger oder mit weniger Speicher in der Zukunft ausführen, so dass Ihre Lösung auch dafür sorgen müsste.
Dies ist nur eine Möglichkeit, dieses Problem zu lösen . Wenn Knoten Ihre Plattform ist, sehen Sie sich den Child-Prozess an, der alle diese Techniken unterstützt.
Versuchen Sie dies in nodejs Datei:
Ссылка
Oder dies in HTML-Antwortdatei:
<object width="400" height="400" data="helloworld.swf"></object>
Das Unpraktische ist, dass nur .swf-Dateien gelesen werden ...
... außer dass du Java hinzufügst: