java - Gradle 排除 VS 包含

标签 java gradle build include

感谢 this question 上的回答,以下工作有效:

task copyToLib(type: Copy) {
    into "$buildDir/myapp/lib"
    from configurations.runtime {
        exclude module: 'commons-io'
    }
}

我认为以下内容也应该有效(包含而不是排除):

task copyToLib(type: Copy) {
    into "$buildDir/myapp/lib"
    from configurations.runtime {
        include module: 'commons-io'
    }
}

但我收到以下错误:

org.gradle.internal.metaobject.AbstractDynamicObject$CustomMessageMissingMethodException: Could not find method include() for arguments [{module=commons-io}] on configuration ':runtime' of type org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.

这是预期的还是我错过了任何明显的东西?

最佳答案

Groovy 允许您省略大量大括号和其他不必要的语法,但这也可能会导致不良行为,就像您的情况一样。

通过from(Object, Closure)创建子CopySpec的常见方法方法看起来就像您的代码:

[...]
    from 'sourcePath' {
        // configuration closure
    }
[...]

首先传递一个对象,该对象将通过 Project.files() 进行评估,然后传递一个用于配置的闭包。大括号可以省略。简单易行。

但是,在您的示例中,作为对象传递的表达式是一个方法调用,用于在 ConfigurationContainer 中配置 Configuration ,就像以下常见的 Gradle 代码一样:

configurations.runtime {
    exclude module: 'xyz'
}

因此,传递的闭包被解释为配置Configuration(全局,顺便说一句。),而不是配置CopySpec。处理这个问题的一种方法是显式设置省略的大括号:

[...]
    from(configurations.runtime, {
        // configuration closure
    })
[...]

请注意:使用上面的示例,您将能够使用 exclude()include() 方法,但不能像在你的代码示例!在 CopySpec 中,您只能排除(或包含)文件或文件模式,而不能排除模块。这些方法根本不允许您传递 map ,您需要传递 list of stringsanother closure .

关于java - Gradle 排除 VS 包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45705239/

相关文章:

java - 如何对 Java EE 代码进行单元测试?

java - 在 java 中使用 IP 地址查找位置的示例代码?

java - 从java中的集合中绘制一个项目

gradle build 中的 Android Studio Endpoints 和 peer not authenticated 错误

java - Nativescript 应用程序版本 : Issue facing while gradle build

xcode - XCode 的 SharedPrecompiledHeaders 文件夹路径变量

java - Spring设置抽象bean属性值

android - 在proguard android上,此警告的-dontwarn规则是什么?

c++ - 是否可以在构建时为 Unreal 项目定义预处理器指令?

visual-studio - 如何在 Visual Studio TFS 中自动化构建和部署?