【问题标题】:Run Java command with classpath and library path from Golang使用 Golang 中的类路径和库路径运行 Java 命令
【发布时间】:2020-05-25 02:34:03
【问题描述】:

出于测试目的,我有一个帮助程序对象,它在代码中启动一个本地 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 -port 8000 -inMemory -sharedDb

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

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

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

【问题讨论】:

  • Java 是否需要像这样引用它的参数:"\"-Djava.library.path=%s\\DynamoDBLocal_lb\""?我认为libraryPathArg 中的那些内部\" 正在破坏它。我只是在评论,因为我对 Java 及其解释器不够了解。
  • 这是特定于 Windows 和特定参数的问题。我试过不带引号,但它确实坏了。
  • @blami 实际上,你是对的。如果从 shell 调用,则需要引号,但如果从代码调用,则会导致错误。

标签: java go exec


【解决方案1】:

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

  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"

【讨论】:

    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 2017-06-22
    • 2017-09-19
    • 2023-03-21
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多