Skip to content

Commit 99e2c1c

Browse files
authored
Remove netty transport, rework shading (#1307)
* Remove Netty transport from docker-java * Remove Netty transport from docker-java, rework the shading config * exclude public API dependencies from the shaded ones * encode filter's key, remove `okhttp` stage * fix the jupiter tests * fix the spock tests
1 parent 5109f4c commit 99e2c1c

File tree

10 files changed

+94
-392
lines changed

10 files changed

+94
-392
lines changed

build.gradle

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -56,32 +56,17 @@ subprojects {
5656
configurations = []
5757
classifier = null
5858

59-
relocate('META-INF/native/libnetty', 'META-INF/native/liborg-testcontainers-shaded-netty')
60-
61-
[
62-
"org.apache.http",
63-
"org.apache.commons.lang",
64-
"org.apache.commons.io",
65-
"org.apache.commons.codec",
66-
"org.glassfish",
67-
"org.aopalliance",
68-
"org.jvnet",
69-
"javax.annotation",
70-
"javax.inject",
71-
"javax.ws.rs",
72-
"com.fasterxml.jackson",
73-
"jersey.repackaged",
74-
"com.google",
75-
"io.netty",
76-
"org.bouncycastle",
77-
"org.zeroturnaround",
78-
"okhttp3",
79-
"okio",
80-
"org.scalasbt.ipcsocket",
81-
"com.trilead.ssh2",
82-
].each { relocate(it, "org.testcontainers.shaded.$it") }
59+
// Keep docker-java's package inside the final jar
60+
relocate("com.github.dockerjava", "com.github.dockerjava")
8361
}
8462

63+
task relocateShadowJar(type: com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation) {
64+
target = tasks.shadowJar
65+
prefix = "org.testcontainers.shaded"
66+
}
67+
68+
tasks.shadowJar.dependsOn tasks.relocateShadowJar
69+
8570
publishing {
8671
publications {
8772
mavenJava(MavenPublication) { publication ->

core/build.gradle

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ shadowJar {
2121
exclude 'org/newsclub/**'
2222

2323
[
24-
'META-INF/io.netty.versions.properties',
2524
'META-INF/NOTICE',
2625
'META-INF/NOTICE.txt',
2726
'META-INF/LICENSE',
@@ -33,31 +32,16 @@ shadowJar {
3332
'META-INF/services/com.fasterxml.jackson.core.*',
3433
'META-INF/services/com.github.dockerjava.api.command.*',
3534
'META-INF/services/javax.ws.rs.ext.*',
36-
'META-INF/services/org.glassfish.hk2.extension.*',
37-
'META-INF/services/org.jvnet.hk2.external.generator.*',
38-
'META-INF/services/org.glassfish.jersey.internal.spi.*',
3935
'META-INF/services/java.security.Provider',
4036
'mozilla/public-suffix-list.txt',
4137
].each { exclude(it) }
4238

43-
dependencies {
44-
include(dependency('org.apache.httpcomponents:.*'))
45-
include(dependency('org.glassfish.*:.*'))
46-
include(dependency('org.aopalliance.*:.*'))
47-
include(dependency('javax.ws.rs:.*'))
48-
include(dependency('com.fasterxml.*:.*'))
49-
include(dependency('com.github.docker-java:.*'))
50-
include(dependency('com.google.guava:.*'))
51-
include(dependency('io.netty:.*'))
52-
include(dependency('org.bouncycastle:.*'))
53-
include(dependency('org.zeroturnaround:zt-exec'))
54-
include(dependency('commons-lang:commons-lang'))
55-
include(dependency('commons-io:commons-io'))
56-
include(dependency('commons-codec:commons-codec'))
57-
include(dependency('com.squareup.okhttp3:.*'))
58-
include(dependency('com.squareup.okio:.*'))
59-
include(dependency('org.scala-sbt.ipcsocket:ipcsocket'))
60-
include(dependency('org.glassfish.main.external:trilead-ssh2-repackaged'))
39+
project.afterEvaluate {
40+
dependencies {
41+
for (id in project.configurations.compile.resolvedConfiguration.resolvedArtifacts*.moduleVersion*.id) {
42+
exclude(dependency("${id.group}:${id.name}"))
43+
}
44+
}
6145
}
6246
}
6347

@@ -98,25 +82,25 @@ dependencies {
9882
shaded ('com.github.docker-java:docker-java:3.1.0-rc-4') {
9983
exclude(group: 'org.glassfish.jersey.core')
10084
exclude(group: 'org.glassfish.jersey.connectors')
85+
exclude(group: 'org.glassfish.jersey.inject')
10186
exclude(group: 'log4j')
10287
exclude(group: 'com.google.code.findbug')
10388
exclude(group: 'com.kohlschutter.junixsocket')
89+
exclude(group: 'io.netty')
90+
exclude(group: 'org.apache.httpcomponents')
91+
exclude(group: 'org.slf4j')
92+
exclude(group: 'org.apache.commons', module: 'commons-compress')
10493
}
94+
10595
shaded 'com.squareup.okhttp3:okhttp:3.12.1'
10696

10797
shaded 'org.glassfish.main.external:trilead-ssh2-repackaged:4.1.2'
10898

109-
shaded 'javax.ws.rs:javax.ws.rs-api:2.0.1'
110-
shaded 'org.zeroturnaround:zt-exec:1.10'
111-
shaded 'commons-lang:commons-lang:2.6'
112-
shaded 'commons-io:commons-io:2.6'
113-
shaded 'commons-codec:commons-codec:1.12'
114-
// docker-java uses SslConfigurator from jersey-common for TLS
115-
shaded ('org.glassfish.jersey.core:jersey-common:2.27') {
116-
// SslConfigurator doesn't use classes from dependencies
117-
exclude(module: '*')
99+
shaded 'org.zeroturnaround:zt-exec:1.10', {
100+
exclude(group: 'org.slf4j')
118101
}
119102

103+
testCompile 'org.apache.httpcomponents:httpclient:4.5.7'
120104
testCompile 'redis.clients:jedis:3.0.1'
121105
testCompile 'com.rabbitmq:amqp-client:5.6.0'
122106
testCompile 'org.mongodb:mongo-java-driver:3.10.1'

core/src/jarFileTest/java/org/testcontainers/JarFileShadingTest.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,7 @@ public void testPackages() throws Exception {
3737
public void testMetaInf() throws Exception {
3838
assertThatFileList(root.resolve("META-INF")).containsOnly(
3939
"MANIFEST.MF",
40-
"services",
41-
"native"
42-
);
43-
44-
assertThatFileList(root.resolve("META-INF").resolve("native")).containsOnly(
45-
"liborg-testcontainers-shaded-netty_transport_native_epoll_x86_64.so",
46-
"liborg-testcontainers-shaded-netty_transport_native_kqueue_x86_64.jnilib"
40+
"services"
4741
);
4842
}
4943

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.github.dockerjava.core.util;
2+
3+
import com.fasterxml.jackson.core.JsonProcessingException;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
/**
10+
* Monkey patched {@link FiltersEncoder} to avoid a use of jaxrs.
11+
* See https://github.com/docker-java/docker-java/issues/1176
12+
*/
13+
public class FiltersEncoder {
14+
15+
private FiltersEncoder() {
16+
}
17+
18+
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
19+
20+
public static String jsonEncode(Map<String, List<String>> filters) {
21+
try {
22+
return OBJECT_MAPPER.writeValueAsString(filters);
23+
} catch (JsonProcessingException e) {
24+
throw new RuntimeException(e);
25+
}
26+
}
27+
}

core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import org.slf4j.Logger;
1414
import org.slf4j.LoggerFactory;
1515
import org.testcontainers.dockerclient.auth.AuthDelegatingDockerClientConfig;
16-
import org.testcontainers.dockerclient.transport.TestcontainersDockerCmdExecFactory;
1716
import org.testcontainers.dockerclient.transport.okhttp.OkHttpDockerCmdExecFactory;
1817
import org.testcontainers.utility.TestcontainersConfiguration;
1918

@@ -173,9 +172,6 @@ protected DockerClient getClientForConfig(DockerClientConfig config) {
173172
if ("okhttp".equals(transportType)) {
174173
clientBuilder
175174
.withDockerCmdExecFactory(new OkHttpDockerCmdExecFactory());
176-
} else if ("netty".equals(transportType)) {
177-
clientBuilder
178-
.withDockerCmdExecFactory(new TestcontainersDockerCmdExecFactory());
179175
} else {
180176
throw new IllegalArgumentException("Unknown transport type: " + transportType);
181177
}

0 commit comments

Comments
 (0)