gradle javaexec 错误“'apiElements' 不允许直接使用”- Gradle 5.4.1

gradle javaexec error "'apiElements' directly is not allowed"- Gradle 5.4.1

我是 Gradle 的新手,正在尝试将现有系统构建从 ant 迁移到 Gradle。 作为其中的一部分,我需要在目录中的每个文件上 运行 一个 java 程序。目录包含 xml 个文件,java 代码将解析 .xml 并将其转换为 .java 文件(这些 Java 文件将生成 class 并在执行一些特定于业务的转换后打包到最终 jar 中。

下面是我在Gradle

中写的函数
private runJavaFile(String dirPath) {
    FileTree tree = fileTree(dir: dirPath, include: '**/*.xml')
    tree.each {
        def xmlfile = it.path
        def javaFile = it.path.replaceFirst(".xml", ".java")
        javaexec {  //// getting error on this line
            classpath configurations.all
            main = 'XmlToJavaParser'
            args = ["$xmlfile", "$javaFile", 'Java']
        }
    }
}

我通过传递包含要解析的 xml 文件的目录路径从 Gradle 任务调用此函数。 运行执行任务时,出现以下错误:

> Resolving configuration 'apiElements' directly is not allowed

如有任何帮助,我们将不胜感激。 如果需要更多信息,请告诉我。

在 Gradle 中,一个配置表示一组工件及其依赖项。根据您要执行的操作,您通常有多种配置。例如,您可以在其中声明编译需要哪些依赖项,仅在运行时需要哪些依赖项,或者 运行 特定 Java 应用程序需要哪些依赖项。

在您的情况下,您是说 XmlToJavaParser class 的 class 路径是“所有配置的组合”,这实际上没有意义。您也不允许这样做,因为 Java 插件中的某些配置无法像这样解析,这就是您收到错误的原因。

所以要修复它,您应该为 XmlToJavaParser 声明您自己的配置。然后您可以像往常一样为其声明依赖项。示例(使用 Groovy DSL):

configurations {
    xmlJavaParser {
        canBeResolved = true
        canBeConsumed = false
    }
}

dependencies {
    xmlJavaParser "org.example:xml-java-parser:1.0" // or whatever you need
}

private runJavaFile(String dirPath) {
    // ...
    javaexec {
        classpath = configurations.xmlJavaParser // The configuration is referenced here
        main = 'XmlToJavaParser'
        args = ["$xmlfile", "$javaFile", 'Java']
    }
}

还有其他方法可以解决这个问题。但要点是不要将 configurations.all 用作 class 路径。