运行 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 不够熟悉,无法弄清楚这些值应该是什么.
所以,我在这里解决了我的问题。有两个主要问题:
- 通过将
cmd.Path
设置为 "java",我告诉 Go 我希望命令在本地 运行 而不是来自 Java 的 PATH 条目。因此,我不需要 .jar 文件目录的完全限定路径。
- 即使运行在本地,代码存在于
dynamodbtestutil\
目录中,所以我需要提供classpath
参数。不过,"dynamodb_local_latest"的价值已经足够了。
-jar
参数的值也需要以该路径为前缀。
-Djava.library.path
的值也需要以该路径为前缀
-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"
出于测试目的,我有一个帮助程序对象,它在代码中启动 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 不够熟悉,无法弄清楚这些值应该是什么.
所以,我在这里解决了我的问题。有两个主要问题:
- 通过将
cmd.Path
设置为 "java",我告诉 Go 我希望命令在本地 运行 而不是来自 Java 的 PATH 条目。因此,我不需要 .jar 文件目录的完全限定路径。 - 即使运行在本地,代码存在于
dynamodbtestutil\
目录中,所以我需要提供classpath
参数。不过,"dynamodb_local_latest"的价值已经足够了。 -jar
参数的值也需要以该路径为前缀。-Djava.library.path
的值也需要以该路径为前缀-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"