使用 J2V8 从 java 项目嵌入 node.js 应用程序 - 解析 node.js 中的相对路径

Embed node.js application from java project with J2V8 - resolving relative paths in node.js

运行 Node.js 应用程序 (1) 在 JVM 上使用另一个基于 Java 的应用程序 (2) 的 J2V8 时出现问题。应用程序 (1) 的启动脚本在行

上失败
fs.readFileSync('./lib/someFile.json') 

因为 J2V8 提供了 '.' 应用程序 (2) 根目录的路径 但我需要 '.' 作为应用程序 (1) 根目录的路径。

仅在项目 (2) 中进行更改如何处理?

更新:添加了 Java 启动 node.js 应用程序的代码。

public static void main(String[] args) {
        final NodeJS nodeJS = NodeJS.createNodeJS();
        File nodeScript = new File("/media/Projects/Test/start.js");
        nodeJS.exec(nodeScript);
        while(nodeJS.isRunning()) {
            nodeJS.handleMessage();
        }
        nodeJS.release();
}

您可以使用 __dirname 获取 Node 脚本所在目录的路径。

例如:

fs.readFileSync(__dirname + '/lib/someFile.json');

可能会满足您的需要。

或使用path.join:

var path = require('path');
fs.readFileSync(path.join(__dirname, 'lib', 'someFile.json');

使用 path.join 您可以执行以下操作:

console.log(path.join(__dirname, '..', 'lib', 'someFile.json'));

访问 lib 比你的 Node 程序高一级等等。另外,多亏了 path.join 你不必考虑不同操作系统上的路径分隔符(比如 / Unix/Linux 和 \ Windows).

只对您的 Java 项目进行更改,您必须 运行 您的 Node 应用程序具有不同的工作目录。这取决于您 运行 的方式,但您应该做的是在 运行 安装 Node 应用程序之前将目录更改为您希望 '.' 指向的目录。您没有提供从您的 Java 应用程序实际 运行ning Node 应用程序的代码示例,因此很难再说什么了。

更新

看来您使用的是J2V8。 GitHub 上有一个与您尝试执行的操作相关的未解决问题: Issue #185: Set the working directory

您可以尝试在从 Java 启动 Node 程序之前更改工作目录 - 使用与 chdir 系统调用等效的 Java。

或者您可以将您的 Node 程序复制到您的 Java 项目中,这样它们的 '.' 目录是相同的,这样您就可以调用它:

File nodeScript = new File("./start.js");

当你可以将start.js调用为./start.js时,Node中的'.'应该是start.js文件所在的目录。