出于测试目的,我有一个辅助对象,该对象以代码形式启动本地的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不够熟悉,无法确定这些值应该是什么。
所以,我在这里找到了我的问题。主要有两个问题:
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"