0

我试图让我的 Node.js 代码调用我的 Java 代码,但是当我运行时

 % ls -la /Users/ekolotyluk/.m2/repository/com/fispan/crypto/common/0.1.0-SNAPSHOT/common-0.1.0-SNAPSHOT.jar
-rw-r--r--@ 1 ekolotyluk  staff  15218 17 Mar 06:19 /Users/ekolotyluk/.m2/repository/com/fispan/crypto/common/0.1.0-SNAPSHOT/common-0.1.0-SNAPSHOT.jar    

% $GRAALVM_HOME/bin/node --jvm —-vm.cp=/Users/ekolotyluk/.m2/repository/com/fispan/crypto/common/0.1.0-SNAPSHOT/common-0.1.0-SNAPSHOT.jar --polyglot src/index.js

我回来

internal/modules/cjs/loader.js:815
  const err = new Error(message);
          ^

Error: Cannot find module '/Users/ekolotyluk/dev/fispan/microservices/file-service/—-jvm.cp=/Users/ekolotyluk/.m2/repository/com/fispan/crypto/common/0.1.0-SNAPSHOT/common-0.1.0-SNAPSHOT.jar'
    at Function._resolveFilename (internal/modules/cjs/loader.js:815:15)
    at Function._load (internal/modules/cjs/loader.js:667:27)
    at Function.executeUserEntryPoint (internal/modules/run_main.js:60:12)
    at internal/main/run_main_module.js:17:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}
  1. 当 Graal-node 是选项的参数时,为什么 Graal-node 认为我的 jar 是节点模块vm.cp=
  2. Graal-node 似乎正在破坏该--vm.cp=选项
  3. 我已经检查了几次jar文件的文件系统路径,它确实在那里
  4. 还有什么我在某处缺少的东西吗?
  5. 我可以从 Node.js 调用 Java 库,但现在我想调用我自己的代码......

我的 Graal 版本是

% java -version
openjdk version "11.0.10" 2021-01-19
OpenJDK Runtime Environment GraalVM CE 21.0.0.2 (build 11.0.10+8-jvmci-21.0-b06)
OpenJDK 64-Bit Server VM GraalVM CE 21.0.0.2 (build 11.0.10+8-jvmci-21.0-b06, mixed mode, sharing)

任何想法将不胜感激......

经过更多调查并运行命令

$GRAALVM_HOME/bin/node --help
$GRAALVM_HOME/bin/node --help:vm

与我一直在阅读的所有文档和示例相反,似乎没有任何--vm.cp=选择。

4

2 回答 2

0

好的,与我一直在阅读的所有文档和示例相反,似乎不再有--vm.cp=选择。

解决方法是:在您的 Node.js 代码中使用类似

Java.addToClasspath("/Users/ekolotyluk/.m2/repository/com/fispan/crypto/common/0.1.0-SNAPSHOT/common-0.1.0-SNAPSHOT.jar")

自我提醒:在进行谷歌搜索时,它几乎不知道什么是最近的信息,什么是过时的......

于 2021-03-17T21:24:01.937 回答
-1

--vm.cp是指定类路径的正确选项。

默认情况下,node运行时不包含 jvm,因此无法加载类,因此不会--vm.cp在帮助消息中列出。因为--help:vm仅列出了底层 VM 选项。运行--jvm解决了这个问题:

$ node --jvm --help:vm | grep classpath
  --vm.classpath=<path>[:path...]              Manage the classpath for Java libraries that you can access from guest languages (':' separated list)
  --vm.cp=<path>[:path...]                     Manage the classpath for Java libraries that you can access from guest languages (':' separated list)
  --vm.Xbootclasspath/a:<path>[:path...]       Append classpath entries to the JVM's boot classpath (':' separated list)

您还可以使用 JS 代码中的以下行以编程方式将 jars 添加到您在答案中指定的类路径中。

Java.addToClasspath("/path/to/jar/file.jar")

您来自问题的错误消息表明:--jvm.cp被指定为节点说它试图查找模块:Error: Cannot find module '/Users/ekolotyluk/dev/fispan/microservices/file-service/—-jvm.cp=/Users/ekolotyluk/.m2/repository/com/fispan/crypto/common/0.1.0-SNAPSHOT/common-0.1.0-SNAPSHOT.jar'

如果 JavaScript 上下文无法访问 Java 类(此处稍作描述:https ://www.graalvm.org/reference-manual/js/FAQ/#errors ),则可能会发生类似的错误。

但是 GraalVM 的 node.js 中的 JavaScript 上下文并不限制对 Java 类的访问,所以为了完整性,我主要包括这个。

于 2021-03-19T11:57:03.987 回答