用构建参数控制gradle运行时依赖关系



我使用gradle及其Shadowjar插件来为我的应用程序构建一个胖罐子,该应用程序已在两种情况下部署。

在一个上下文中,环境提供依赖项A,B和C(及其所有传递依赖性),而这些类不应该是我胖罐的一部分。

在另一种情况下,环境仅提供依赖项A和B,我必须确保C及其所有及其依赖性捆绑在我的胖罐中。

如何在Gradle Build File中定义此行为?我认为最好的方法是根据构建目标或命令行参数以某种方式调整runtime.exclude属性。

,所以我认为您正在寻找两种配置。

apply plugin: 'groovy'
repositories {
    jcenter()
}
dependencies {
    compile localGroovy()
    compile 'org.slf4j:slf4j-api:1.7.21'
    compileOnly group: 'com.google.guava', name: 'guava', version: '20.0'
    testCompile 'junit:junit:4.12'
}
task fatJar(type: Jar) {
    from sourceSets.main.output, configurations.compile
    baseName = "$project.name-fat"
}
jar.dependsOn fatJar

现在,我们可以为对部署到

的每个上下文创建一个JAR
$ ./gradlew clean build
Configuration on demand is an incubating feature.
:clean
:compileJava UP-TO-DATE
:compileGroovy
:processResources UP-TO-DATE
:classes
:fatJar
:jar
:assemble
:compileTestJava UP-TO-DATE
:compileTestGroovy UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build
BUILD SUCCESSFUL
Total time: 4.997 secs

现在让我们验证我们有一个胖罐

$ unzip build/libs/q40727142-fat.jar -d build/libs/included
Archive:  build/libs/q40727142-fat.jar
   creating: build/libs/included/META-INF/
  inflating: build/libs/included/META-INF/MANIFEST.MF  
   creating: build/libs/included/com/
   creating: build/libs/included/com/jbirdvegas/
   creating: build/libs/included/com/jbirdvegas/q40727142/
  inflating: build/libs/included/com/jbirdvegas/q40727142/Hello.class  
  inflating: build/libs/included/groovy-all-2.4.7.jar  
  inflating: build/libs/included/slf4j-api-1.7.21.jar  

,让我们验证原始配置没有预期的罐子。

$ unzip build/libs/q40727142.jar -d build/libs/notIncluded
Archive:  build/libs/q40727142.jar
   creating: build/libs/notIncluded/META-INF/
  inflating: build/libs/notIncluded/META-INF/MANIFEST.MF  
   creating: build/libs/notIncluded/com/
   creating: build/libs/notIncluded/com/jbirdvegas/
   creating: build/libs/notIncluded/com/jbirdvegas/q40727142/
  inflating: build/libs/notIncluded/com/jbirdvegas/q40727142/Hello.class

我使用了一个看起来像这样的构建文件:

subprojects {
    apply plugin: "java"
    apply plugin: "scala"
    version = "1.0-SNAPSHOT"
    group = "com.example.projects"
    ext.deployEnv = "Env1"
    if (project.hasProperty("deployEnv")) {
        ext.deployEnv= project.property("deployEnv")
    }
}
project(":myproject") {
    configurations {
        runtime.exclude group: 'A'
        runtime.exclude group: 'B'
    }
    if (ext.deployEnv == 'Env0') {
        configurations {
            runtime.exclude group:'C'
        }
    }
}

它可以完成我想要的,对构建文件的更改最小。

最新更新