使用Golang中的类路径和库路径运行Java命令

问题描述 投票:0回答:1

出于测试目的,我有一个辅助对象,该对象以代码形式启动本地的AWS DynamoDB实例。 Java代码的结构如下所示:

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

主类在DynamoDBLocal.jar中,所有库类在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无法找到库路径,因此我无法使其正常工作。我得到的输出如下:

命令:java“ -Djava.library.path = **** \ pkg \ dynamodbtestutil \ dynamodb_local_latest \ DynamoDBLocal_lb” -jar DynamoDBLocal.jar-端口8000 -inMemory -sharedDb

输出:错误:无法找到或加载主类“ -Djava.library.path = ***** \ pkg \ dynamodbtestutil \ dynamodb_local_latest \ DynamoDBLocal_lb”

注意:*代替实际路径。

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

java go exec
1个回答
0
投票

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

  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"
© www.soinside.com 2019 - 2024. All rights reserved.