Skip to content

Commit 182ce98

Browse files
committed
Add Jetty 8.x integration tests for multipart body and filenames
- Add Jetty8LatestDepForkedTest: runs against Jetty 8.x (latestDepForkedTest task) and enables testBodyMultipart/testBodyFilenames coverage. Gated by 'test.dd.filenames' system property so it is skipped when running against Jetty 7.6. - Add testCompileOnly dep on org.eclipse.jetty.orbit:javax.servlet so MultipartConfigElement compiles without pulling in the excluded javax.servlet:javax.servlet-api artifact. - Fix ParameterCollector.put to accept (Object, Object) and cast internally: Jetty 8.x MultiMap.add uses (Object, Object) descriptor while Jetty 9.x uses (String, Object), so the ASM bytecode visitor was silently skipping all form field captures on Jetty 8. - Update GetPartsMethodVisitor to match both (String,Object) and (Object,Object) MultiMap.add descriptors and emit the INVOKEINTERFACE with (Object, Object).
1 parent 52c5cb8 commit 182ce98

File tree

5 files changed

+146
-35
lines changed

5 files changed

+146
-35
lines changed

dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-8.1.3/src/main/java/datadog/trace/instrumentation/jetty8/ParameterCollector.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
public interface ParameterCollector {
1010
boolean isEmpty();
1111

12-
void put(String key, String value);
12+
// Takes Object to accommodate both Jetty 8.x (MultiMap.add(Object,Object)) and
13+
// Jetty 9.x (MultiMap.add(String,Object)) bytecode call sites.
14+
void put(Object key, Object value);
1315

1416
Map<String, List<String>> getMap();
1517

@@ -24,7 +26,7 @@ public boolean isEmpty() {
2426
}
2527

2628
@Override
27-
public void put(String key, String value) {}
29+
public void put(Object key, Object value) {}
2830

2931
@Override
3032
public Map<String, List<String>> getMap() {
@@ -39,16 +41,19 @@ public boolean isEmpty() {
3941
return map == null;
4042
}
4143

42-
public void put(String key, String value) {
44+
public void put(Object key, Object value) {
45+
if (!(key instanceof String) || !(value instanceof String)) {
46+
return;
47+
}
4348
if (map == null) {
4449
map = new HashMap<>();
4550
}
4651
List<String> strings = map.get(key);
4752
if (strings == null) {
4853
strings = new ArrayList<>();
49-
map.put(key, strings);
54+
map.put((String) key, strings);
5055
}
51-
strings.add(value);
56+
strings.add((String) value);
5257
}
5358

5459
@Override

dd-java-agent/instrumentation/jetty/jetty-appsec/jetty-appsec-8.1.3/src/main/java/datadog/trace/instrumentation/jetty8/RequestGetPartsInstrumentation.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,10 +313,12 @@ public GetPartsMethodVisitor(int api, MethodVisitor superMv, int collectedParams
313313
@Override
314314
public void visitMethodInsn(
315315
int opcode, String owner, String name, String descriptor, boolean isInterface) {
316+
// Match MultiMap.add() in both Jetty 8.x (Object,Object) and Jetty 9.x (String,Object).
316317
if (opcode == Opcodes.INVOKEVIRTUAL
317318
&& owner.equals("org/eclipse/jetty/util/MultiMap")
318319
&& name.equals("add")
319-
&& descriptor.equals("(Ljava/lang/String;Ljava/lang/Object;)V")) {
320+
&& (descriptor.equals("(Ljava/lang/String;Ljava/lang/Object;)V")
321+
|| descriptor.equals("(Ljava/lang/Object;Ljava/lang/Object;)V"))) {
320322
super.visitVarInsn(Opcodes.ALOAD, collectedParamsVar);
321323
// stack: ..., key, value, collParams
322324
super.visitInsn(Opcodes.DUP_X2);
@@ -329,7 +331,7 @@ public void visitMethodInsn(
329331
Opcodes.INVOKEINTERFACE,
330332
Type.getInternalName(ParameterCollector.class),
331333
"put",
332-
"(Ljava/lang/String;Ljava/lang/String;)V",
334+
"(Ljava/lang/Object;Ljava/lang/Object;)V",
333335
true);
334336
// original stack
335337
}

dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-7.6/build.gradle

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ configurations.testRuntimeOnly {
2020
exclude group: 'javax.servlet', module: 'javax.servlet-api'
2121
}
2222

23+
tasks.named('latestDepForkedTest', Test) {
24+
// Signal that we are running against Jetty 8.x so Jetty8*LatestDepForkedTest activates.
25+
systemProperty 'test.dd.filenames', 'true'
26+
}
27+
2328
dependencies {
2429
compileOnly group: 'org.eclipse.jetty', name: 'jetty-server', version: '7.6.0.v20120127'
2530
implementation project(':dd-java-agent:instrumentation:jetty:jetty-common')
@@ -34,8 +39,14 @@ dependencies {
3439
testImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '7.6.0.v20120127'
3540
testImplementation group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '7.6.0.v20120127'
3641
testImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0'))
42+
// Needed to compile Jetty8LatestDepForkedTest (provides MultipartConfigElement).
43+
// Uses the Orbit repackaging so it is not caught by the javax.servlet:javax.servlet-api exclusion.
44+
// Compile-only: the Orbit jar is provided at runtime by Jetty 8.x in the latestDepForkedTest.
45+
testCompileOnly group: 'org.eclipse.jetty.orbit', name: 'javax.servlet', version: '3.0.0.v201112011016'
3746
testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-2.2')
3847
testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-7.0')
48+
// Activated only on Jetty 8.x (muzzle rejects it for 7.6)
49+
testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-8.1.3')
3950

4051
latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '8.+'
4152
latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '8.+'

dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-7.6/gradle.lockfile

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
# This is a Gradle generated file for dependency locking.
22
# Manual edits can break the build and are not advised.
33
# This file is expected to be part of source control.
4-
cafe.cryptography:curve25519-elisabeth:0.1.0=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
5-
cafe.cryptography:ed25519-elisabeth:0.1.0=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
4+
cafe.cryptography:curve25519-elisabeth:0.1.0=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
5+
cafe.cryptography:ed25519-elisabeth:0.1.0=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
66
ch.qos.logback:logback-classic:1.2.13=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
77
ch.qos.logback:logback-core:1.2.13=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
88
com.blogspot.mydailyjava:weak-lock-free:0.17=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
9-
com.datadoghq.okhttp3:okhttp:3.12.15=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
10-
com.datadoghq.okio:okio:1.17.6=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
9+
com.datadoghq.okhttp3:okhttp:3.12.15=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
10+
com.datadoghq.okio:okio:1.17.6=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
1111
com.datadoghq:dd-instrument-java:0.0.3=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
1212
com.datadoghq:dd-javac-plugin-client:0.2.2=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
13-
com.datadoghq:java-dogstatsd-client:4.4.3=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
14-
com.datadoghq:sketches-java:0.8.3=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
13+
com.datadoghq:java-dogstatsd-client:4.4.3=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
14+
com.datadoghq:sketches-java:0.8.3=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
1515
com.github.javaparser:javaparser-core:3.25.6=codenarc
16-
com.github.jnr:jffi:1.3.14=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
17-
com.github.jnr:jnr-a64asm:1.0.0=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
18-
com.github.jnr:jnr-constants:0.10.4=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
19-
com.github.jnr:jnr-enxio:0.32.19=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
20-
com.github.jnr:jnr-ffi:2.2.18=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
21-
com.github.jnr:jnr-posix:3.1.21=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
22-
com.github.jnr:jnr-unixsocket:0.38.24=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
23-
com.github.jnr:jnr-x86asm:1.0.2=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
16+
com.github.jnr:jffi:1.3.14=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
17+
com.github.jnr:jnr-a64asm:1.0.0=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
18+
com.github.jnr:jnr-constants:0.10.4=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
19+
com.github.jnr:jnr-enxio:0.32.19=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
20+
com.github.jnr:jnr-ffi:2.2.18=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
21+
com.github.jnr:jnr-posix:3.1.21=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
22+
com.github.jnr:jnr-unixsocket:0.38.24=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
23+
com.github.jnr:jnr-x86asm:1.0.2=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
2424
com.github.spotbugs:spotbugs-annotations:4.9.8=compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,spotbugs,testCompileClasspath,testRuntimeClasspath
2525
com.github.spotbugs:spotbugs:4.9.8=spotbugs
2626
com.github.stephenc.jcip:jcip-annotations:1.0-1=spotbugs
@@ -36,11 +36,11 @@ com.google.guava:guava:20.0=latestDepForkedTestCompileClasspath,latestDepForkedT
3636
com.google.guava:guava:32.0.1-jre=annotationProcessor,latestDepForkedTestAnnotationProcessor,testAnnotationProcessor
3737
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=annotationProcessor,latestDepForkedTestAnnotationProcessor,testAnnotationProcessor
3838
com.google.j2objc:j2objc-annotations:2.8=annotationProcessor,latestDepForkedTestAnnotationProcessor,testAnnotationProcessor
39-
com.google.re2j:re2j:1.7=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
40-
com.squareup.moshi:moshi:1.11.0=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
39+
com.google.re2j:re2j:1.7=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
40+
com.squareup.moshi:moshi:1.11.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
4141
com.squareup.okhttp3:logging-interceptor:3.12.12=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
4242
com.squareup.okhttp3:okhttp:3.12.12=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
43-
com.squareup.okio:okio:1.17.5=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
43+
com.squareup.okio:okio:1.17.5=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
4444
com.thoughtworks.qdox:qdox:1.12.1=codenarc
4545
commons-fileupload:commons-fileupload:1.5=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
4646
commons-io:commons-io:2.11.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
@@ -53,8 +53,8 @@ jaxen:jaxen:2.0.0=spotbugs
5353
junit:junit:4.13.2=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
5454
net.bytebuddy:byte-buddy-agent:1.18.3=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
5555
net.bytebuddy:byte-buddy:1.18.3=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
56-
net.java.dev.jna:jna-platform:5.8.0=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
57-
net.java.dev.jna:jna:5.8.0=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
56+
net.java.dev.jna:jna-platform:5.8.0=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
57+
net.java.dev.jna:jna:5.8.0=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
5858
net.sf.saxon:Saxon-HE:12.9=spotbugs
5959
org.apache.ant:ant-antlr:1.10.14=codenarc
6060
org.apache.ant:ant-junit:1.10.14=codenarc
@@ -76,7 +76,7 @@ org.codehaus.groovy:groovy:3.0.23=codenarc
7676
org.codehaus.groovy:groovy:3.0.25=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
7777
org.codenarc:CodeNarc:3.7.0=codenarc
7878
org.dom4j:dom4j:2.2.0=spotbugs
79-
org.eclipse.jetty.orbit:javax.servlet:3.0.0.v201112011016=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestImplementation
79+
org.eclipse.jetty.orbit:javax.servlet:3.0.0.v201112011016=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestImplementation,testCompileClasspath
8080
org.eclipse.jetty:jetty-continuation:7.6.0.v20120127=compileClasspath,testCompileClasspath,testRuntimeClasspath
8181
org.eclipse.jetty:jetty-continuation:8.2.0.v20160908=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,latestDepTestImplementation
8282
org.eclipse.jetty:jetty-http:7.6.0.v20120127=compileClasspath,testCompileClasspath,testRuntimeClasspath
@@ -94,8 +94,8 @@ org.eclipse.jetty:jetty-util:8.2.0.v20160908=latestDepForkedTestCompileClasspath
9494
org.gmetrics:GMetrics:2.1.0=codenarc
9595
org.hamcrest:hamcrest-core:1.3=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
9696
org.hamcrest:hamcrest:3.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
97-
org.jctools:jctools-core-jdk11:4.0.6=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
98-
org.jctools:jctools-core:4.0.6=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
97+
org.jctools:jctools-core-jdk11:4.0.6=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
98+
org.jctools:jctools-core:4.0.6=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
9999
org.junit.jupiter:junit-jupiter-api:5.14.1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
100100
org.junit.jupiter:junit-jupiter-engine:5.14.1=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
101101
org.junit.jupiter:junit-jupiter-params:5.14.1=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
@@ -111,19 +111,16 @@ org.junit:junit-bom:5.14.1=latestDepForkedTestCompileClasspath,latestDepForkedTe
111111
org.mockito:mockito-core:4.4.0=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
112112
org.objenesis:objenesis:3.3=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
113113
org.opentest4j:opentest4j:1.3.0=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
114-
org.ow2.asm:asm-analysis:9.7.1=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
114+
org.ow2.asm:asm-analysis:9.7.1=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
115115
org.ow2.asm:asm-analysis:9.9=spotbugs
116-
org.ow2.asm:asm-commons:9.7.1=buildTimeInstrumentationPlugin,muzzleTooling,runtimeClasspath
117116
org.ow2.asm:asm-commons:9.9=spotbugs
118117
org.ow2.asm:asm-commons:9.9.1=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
119-
org.ow2.asm:asm-tree:9.7.1=buildTimeInstrumentationPlugin,muzzleTooling,runtimeClasspath
120118
org.ow2.asm:asm-tree:9.9=spotbugs
121119
org.ow2.asm:asm-tree:9.9.1=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
122-
org.ow2.asm:asm-util:9.7.1=buildTimeInstrumentationPlugin,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath
120+
org.ow2.asm:asm-util:9.7.1=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
123121
org.ow2.asm:asm-util:9.9=spotbugs
124-
org.ow2.asm:asm:9.7.1=buildTimeInstrumentationPlugin,muzzleTooling,runtimeClasspath
125122
org.ow2.asm:asm:9.9=spotbugs
126-
org.ow2.asm:asm:9.9.1=latestDepForkedTestRuntimeClasspath,testRuntimeClasspath
123+
org.ow2.asm:asm:9.9.1=buildTimeInstrumentationPlugin,compileClasspath,latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath
127124
org.slf4j:jcl-over-slf4j:1.7.30=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
128125
org.slf4j:jul-to-slf4j:1.7.30=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
129126
org.slf4j:log4j-over-slf4j:1.7.30=latestDepForkedTestCompileClasspath,latestDepForkedTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath

0 commit comments

Comments
 (0)