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/java
和src/release/debug
中都有数据库管理class(我还没有应用包装器,只是想编译所有东西)。
这种方法有效 - 好吧,至少 compileDebugJava
和 compileDebugRelease
有效。然而 compileClasses
和 compileJava
任务失败了——这是意料之中的,代码依赖于需要改变的 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
}
我正在尝试使用不同的 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/java
和src/release/debug
中都有数据库管理class(我还没有应用包装器,只是想编译所有东西)。
这种方法有效 - 好吧,至少 compileDebugJava
和 compileDebugRelease
有效。然而 compileClasses
和 compileJava
任务失败了——这是意料之中的,代码依赖于需要改变的 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
}