通过gradle运行mlcp并获取引起原因:java.io.IOException:CreateProcess erro



我正在运行一个渐变任务

gradlew -b import.gradle copy_taskName -PinputHost="Host1" -PoutputHost="Host2" -Pduration=1 --stacktrace

在import.gradle中,有一个mlcp任务,我们在query_filter字段中传递taskName.json(其中所有查询都以json格式编写,以从输入主机获取数据(。

在运行任务时,我得到:

原因:java.io.io异常:无法运行程序"C: \Program Files\Java\jdk1.8.0_211\bin\Java.exe"(在目录"D:\Data1"中(:CreateProcess错误=206,文件名或扩展名太长位于net.rubygrapefrui.platform.internal.DefaultProcessLauncher.start(DefaultProcessLauncher.java:25(…还有5个引起原因:java.io.IOException:CreateProcess错误=206,文件名或扩展名太长…还有6个

当我从taskName.json中删除一些查询时,我没有遇到任何问题。我想知道,在taskName.json中编写的查询的大小或数量是否有任何限制,我们必须在query_filter参数中传递这些限制才能运行mlcp任务?

taskName.json中查询内容行的总数为398

taskName.json文件内容示例

{
"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.rubygrapefuit.platform.internal.DefaultProcessLauncher类。因此,我的直觉是,由于task.json的内容被扔进了命令行参数中,JavaExec类中的一些限制已经达到。您可以尝试扩展JavaExec来确认这一点——我想您也会遇到同样的错误。

一种可能的解决方案是使用MLCP options_file选项。由于您正在参数化task.json的内容,因此可能需要动态生成该文件的内容,大概是在每个Gradle任务的doFirst块中。但这将避免很长的命令行参数,因为您将把它们放入options_file中,并且您可能只需要在其中放入query_filter。

相关内容

最新更新