-
Notifications
You must be signed in to change notification settings - Fork 319
Make CSI plugin collect too much classpaths #9985
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
BenchmarksStartupParameters
See matching parameters
SummaryFound 0 performance improvements and 0 performance regressions! Performance is the same for 58 metrics, 7 unstable metrics. Startup time reports for insecure-bankgantt
title insecure-bank - global startup overhead: candidate=1.56.0-SNAPSHOT~c84d247d72, baseline=1.56.0-SNAPSHOT~5adec51856
dateFormat X
axisFormat %s
section tracing
Agent [baseline] (1.101 s) : 0, 1100515
Total [baseline] (8.877 s) : 0, 8877084
Agent [candidate] (1.097 s) : 0, 1096590
Total [candidate] (8.842 s) : 0, 8841846
section iast
Agent [baseline] (1.235 s) : 0, 1235048
Total [baseline] (9.539 s) : 0, 9539258
Agent [candidate] (1.246 s) : 0, 1246224
Total [candidate] (9.598 s) : 0, 9597517
gantt
title insecure-bank - break down per module: candidate=1.56.0-SNAPSHOT~c84d247d72, baseline=1.56.0-SNAPSHOT~5adec51856
dateFormat X
axisFormat %s
section tracing
crashtracking [baseline] (1.483 ms) : 0, 1483
crashtracking [candidate] (1.451 ms) : 0, 1451
BytebuddyAgent [baseline] (706.21 ms) : 0, 706210
BytebuddyAgent [candidate] (703.778 ms) : 0, 703778
GlobalTracer [baseline] (249.351 ms) : 0, 249351
GlobalTracer [candidate] (248.682 ms) : 0, 248682
AppSec [baseline] (32.335 ms) : 0, 32335
AppSec [candidate] (32.144 ms) : 0, 32144
Debugger [baseline] (63.622 ms) : 0, 63622
Debugger [candidate] (63.351 ms) : 0, 63351
Remote Config [baseline] (644.47 µs) : 0, 644
Remote Config [candidate] (625.119 µs) : 0, 625
Telemetry [baseline] (8.205 ms) : 0, 8205
Telemetry [candidate] (8.093 ms) : 0, 8093
Flare Poller [baseline] (3.741 ms) : 0, 3741
Flare Poller [candidate] (3.639 ms) : 0, 3639
section iast
crashtracking [baseline] (1.466 ms) : 0, 1466
crashtracking [candidate] (1.449 ms) : 0, 1449
BytebuddyAgent [baseline] (827.211 ms) : 0, 827211
BytebuddyAgent [candidate] (835.438 ms) : 0, 835438
GlobalTracer [baseline] (238.055 ms) : 0, 238055
GlobalTracer [candidate] (239.052 ms) : 0, 239052
AppSec [baseline] (34.099 ms) : 0, 34099
AppSec [candidate] (33.809 ms) : 0, 33809
Debugger [baseline] (60.013 ms) : 0, 60013
Debugger [candidate] (60.742 ms) : 0, 60742
Remote Config [baseline] (543.78 µs) : 0, 544
Remote Config [candidate] (573.332 µs) : 0, 573
Telemetry [baseline] (7.675 ms) : 0, 7675
Telemetry [candidate] (7.801 ms) : 0, 7801
Flare Poller [baseline] (3.458 ms) : 0, 3458
Flare Poller [candidate] (3.55 ms) : 0, 3550
IAST [baseline] (27.555 ms) : 0, 27555
IAST [candidate] (28.828 ms) : 0, 28828
Startup time reports for petclinicgantt
title petclinic - global startup overhead: candidate=1.56.0-SNAPSHOT~c84d247d72, baseline=1.56.0-SNAPSHOT~5adec51856
dateFormat X
axisFormat %s
section tracing
Agent [baseline] (1.1 s) : 0, 1099519
Total [baseline] (10.737 s) : 0, 10737402
Agent [candidate] (1.099 s) : 0, 1099224
Total [candidate] (10.743 s) : 0, 10743099
section appsec
Agent [baseline] (1.278 s) : 0, 1278484
Total [baseline] (10.942 s) : 0, 10942395
Agent [candidate] (1.286 s) : 0, 1285822
Total [candidate] (11.041 s) : 0, 11040661
section iast
Agent [baseline] (1.239 s) : 0, 1239165
Total [baseline] (11.294 s) : 0, 11294368
Agent [candidate] (1.241 s) : 0, 1241439
Total [candidate] (11.192 s) : 0, 11192266
section profiling
Agent [baseline] (1.238 s) : 0, 1238129
Total [baseline] (11.06 s) : 0, 11059706
Agent [candidate] (1.226 s) : 0, 1226317
Total [candidate] (11.035 s) : 0, 11035185
gantt
title petclinic - break down per module: candidate=1.56.0-SNAPSHOT~c84d247d72, baseline=1.56.0-SNAPSHOT~5adec51856
dateFormat X
axisFormat %s
section tracing
crashtracking [baseline] (1.462 ms) : 0, 1462
crashtracking [candidate] (1.458 ms) : 0, 1458
BytebuddyAgent [baseline] (704.575 ms) : 0, 704575
BytebuddyAgent [candidate] (705.202 ms) : 0, 705202
GlobalTracer [baseline] (249.133 ms) : 0, 249133
GlobalTracer [candidate] (248.771 ms) : 0, 248771
AppSec [baseline] (32.219 ms) : 0, 32219
AppSec [candidate] (32.208 ms) : 0, 32208
Debugger [baseline] (64.741 ms) : 0, 64741
Debugger [candidate] (64.253 ms) : 0, 64253
Remote Config [baseline] (643.445 µs) : 0, 643
Remote Config [candidate] (628.046 µs) : 0, 628
Telemetry [baseline] (8.19 ms) : 0, 8190
Telemetry [candidate] (8.179 ms) : 0, 8179
Flare Poller [baseline] (3.678 ms) : 0, 3678
Flare Poller [candidate] (3.703 ms) : 0, 3703
section appsec
crashtracking [baseline] (1.452 ms) : 0, 1452
crashtracking [candidate] (1.467 ms) : 0, 1467
BytebuddyAgent [baseline] (728.777 ms) : 0, 728777
BytebuddyAgent [candidate] (733.039 ms) : 0, 733039
GlobalTracer [baseline] (240.562 ms) : 0, 240562
GlobalTracer [candidate] (241.361 ms) : 0, 241361
IAST [baseline] (24.774 ms) : 0, 24774
IAST [candidate] (24.881 ms) : 0, 24881
AppSec [baseline] (174.469 ms) : 0, 174469
AppSec [candidate] (175.234 ms) : 0, 175234
Debugger [baseline] (60.526 ms) : 0, 60526
Debugger [candidate] (61.926 ms) : 0, 61926
Remote Config [baseline] (673.458 µs) : 0, 673
Remote Config [candidate] (677.578 µs) : 0, 678
Telemetry [baseline] (8.304 ms) : 0, 8304
Telemetry [candidate] (8.274 ms) : 0, 8274
Flare Poller [baseline] (3.862 ms) : 0, 3862
Flare Poller [candidate] (3.793 ms) : 0, 3793
section iast
crashtracking [baseline] (1.456 ms) : 0, 1456
crashtracking [candidate] (1.49 ms) : 0, 1490
BytebuddyAgent [baseline] (829.599 ms) : 0, 829599
BytebuddyAgent [candidate] (832.469 ms) : 0, 832469
GlobalTracer [baseline] (238.35 ms) : 0, 238350
GlobalTracer [candidate] (238.072 ms) : 0, 238072
IAST [baseline] (28.266 ms) : 0, 28266
IAST [candidate] (30.061 ms) : 0, 30061
AppSec [baseline] (33.522 ms) : 0, 33522
AppSec [candidate] (31.584 ms) : 0, 31584
Debugger [baseline] (61.059 ms) : 0, 61059
Debugger [candidate] (60.951 ms) : 0, 60951
Remote Config [baseline] (558.379 µs) : 0, 558
Remote Config [candidate] (549.904 µs) : 0, 550
Telemetry [baseline] (7.723 ms) : 0, 7723
Telemetry [candidate] (7.648 ms) : 0, 7648
Flare Poller [baseline] (3.524 ms) : 0, 3524
Flare Poller [candidate] (3.469 ms) : 0, 3469
section profiling
crashtracking [baseline] (1.468 ms) : 0, 1468
crashtracking [candidate] (1.425 ms) : 0, 1425
BytebuddyAgent [baseline] (736.221 ms) : 0, 736221
BytebuddyAgent [candidate] (729.338 ms) : 0, 729338
GlobalTracer [baseline] (223.772 ms) : 0, 223772
GlobalTracer [candidate] (221.801 ms) : 0, 221801
AppSec [baseline] (32.641 ms) : 0, 32641
AppSec [candidate] (32.123 ms) : 0, 32123
Debugger [baseline] (63.414 ms) : 0, 63414
Debugger [candidate] (62.804 ms) : 0, 62804
Remote Config [baseline] (661.749 µs) : 0, 662
Remote Config [candidate] (650.259 µs) : 0, 650
Telemetry [baseline] (8.109 ms) : 0, 8109
Telemetry [candidate] (7.949 ms) : 0, 7949
Flare Poller [baseline] (3.83 ms) : 0, 3830
Flare Poller [candidate] (3.762 ms) : 0, 3762
ProfilingAgent [baseline] (97.701 ms) : 0, 97701
ProfilingAgent [candidate] (96.705 ms) : 0, 96705
Profiling [baseline] (98.301 ms) : 0, 98301
Profiling [candidate] (97.293 ms) : 0, 97293
LoadParameters
See matching parameters
SummaryFound 1 performance improvements and 3 performance regressions! Performance is the same for 16 metrics, 16 unstable metrics.
Request duration reports for insecure-bankgantt
title insecure-bank - request duration [CI 0.99] : candidate=1.56.0-SNAPSHOT~c84d247d72, baseline=1.56.0-SNAPSHOT~5adec51856
dateFormat X
axisFormat %s
section baseline
no_agent (1.196 ms) : 1184, 1207
. : milestone, 1196,
iast (3.225 ms) : 3181, 3268
. : milestone, 3225,
iast_FULL (5.766 ms) : 5710, 5823
. : milestone, 5766,
iast_GLOBAL (3.568 ms) : 3509, 3628
. : milestone, 3568,
profiling (1.999 ms) : 1983, 2016
. : milestone, 1999,
tracing (1.802 ms) : 1787, 1817
. : milestone, 1802,
section candidate
no_agent (1.216 ms) : 1204, 1228
. : milestone, 1216,
iast (3.293 ms) : 3243, 3343
. : milestone, 3293,
iast_FULL (6.252 ms) : 6129, 6374
. : milestone, 6252,
iast_GLOBAL (3.721 ms) : 3671, 3772
. : milestone, 3721,
profiling (1.968 ms) : 1952, 1984
. : milestone, 1968,
tracing (1.803 ms) : 1788, 1818
. : milestone, 1803,
Request duration reports for petclinicgantt
title petclinic - request duration [CI 0.99] : candidate=1.56.0-SNAPSHOT~c84d247d72, baseline=1.56.0-SNAPSHOT~5adec51856
dateFormat X
axisFormat %s
section baseline
no_agent (18.237 ms) : 18051, 18424
. : milestone, 18237,
appsec (18.628 ms) : 18437, 18818
. : milestone, 18628,
code_origins (17.841 ms) : 17662, 18019
. : milestone, 17841,
iast (18.205 ms) : 18021, 18390
. : milestone, 18205,
profiling (18.736 ms) : 18546, 18926
. : milestone, 18736,
tracing (17.691 ms) : 17517, 17864
. : milestone, 17691,
section candidate
no_agent (18.966 ms) : 18774, 19157
. : milestone, 18966,
appsec (18.624 ms) : 18436, 18812
. : milestone, 18624,
code_origins (17.719 ms) : 17544, 17895
. : milestone, 17719,
iast (17.683 ms) : 17504, 17861
. : milestone, 17683,
profiling (18.556 ms) : 18368, 18744
. : milestone, 18556,
tracing (17.501 ms) : 17325, 17676
. : milestone, 17501,
DacapoParameters
See matching parameters
SummaryFound 0 performance improvements and 0 performance regressions! Performance is the same for 11 metrics, 1 unstable metrics. Execution time for tomcatgantt
title tomcat - execution time [CI 0.99] : candidate=1.56.0-SNAPSHOT~c84d247d72, baseline=1.56.0-SNAPSHOT~5adec51856
dateFormat X
axisFormat %s
section baseline
no_agent (1.481 ms) : 1469, 1493
. : milestone, 1481,
appsec (3.687 ms) : 3471, 3902
. : milestone, 3687,
iast (2.23 ms) : 2165, 2295
. : milestone, 2230,
iast_GLOBAL (2.259 ms) : 2194, 2324
. : milestone, 2259,
profiling (2.076 ms) : 2024, 2129
. : milestone, 2076,
tracing (2.048 ms) : 1997, 2098
. : milestone, 2048,
section candidate
no_agent (1.485 ms) : 1474, 1497
. : milestone, 1485,
appsec (3.755 ms) : 3534, 3975
. : milestone, 3755,
iast (2.231 ms) : 2166, 2296
. : milestone, 2231,
iast_GLOBAL (2.269 ms) : 2204, 2334
. : milestone, 2269,
profiling (2.101 ms) : 2046, 2155
. : milestone, 2101,
tracing (2.052 ms) : 2001, 2104
. : milestone, 2052,
Execution time for biojavagantt
title biojava - execution time [CI 0.99] : candidate=1.56.0-SNAPSHOT~c84d247d72, baseline=1.56.0-SNAPSHOT~5adec51856
dateFormat X
axisFormat %s
section baseline
no_agent (15.066 s) : 15066000, 15066000
. : milestone, 15066000,
appsec (15.183 s) : 15183000, 15183000
. : milestone, 15183000,
iast (18.639 s) : 18639000, 18639000
. : milestone, 18639000,
iast_GLOBAL (18.082 s) : 18082000, 18082000
. : milestone, 18082000,
profiling (14.836 s) : 14836000, 14836000
. : milestone, 14836000,
tracing (14.822 s) : 14822000, 14822000
. : milestone, 14822000,
section candidate
no_agent (15.372 s) : 15372000, 15372000
. : milestone, 15372000,
appsec (14.651 s) : 14651000, 14651000
. : milestone, 14651000,
iast (17.944 s) : 17944000, 17944000
. : milestone, 17944000,
iast_GLOBAL (18.008 s) : 18008000, 18008000
. : milestone, 18008000,
profiling (14.723 s) : 14723000, 14723000
. : milestone, 14723000,
tracing (15.044 s) : 15044000, 15044000
. : milestone, 15044000,
|
|
🎯 Code Coverage 🔗 Commit SHA: c84d247 | Docs | Datadog PR Page | Was this helpful? Give us feedback! |
…time configurations.
The 'instrument' plugin changes destination around for now, it needs to be depended on for the time being.
8022770 to
f2f5205
Compare
This forced to apply patching in afterEvaluate, instead, it's easier and cleaner to add the csi output as dependency in the appropriate configuration.
…sformation to string
365af7b to
16f82db
Compare
16f82db to
dea2a7c
Compare
| /** | ||
| * The paths used to look for the call site instrumenter dependencies. | ||
| * | ||
| * The plugin includes by default **only** the `main` and `test` source sets, and their | ||
| * related compilation classpath. As we don't want other test configurations by default. | ||
| * | ||
| * However, it's possible to contribute additional paths to look for dependencies. | ||
| */ | ||
| val additionalPaths: ConfigurableFileCollection = objectFactory.fileCollection() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
note: Before the csi plugin consumed all test configurations, which forced to resolved all jvm test suites configurations. Now that the csi plugin is now restricted to the standard main and test, a way is needed to provide additional paths to the call site instrumenter generator.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This file was moved from datadog/gradle/plugin to datadog/gradle/plugin/csi
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Extracted from datadog/gradle/plugin/CallSiteInstrumentationPlugin.kt
| configureSourceSets(project, csiExtension) | ||
| registerGenerateCallSiteTask(project, csiExtension, project.tasks.named<AbstractCompile>("compileJava")) | ||
| configureTestConfigurations(project, csiExtension) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
note: Before this happened in project.afterEvaluate phase which is suboptimal. This was working because it was patching some task classpath very late, but prevented other avoidance tricks that Gradle could provide.
Instead to make other task aware of the csi output one has to use configurations, see configureTestConfigurations.
| get() = project.configurations.matching { | ||
| // Includes all main* source sets, but only the test (as wee don;t want other ) | ||
| // * For main => runtimeClasspath, compileClasspath | ||
| // * For test => testRuntimeClasspath, testCompileClasspath | ||
| // * For other main* => "main_javaXXRuntimeClasspath", "main_javaXXCompileClasspath" | ||
|
|
||
| when (it.name) { | ||
| // Regular main and test source sets | ||
| RUNTIME_CLASSPATH_CONFIGURATION_NAME, | ||
| COMPILE_CLASSPATH_CONFIGURATION_NAME, | ||
| TEST_SOURCE_SET_NAME + RUNTIME_CLASSPATH_CONFIGURATION_NAME.capitalize(), | ||
| TEST_SOURCE_SET_NAME + COMPILE_CLASSPATH_CONFIGURATION_NAME.capitalize() -> true | ||
|
|
||
| else -> false | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
note: Non greedy configurations collection by default. Before it could collect configurations (i.e. files, output folder), from many unrelated compile and test tasks.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yep, before it was trying to catch em all. Did you observe any performance improvements during configuration or execution of gradle tasks with this change?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not yet sure at this time, but since less actual dependencies are needed (in particular those in last deps and others alike), this might be faster.
But the instrument plugin I believe, and possibly other constructs hides that.
| private fun newBuildFolder(project: Project, name: String): File { | ||
| val folder = project.layout.buildDirectory.dir(name).get().asFile | ||
| if (!folder.exists()) { | ||
| if (!folder.mkdirs()) { | ||
| throw GradleException("Cannot create folder $folder") | ||
| } | ||
| } | ||
| return folder | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
note: This is non necessary to create the folder, and also this is unnecessary to convert targetFolder to a String and recreate it from here.
| project.tasks.withType(AbstractCompile::class.java).matching { | ||
| task -> task.name.startsWith("compileTest") | ||
| }.configureEach { | ||
| inputs.dir(extension.targetFolder) | ||
| classpath += project.files(targetFolder) | ||
| } | ||
| project.tasks.withType(Test::class.java).configureEach { | ||
| inputs.dir(extension.targetFolder) | ||
| classpath += project.files(targetFolder) | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
note: This works only if configureEach block is appended after everything else, i.e. in the project.afterEvaluate, which is suboptimal, this was changed to add the targetFolder as a dependency to the relevant jvm test suites.
|
|
||
| private fun createTasks(project: Project, extension: CallSiteInstrumentationExtension) { | ||
| registerGenerateCallSiteTask(project, extension, "compileJava") | ||
| val targetFolder = extension.targetFolder.get().asFile |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
note: It's usually non necessary to convert to a File, the project.files(...) understand many types. (Also many other API indicates they rely on the project.files(...) behavior it's indicated in their Javadoc)
| project.pluginManager.withPlugin("jvm-test-suite") { | ||
| project.extensions.getByType<TestingExtension>().suites.withType<JvmTestSuite>().configureEach { | ||
| project.logger.info("Configuring jvm test suite '{}' to use csiExtension.targetFolder", name) | ||
| dependencies { | ||
| compileOnly.add(project.files(csiExtension.targetFolder)) | ||
| runtimeOnly.add(project.files(csiExtension.targetFolder)) | ||
| } | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
note: This replaces the old logic that patched test compile and test task classpath. The new code reacts to any registered test suites at configuration time.
| public static URL toURL(final Path path) { | ||
| try { | ||
| return path.toUri().toURL(); | ||
| URL url = path.toUri().toURL(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice catch!
| } | ||
|
|
||
| csi { | ||
| additionalPaths.from(classPathConfiguration) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This way to extend the classpath of the generator is way cleaner, nice!
buildSrc/.kotlin/sessions/kotlin-compiler-1497087473482789025.salive
Outdated
Show resolved
Hide resolved
|
|
||
| // Remote Debug | ||
| if (project.providers.gradleProperty("debugCsiJar").isPresent) { | ||
| jvmArgs("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:5005") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
| inputs.dir(csiExtension.srcFolder) | ||
| inputs.dir(csiExtension.rootFolder).optional() | ||
| inputs.file(pluginJarFile) | ||
| inputs.property("cis.suffix", csiExtension.suffix) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch, didn't realize those should be part of the inputs
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actually, the task was already cached, but adding these property was important to invalidate already cached results, e.g. when the java version changed.
* chore: Move CSI plugin to it's own package * chore: Tweak some API to use kotlin friendly functions * fix: Restrict default CSI classpath to main and test, compile and runtime configurations. * chore: arg name rename * fix: Include the main source set output * fix: Always make sure java plugin is applied * chore: Make csi plugin not running in project.afterEvaluate * fix: Incorrect URLClassLoader initialization when url is a directory * fix: Make depends on instrument task The 'instrument' plugin changes destination around for now, it needs to be depended on for the time being. * chore: Refactor additional configurations to a `ConfigurableFileCollection` * fix: extension property should not be queried at configuration time * style: Reformat * fix: call site plugin still has to add entries to classpath after jvm test suite ran * chore: code tweaks * fix: generateCallSite was missing a few input properties for up-date checks * fix: csi plugin was patching test compile and test task classpath This forced to apply patching in afterEvaluate, instead, it's easier and cleaner to add the csi output as dependency in the appropriate configuration. * fix: unnecessary targetFolder directory creation and unnecessary transformation to string * chore: Readability of CallSiteUtils::toURL * typo: inout property type * fix: Exclude Kotlin compiler daemon files
What Does This Do
Refactors the call-site-instrumentation plugin that collected too much classpath, by querying tasks classpath, which may create various problems (like conflicting dependency resolution because they end-up in the same bucket).
Instead, this PR tries to make the csi plugin collect the minimum (
mainandtest). Also, instead of querying tasks, it gather classpath via project'sconfigurations. If something non standard is needed it makes it explicit via.This change exposed a bug in the way the csi plugin was setting up its type resolution classpath. It uses a
URLClassLoader, however since the collected path is much more restricted, some compiled types exists in folders, andURLClassLoaderrequires a directory URL to end by a slash (/) otherwise it assumes the URL points to a jar even if it is actually a directory, this resulted in types not found at generation time.Also, this plugins applies its changes during
project.afterEvaluate, this has an unfortunate effect of theafterEvaluateand required to patch the classpath of some test related tasks directly. This is replaced a more appropriate declaration of a dependency in the appropriate configuration.Other cleanups were added.
Motivation
Quality of life, correctness.
Follow-up
Related to
Additional Notes
Contributor Checklist
type:and (comp:orinst:) labels in addition to any useful labelsclose,fixor any linking keywords when referencing an issue.Use
solvesinstead, and assign the PR milestone to the issueJira ticket: [PROJ-IDENT]