微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过 gradle 运行 mlcp 并导致:java.io.IOException: CreateProcess error=206, The filename or extension is too long

如何解决通过 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 任务?

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.rubygrapefruit.platform.internal.DefaultProcessLauncher 类。所以我的预感是,由于 task.json 的内容被放入命令行参数,JavaExec 类中的一些限制正在达到。您可以尝试扩展 JavaExec 来确认这一点 - 我想您会遇到同样的错误。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。