根据我的阅读,有几种方法可以在self.init
应用程序中运行java
个文件。一种方法是生成子进程:( java代码与可执行文件node.js
中的依赖项打包在一起。)
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);
}
});
模块(link),java - npm
上的包装(这将让我创建JNI
,设置并获取{{1 },运行objects
)。
在生产环境中,当我希望我的attributes
(methods
)服务器调用node.js
程序时(它只是将图像保存到本地目录中),请告诉我这是实现这一目标的更好方法(就最佳实践而言)。此外,我需要传递给Express
类的java
长列表,并且在命令行上执行此操作有点困难。我应该从输入文件中读取arguments
程序吗?
答案 0 :(得分:4)
1)如果您使用exec
,您将运行整个程序,而如果您使用JNI接口,您将能够直接与jar中的库和类进行交互,并执行诸如调用之类的操作单个函数或创建类的实例。但是,如果您不需要这样的东西,我认为使用exec
要简单得多,而且运行速度也会更快。听起来您只想将Java应用程序作为独立进程运行,只需记录应用程序是成功完成还是有错误。我会说最好只使用exec
。以这种方式执行子进程对于调试来说也好得多,有时调试JNI错误可能非常困难。
2)至于是否从文件中读取参数,是的,通常最好从某种文件中读取而不是直接传入参数。它不容易出现人为错误(即每次都输入参数),而且更容易配置。如果像QA工程师这样的人只需要编辑配置文件来交换选项,他们就不需要了解整个代码库来测试它。就个人而言,我为每个编写的Java程序使用配置文件。
答案 1 :(得分:0)
您可以使用部署工具包并通过jnlp运行jar。 https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/deployment_toolkit.html 通过jnlp运行jar的优点是能够将参数从javascript传递到jar。通过这种方式,您可以动态自定义您的Java程序。
答案 2 :(得分:0)
对于这种类型的问题,您希望以下列方式接近它:
根据经验,处理过程中参数的一种不错的方法是将它们作为(字符串)数组传递。这是有利的,因为您不必采用不必要的字符串插值和操作。它也更具可读性,在这个问题设置中也是一个优点。
处理输出的一个不错的方法是使用基于侦听器/事件的模型。这样,您可以对事件做出适当的响应,而不是为stderr和stdout设置if块。同样,这使得事物可读,让你以更易于维护的方式处理输出。
如果你再深入研究一下,你还必须解决如何将环境变量注入目标程序的问题。例如,您可能希望将来使用调试器或更少内存来运行java,因此您的解决方案也需要满足此要求。
这只是解决这个问题的一种方法。如果node是您的平台,那么请查看支持所有这些技术的Child Process。
答案 3 :(得分:0)
我们可以通过创建它的.jar文件来运行整个Java项目,并使用Shell中的命令运行它并运行该Shell文件。为了从nodejs项目运行Java代码,我们知道项目可以是java,js模块的混合。 在节点中调用exec()函数以创建一个子进程来执行具有命令以运行.sh文件的外壳文件,并且还可以从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})
答案 4 :(得分:0)
您可以使用node-java-caller模块简单地调用带有类路径和参数的java命令,它将调用嵌入到spawn中,并且如果系统中不存在java,它也会自动安装