如何解决通过 gradle 运行 mlcp 并导致:java.io.IOException: CreateProcess error=206, The filename or extension is too long
我正在运行一个 gradle 任务
gradlew -b import.gradle copy_taskName -PinputHost="Host1" -PoutputHost="Host2" -Pduration=1 --stacktrace
在 import.gradle 中,有一个 mlcp 任务,我们在 query_filter
字段中传递一个 taskName.json(其中所有查询都以 json 格式编写以从输入主机获取数据)。>
在运行任务时,我得到:
Caused by: java.io.IOException: Cannot run program "C:\Program Files\Java\jdk1.8.0_211\bin\java.exe" (in directory "D:\Data1"): CreateProcess error=206,文件名或扩展名太长 在 net.rubygrapefruit.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:25) ……还有 5 个 引起:java.io.IOException: CreateProcess error=206,The filename or extension is too long ... 6个
当我从 taskName.json 中删除一些查询时,我没有遇到任何问题。
我想知道,在 taskName.json 中写入的查询的大小或数量是否有任何限制,我们必须传入 query_filter
参数才能运行 mlcp 任务?
{
"andQuery": {
"queries": [{
"collectionQuery": {
"uris": ["collection1"]
}
},{
"orQuery": {
"queries": [
{
"elementValueQuery": {
"element": ["{http://namespace.com/a/b}id"],"text": ["text1"],"options": ["lang=en"]
}
},{
"elementValueQuery": {
"element": ["{http://namespace.com/a/b}id"],"text": ["text2"],"options": ["lang=en"]
}
}]
}
},{
"notQuery": {
"query": {
"elementRangeQuery": {
"element": ["{http://namespace.com/a/b}date"],"operator": ">","value": [{
"type": "dateTime","val": "%%Now%%"
}]
}
}
}
}]
}
}
import.gradle
def importDirs = new File("./teams").listFiles()
importDirs.each { importDir ->
def queries = importDir.listFiles()
queries.each { file ->
def taskname = importDir.name + "_" +file.name.replace('.json','')
task "copy_$taskname" (
type: com.marklogic.gradle.task.MlcpTask,group: 'abc',dependsOn: []) {
classpath = configurations.mlcp
command = 'copY'
input_database = mlAppConfig.contentDatabaseName
input_host = inputHost
input_port = port
input_username = inputUsername
input_password = inputPassword
output_database = mlAppConfig.contentDatabaseName
output_host = outputHost
output_port = port
output_username = outputUsername
output_password = outputPassword
query_filter = file.text.replaceAll('"','\\\\"').replaceAll('%%Now%%',Now).replaceAll('%%targetDate%%',targetDate)
max_split_size = 500
}
}
}
解决方法
MlcpTask 正在扩展 Gradle 的 JavaExec 任务,错误来自 net.rubygrapefruit.platform.internal.DefaultProcessLauncher 类。所以我的预感是,由于 task.json 的内容被放入命令行参数,JavaExec 类中的一些限制正在达到。您可以尝试扩展 JavaExec 来确认这一点 - 我想您会遇到同样的错误。
一种可能的解决方案是使用 MLCP options_file 选项。由于您正在参数化 task.json 的内容,因此您可能需要动态生成该文件的内容,大概是在每个 Gradle 任务的 doFirst 块中。但这将避免很长的命令行参数,因为您会将它们放入 options_file - 您可能只需要在其中放入 query_filter。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。