使用ProcessBuilder运行Java主类

使用ProcessBuilder运行Java主类,java,gradle,groovy,process,processbuilder,Java,Gradle,Groovy,Process,Processbuilder,几个月前,我创建了一个小型Gradle插件,在后台启动了一个Java应用程序。虽然这在过去工作得很好,但现在已经不行了,我很困惑为什么不行 该启动器在Windows下似乎工作正常,但在Linux下却无法实现同样的功能。当它试图运行有问题的命令时,如下所示: /home/aris.kourtesas/.sdkman/candidates/java/8.0.242.hs-adpt/jre/bin/java -cp "/home/aris.kourtesas/Projects/marketing-se

几个月前,我创建了一个小型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 
它失败,出现以下错误:

错误:无法找到或加载主类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()
    }
您能解释一下吗?

原因很可能是您创建的命令中有一些空白,位于您无法控制的位置(例如用户名/用户名/密码)(在拆分后记录您的命令并查看发生了什么情况)


在空格上拆分是一种非常脆弱的方法,您应该永远不要使用它。首先使用字符串列表是一种方法。要么使用
[“sh-c”,“所有的shelism都在这里工作,甚至&“]
--要么使用
[java(),'-cp',classpath(),…]
(这里不需要引用,不需要转义,…(仅适用于groovy字符串))

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


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

感谢您的响应,实际上问题是由传入的类路径被引用引起的。删除引号解决了问题。