使用ProcessBuilder运行Java主类
几个月前,我创建了一个小型Gradle插件,在后台启动了一个Java应用程序。虽然这在过去工作得很好,但现在已经不行了,我很困惑为什么不行 该启动器在Windows下似乎工作正常,但在Linux下却无法实现同样的功能。当它试图运行有问题的命令时,如下所示:使用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
/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是有条件的),问题得到了解决。感谢您的响应,实际上问题是由传入的类路径被引用引起的。删除引号解决了问题。