Skip to content

Commit 450f7b5

Browse files
authored
Improves openliberty project laziness (#9641)
1 parent 0b95702 commit 450f7b5

File tree

2 files changed

+184
-125
lines changed

2 files changed

+184
-125
lines changed

dd-java-agent/instrumentation/liberty-20/build.gradle

Lines changed: 87 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -3,109 +3,140 @@ plugins {
33
}
44
apply from: "$rootDir/gradle/java.gradle"
55

6-
String relAppDir = 'openliberty-jars/wlp/usr/servers/defaultServer/dropins/war/testapp'
6+
def openlibertyHomeDir = project.layout.buildDirectory.dir("openliberty")
7+
8+
String testWebAppDir = 'wlp/usr/servers/defaultServer/dropins/war/testapp'
9+
710
sourceSets {
8-
webapp {
11+
register("webapp") {
912
java {
10-
destinationDirectory.value project.layout.buildDirectory.dir("$relAppDir/WEB-INF/classes")
13+
destinationDirectory = openlibertyHomeDir.map {it.dir("$testWebAppDir/WEB-INF/classes") }
1114
}
12-
output.resourcesDir = project.layout.buildDirectory.dir("$relAppDir/")
15+
output.resourcesDir = openlibertyHomeDir.map { it.dir(testWebAppDir) }
1316
}
1417
}
1518

1619
configurations {
17-
zipped
18-
testLogging
20+
register("zipped")
21+
register("testLogging")
1922
}
2023

2124
evaluationDependsOn ':dd-java-agent:instrumentation:servlet:request-3'
2225

26+
// Since these tasks output are used in dependencies they have to be declared before, they can be configured later
27+
def unpackOpenLiberty = tasks.register('unpackOpenLiberty', UnpackOpenLiberty) {
28+
extractDir.set(openlibertyHomeDir)
29+
}
30+
def filterLogbackClassic = tasks.register('filterLogbackClassic', Sync)
31+
2332
dependencies {
2433
zipped group: 'io.openliberty', name: 'openliberty-runtime', version: '21.0.0.3', ext: 'zip'
2534
testLogging libs.bundles.test.logging
2635

2736
compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
28-
compileOnly files({ tasks.installOpenLibertyDeps.extractedJars })
37+
compileOnly files(unpackOpenLiberty.map {it.extractedJars.get() })
2938
implementation project(':dd-java-agent:instrumentation:servlet-common')
3039

31-
testImplementation files({ tasks.installOpenLibertyDeps.wsServerJar })
40+
testImplementation files(unpackOpenLiberty.map {it.wsServerJar.get() })
3241
testImplementation project(':dd-java-agent:appsec:appsec-test-fixtures')
3342
testRuntimeOnly project(':dd-java-agent:instrumentation:osgi-4.3')
34-
testRuntimeOnly files({ tasks.filterLogbackClassic.filteredLogbackDir })
43+
testRuntimeOnly files(filterLogbackClassic.map { it.destinationDir })
3544
testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:request-3')
3645

3746
webappCompileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
3847
// compileOnly to avoid bringing all the test dependencies to the test app
3948
// these are to be provided by the system classloader on test time
4049
webappCompileOnly testFixtures(project(':dd-java-agent:instrumentation:servlet:request-3'))
4150
// only the testFixtures jar (not its dependencies) and groovy should be included in the webapp
42-
webappImplementation files(
43-
project(':dd-java-agent:instrumentation:servlet:request-3')
44-
.getTasksByName('testFixturesJar', false).archiveFile
45-
)
51+
add("webappImplementation", testFixtures(project(':dd-java-agent:instrumentation:servlet:request-3'))) {
52+
transitive = false
53+
}
4654
// use the above instead of:
4755
// webappImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:request-3'))
4856
// because using testFixtures() causes some early evaluation of dependencies
4957
webappRuntimeOnly libs.groovy
5058
}
51-
compileWebappJava.dependsOn ':dd-java-agent:instrumentation:servlet:request-3:testFixturesJar'
5259

53-
configurations.testRuntimeOnly {
60+
configurations.named("testRuntimeOnly") {
5461
exclude group: 'ch.qos.logback', module: 'logback-classic'
5562
exclude group: 'org.codehaus.groovy', module: 'groovy-servlet'
5663
}
57-
configurations.webappRuntimeClasspath {
64+
configurations.named("webappRuntimeClasspath") {
5865
exclude group: 'ch.qos.logback', module: 'logback-classic'
5966
}
6067

61-
//unzips the dependencies from the 'zipped' configuration so 'compileOnly' can reference it
62-
tasks.register('installOpenLibertyDeps', Copy) {
63-
def extractDir = "${buildDir}/openliberty-jars"
64-
ext.extractedJars = fileTree(extractDir) {
65-
include "wlp/lib/*.jar"
66-
builtBy "installOpenLibertyDeps"
67-
}
68-
ext.wsServerJar = fileTree("$extractDir") {
69-
include "wlp/bin/tools/ws-server.jar"
70-
builtBy "installOpenLibertyDeps"
68+
// unzips the dependencies from the 'zipped' configuration so 'compileOnly' can reference it
69+
abstract class UnpackOpenLiberty extends Copy {
70+
@Input
71+
final Property<String> configurationName = project.objects.property(String).convention("zipped")
72+
73+
@OutputDirectory
74+
final DirectoryProperty extractDir = project.objects.directoryProperty()
75+
76+
@OutputFiles
77+
final Provider<FileTree> extractedJars = project.providers.provider {
78+
project.fileTree(extractDir) {
79+
include "wlp/lib/*.jar"
80+
}
7181
}
72-
dependsOn configurations.zipped
73-
// I didn't manage to get this to work correctly using a Sync task or Sync + outputs.upToDateWhen
74-
// (files are updated when not needed, causing intellij to reindex or they are deemed up to date
75-
// when the extraction was not done at all).
76-
ext.serverXmlFile = file("$extractDir/wlp/usr/servers/defaultServer/server.xml")
77-
onlyIf {
78-
!ext.serverXmlFile.exists()
82+
83+
@OutputFiles
84+
final Provider<FileTree> wsServerJar = project.providers.provider {
85+
project.fileTree(extractDir) {
86+
include "wlp/bin/tools/ws-server.jar"
87+
}
7988
}
80-
from {
81-
configurations.zipped.collect { zipTree(it) }
89+
90+
@OutputFile
91+
final Provider<File> serverXmlFile = project.providers.provider { extractDir.get().file("wlp/usr/servers/defaultServer/server.xml").asFile }
92+
93+
UnpackOpenLiberty() {
94+
from project.zipTree(configurationName.map {project.configurations.named(it).map { it.singleFile } })
95+
eachFile { FileCopyDetails fcd ->
96+
fcd.path = fcd.path.replaceAll(/\/templates\/(servers\/defaultServer\/.+)/, '/usr/$1')
97+
}
98+
into extractDir
8299
}
83-
eachFile { fcd ->
84-
fcd.path = fcd.path.replaceAll(/\/templates\/(servers\/defaultServer\/.+)/, '/usr/$1')
100+
}
101+
102+
def webappCopyJars = tasks.register('webappCopyJars', Sync) {
103+
from configurations.named("webappRuntimeClasspath").map { Configuration config ->
104+
config.filter { file ->
105+
file.name.endsWith('.jar')
106+
}
85107
}
86-
into extractDir
87-
outputs.file ext.serverXmlFile
108+
109+
into openlibertyHomeDir.map { it.dir("$testWebAppDir/WEB-INF/lib") }
88110
}
89-
[test, forkedTest]*.dependsOn webappClasses, installOpenLibertyDeps
90-
[test, forkedTest].each {
91-
it.configure {
92-
jvmArgs += ["-Dserver.xml=${installOpenLibertyDeps.serverXmlFile.absoluteFile}"]
111+
112+
tasks.named('filterLogbackClassic', Sync) {
113+
from configurations.named("testLogging").map {
114+
it.filter {
115+
it.name.contains('logback-')
116+
}.collect {zipTree(it) }
93117
}
118+
119+
exclude 'META-INF/**'
120+
into project.layout.buildDirectory.dir('tmp/filteredLogback')
94121
}
95122

96-
tasks.register('webappCopyJars', Sync) {
97-
from configurations.webappRuntimeClasspath.findAll { it.name.endsWith('.jar') }
98-
into project.layout.buildDirectory.dir("$relAppDir/WEB-INF/lib")
99-
dependsOn ':dd-java-agent:instrumentation:servlet:request-3:testFixturesJar'
123+
["test", "forkedTest"].each {
124+
tasks.named(it, Test) {
125+
dependsOn(
126+
"webappClasses",
127+
unpackOpenLiberty,
128+
webappCopyJars,
129+
filterLogbackClassic
130+
)
131+
jvmArgumentProviders.add(new CommandLineArgumentProvider() {
132+
@Override
133+
Iterable<String> asArguments() {
134+
return unpackOpenLiberty.map {["-Dserver.xml=${it.serverXmlFile.get().absolutePath}"] }.get()
135+
}
136+
})
137+
}
100138
}
101-
[test, forkedTest]*.dependsOn webappCopyJars
102139

103-
tasks.register('filterLogbackClassic', Sync) {
104-
ext.filteredLogbackDir = project.layout.buildDirectory.dir('filteredLogback')
105-
from configurations.testLogging
106-
.findAll { it.name.contains('logback-') }
107-
.collect { zipTree(it) }
108-
exclude 'META-INF/**'
109-
into ext.filteredLogbackDir
140+
tasks.named("forbiddenApisWebapp") {
141+
enabled = false
110142
}
111-
[test, forkedTest]*.dependsOn filterLogbackClassic

0 commit comments

Comments
 (0)