Gradle 风味 War 文件

Gradle Flavors For War Files

我正在尝试使用不同的 java 代码构建调试和发布 war 文件 - 与 Android 构建风格的工作方式大致相同。基本上我想在开发期间使用 P6Spy or datasource-proxy 围绕我的 DataSource 包装一个记录器,但绝对不想在发布版本中发布。我更愿意在代码中执行此操作,而不是在应用服务器中的数据源定义中执行此操作。

我的 build.gradle 看起来像这样:

apply plugin: 'java'
apply plugin: 'war'

configurations {
  // debug
  debugImplementation.extendsFrom implementation
  debugRuntimeOnly.extendsFrom runtimeOnly
  debugCompileOnly.extendsFrom compileOnly

  // release
  releaseImplementation.extendsFrom implementation
  releaseRuntimeOnly.extendsFrom runtimeOnly
  releaseCompileOnly.extendsFrom compileOnly
}

sourceSets {
  debug {
    java {
      compileClassPath += main.compileClasspath
      runtimeClassPath += main.runtimeClasspath
      srcDirs = ['src/debug/java','src/main/java']
    }
  }
  release {
    java {
      compileClassPath += main.compileClasspath
      runtimeClassPath += main.runtimeClasspath
      srcDirs = ['src/release/java','src/main/java']
    }
  }
}

dependencies {
   debugImplementation 'logging:artifact'
}

task debugWar(type: War, group: "Build") {
    from sourceSets.debug.output
    classifier = 'debug'
}

我在src/release/javasrc/release/debug中都有数据库管理class(我还没有应用包装器,只是想编译所有东西)。

这种方法有效 - 好吧,至少 compileDebugJavacompileDebugRelease 有效。然而 compileClassescompileJava 任务失败了——这是意料之中的,代码依赖于需要改变的 class。

但是 compileJava 似乎是从 debugWar 任务中调用的,我一直无法弄清楚如何删除该依赖项,或者让它只调用 debugCompileJava 任务而不是 compileJava.

不幸的是,我无法使用 DI,也无法修改代码以使用接口。

还有 IDE 集成的问题。看起来大多数 IDE 都想使用 compileClasses。由于失败,IDE 集成开始中断。理想的情况是将所有调试任务用作默认值。

我试过在主代码中使用 class 的发布版本,在调试代码中使用调试版本,但这会导致重复的 class 错误。这会

有什么方法可以让它做我想做的事,或者接近它的事吗?

我必须经历很多困难才能获得工作配置,但我有一个工作配置。

首先,为了避免默认 compile/process 资源任务失败,我将 java 和资源 srcDirs 设置为空。然后我发现 war 插件不关心你在你的 sourceSets 中配置了什么 - 它总是会使用相同的文件夹 - 所以调试和发布 builds/resources 共享相同的构建路径。 war 插件也不会从您的依赖项中获取,因此要获得 JDBC 包装器之一的 debugImplemenation,我必须包含一个 "debug" 配置

sourceSets {

    // override the main, telling gradle main has no sources.
    main {
        java { srcDirs = [] }
        resources { srcDirs = [] }
    }

    // debug builds
    debug {
        java {
            compileClasspath += main.output
            runtimeClasspath += main.output
            //  combine code from main and debug java code
            srcDirs = ['src/debug/java', 'src/main/java']
        }
        // combine resources
        resources {
            srcDirs = ['src/debug/resources', 'src/main/resources']
        }
        // override the resources and classes output, for compatibility with the war plugin
        output.resourcesDir = 'build/resources/main'
        output.classesDir = 'build/classes/java/main'
    }

    // release builds
    release {
        java {
            compileClasspath += main.output
            runtimeClasspath += main.output
            //  combine code from main and release java code
            srcDirs = ['src/release/java', 'src/main/java']
        }
        // combine resources
        resources {
            srcDirs = ['src/release/resources', 'src/main/resources']
        }
        // override the resources and classes output, for compatibility with the war plugin
        output.resourcesDir = 'build/resources/main'
        output.classesDir = 'build/classes/java/main'
    }
}

task debugWar(type: War, group: 'Build') {
    classifier 'SNAPSHOT'
    from sourceSets.debug.output
    // add the debug dependencies
    classpath configurations.debug    
}

task releaseWar(type: War, group: 'Build') {
    from sourceSets.release.output    
}