【问题标题】:Running Java main class using ProcessBuilder使用 ProcessBuilder 运行 Java 主类
【发布时间】:2020-02-25 13:14:41
【问题描述】:

几个月前,我创建了一个小的 Gradle 插件,可以在后台启动一个 Java 应用程序。虽然这在过去工作得很好,但现在已经不行了,我很困惑为什么它不能。

启动器在 Windows 下似乎工作正常,但在 Linux 下却失败了。当它尝试运行有问题的命令时:

/home/aris.kourtesas/.sdkman/candidates/java/8.0.242.hs-adpt/jre/bin/java -cp "/home/aris.kourtesas/Projects/marketing-server/classes:/home/aris.kourtesas/Projects/marketing-server/classes/*" -XX:+UseParallelGC -Dads.net.port=17770 -Dads.db.user=marketing_int -Dads.db.pwd=marketing_int -Dads.marketing fts.marketing.server.WebServer 

它失败并出现以下错误:

Error: Could not find or load main class fts.marketing.server.WebServer

但是,当我复制粘贴命令并直接在 shell 上运行它时,它工作得很好。我很困惑,说实话我不知道我应该做什么。所有文件都存在并且类路径正确但它说找不到我试图调用的主类。

供参考,这是创建启动命令的代码:

if (isWindows()) {
        builder.append("CMD /C START /B ")
    }

    builder.append(java() + " -cp " + classpath() +
            " -XX:+UseParallelGC " +
            "-Dads.net.port=${MARKETING_IT_APPSERVER_PORT} " +
            "-Dads.db.user=${MARKETING_IT_DB_USERNAME} " +
            "-Dads.db.pwd=${MARKETING_IT_DB_PASSWORD} " +
            "-Dads.marketing " +
            (MARKETING_IT_DB_HOST ? "-Dads.db.host=${MARKETING_IT_DB_HOST} " : '') +
            (MARKETING_IT_USER_HOME ? "-Duser.home=${MARKETING_IT_USER_HOME} " : '') +
            "fts.marketing.server.WebServer")
    if (!isWindows()) {
        builder.append(" &")
    }

这是创建和启动相关过程的代码部分:

private def static createProcess(String directory, String command) {
       new ProcessBuilder(command.split(' '))
                .redirectErrorStream(true)
                .directory(Paths.get(directory).toFile())
                .start()
    }

你能解释一下吗?

【问题讨论】:

    标签: java gradle groovy process processbuilder


    【解决方案1】:

    最有可能的原因是您在您无法控制的地方创建的命令中有一些空格(例如用户名/用户主页/密码)(拆分后记录您的命令并查看发生了什么)。

    在空白处分割是一种非常脆弱的方法,你应该永远不要使用它。首先使用字符串列表是可行的方法。要么使用["sh -c", "all your shelisms work here, even &"]——要么使用[java() , '-cp', classpath(), ...](这里不需要引用,不需要转义,...这里需要(仅用于你的groovy字符串))

    【讨论】:

    • 感谢您的回复,实际上问题是由于引用了传入的类路径引起的。删除引号解决了这个问题。
    【解决方案2】:

    关闭此问题已解决。由于某种原因,引用类路径导致命令在尝试在 Linux 中运行时失败。

    从类路径中删除了引号(有条件地适用于 Linux),问题得到解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多