java - 使用 ProcessBuilder 运行 Java 主类

标签 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-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", "all your shelisms work here, Even &"] ——或者使用 [java() , '-cp', classpath(), .. .] (这里不需要引用,没有转义,...(仅适用于您的常规字符串))

关于java - 使用 ProcessBuilder 运行 Java 主类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60395484/

相关文章:

java - 为什么我不能将用户输入存储到变量中然后使用该变量?

java - 计算 .csv 文件的列中的值 Java

maven - 如何在库的groupId形式及其在本地存储库中的关联路径之间轻松转换?

groovy - Gradle 自动打印数字

grails - 元替换两个不同的测试中的相同方法不起作用?

java - 在 Groovy 中将 Hamcrest 匹配器与 JMock 一起使用

java - 从java方法返回中排除特定整数

android - 如何解决Android Studio中的此错误?

intellij-idea - 如何配置IntelliJ以使用JUnit 4运行测试?

java - 从内存映射文件并行读取数据?