gpt4 book ai didi

java - 使用 ProcessBuilder 运行 Java 主类

转载 作者:行者123 更新时间:2023-12-02 08:57:36 26 4
gpt4 key购买 nike

几个月前,我创建了一个小型 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com