运行 Java 命令与来自 Golang 的类路径和库路径

Run Java command with classpath and library path from Golang

出于测试目的,我有一个帮助程序对象,它在代码中启动 AWS DynamoDB 本地实例。 Java 代码的结构如下所示:

dynamodbtestutil\
- dynamodb_local_latest\
- - DynamoDBLocal.jar
- - DynamoDBLocal_lib\

主要 class 在 DynamoDBLocal.jar 中,所有库 class 都在 DynamoDBLocal_lib

命令通过以下 Go 代码执行:

path, _ := os.Getwd()
classPath := fmt.Sprintf("%s\dynamodb_local_latest", path)
libraryPathArg := fmt.Sprintf("\"-Djava.library.path=%s\DynamoDBLocal_lb\"", classPath)
cmd := exec.Command("java", "-cp", fmt.Sprintf("\"%s\"", classPath), libraryPathArg, "-jar", "DynamoDBLocal.jar", "-port", strconv.FormatInt(port, 10), "-inMemory", "-sharedDb")
cmd.Path = "java"

但是,我无法使用它,因为 Java 找不到库路径。我得到的输出如下:

Command: java "-Djava.library.path=****\pkg\dynamodbtestutil\dynamodb_local_latest\DynamoDBLocal_lb" -jar DynamoDBLocal.jar -port 8000 -inMemory -sharedDb

Output: Error: Could not find or load main class "-Djava.library.path=*****\pkg\dynamodbtestutil\dynamodb_local_latest\DynamoDBLocal_lb"

注意:插入 * 代替实际路径。

这显然是我如何格式化命令的问题,但我不确定这应该如何工作,因为我对 JRE 不够熟悉,无法弄清楚这些值应该是什么.

所以,我在这里解决了我的问题。有两个主要问题:

  1. 通过将 cmd.Path 设置为 "java",我告诉 Go 我希望命令在本地 运行 而不是来自 Java 的 PATH 条目。因此,我不需要 .jar 文件目录的完全限定路径。
  2. 即使运行在本地,代码存在于dynamodbtestutil\目录中,所以我需要提供classpath参数。不过,"dynamodb_local_latest"的价值已经足够了。
  3. -jar 参数的值也需要以该路径为前缀。
  4. -Djava.library.path 的值也需要以该路径为前缀
  5. -Djava.library.path 参数不应该在引号内。

代码现在看起来像这样:

cmd := exec.Command("java", "-classpath", "dynamodb_local_latest", "-Djava.library.path=dynamodb_local_latest\DynamoDBLocal_lb", "-jar", "dynamodb_local_latest\DynamoDBLocal.jar",
    "-port", strconv.FormatInt(port, 10), "-inMemory", "-sharedDb")
cmd.Path = "java"