我试图使用不同的java代码构建调试和释放war文件 - 与Android构建版本的工作方式非常相似。基本上我想在开发期间使用P6Spy或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
都有数据库管理类(我还没有应用包装器,只是试图让所有东西都能编译)。
这种作品 - 至少compileDebugJava
和compileDebugRelease
是有效的。但是,compileClasses
和compileJava
任务失败 - 而且这是预期的,代码依赖于需要改变的类。
但似乎compileJava
来自debugWar
任务,我无法弄清楚如何删除该依赖关系,或者让它只是调用{ {1}}任务而不是debugCompileJava
。
不幸的是,我不能使用DI,或修改代码以使用接口。
还有IDE集成的问题。看起来大多数IDE都想使用compileClasses。由于失败,IDE集成开始中断。理想的是将所有Debug任务用作默认值。
我已尝试在主代码中使用该类的发行版本,并且在调试代码中只有一个调试版本,但这会导致重复的类错误。这个犯规
有没有什么方法可以让我做我想做的事情,或接近它的事情?
答案 0 :(得分:0)
要获得有效的配置,我必须经历很多箍,但是我必须有有效的配置。
首先,为避免默认的编译/处理资源任务失败,我将java和资源srcDirs设置为none。然后,我发现war插件并不关心您在sourceSets中配置的内容-它总是使用相同的文件夹进行处理-因此debug和release构建/资源共享相同的构建路径。而且war插件也不会脱离您的依赖关系,因此要获得其中一个JDBC包装程序的debugImplemenation,我必须包括一个“调试”配置
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
}