diff --git a/changelog/@unreleased/pr-576.v2.yml b/changelog/@unreleased/pr-576.v2.yml new file mode 100644 index 00000000..eae3ced3 --- /dev/null +++ b/changelog/@unreleased/pr-576.v2.yml @@ -0,0 +1,5 @@ +type: fix +fix: + description: Jdk21 support (round 2) + links: + - https://github.com/palantir/docker-proxy-rule/pull/576 diff --git a/docker-proxy-rule-core-jdk21/build.gradle b/docker-proxy-rule-core-jdk21/build.gradle index ad475925..051f297d 100644 --- a/docker-proxy-rule-core-jdk21/build.gradle +++ b/docker-proxy-rule-core-jdk21/build.gradle @@ -1,12 +1,24 @@ apply plugin: 'com.palantir.external-publish-jar' +apply plugin: 'org.unbroken-dome.test-sets' + +testSets { + integrationTest +} + +build.dependsOn integrationTest dependencies { api project(':docker-proxy-rule-core') - testImplementation group: 'junit', name: 'junit' - testImplementation group: 'org.assertj', name: 'assertj-core' - testImplementation group: 'org.mockito', name: 'mockito-core' - testRuntimeOnly group: 'org.mockito', name: 'mockito-inline' + compileOnly group: 'com.google.auto.service', name: 'auto-service-annotations' + annotationProcessor group: 'com.google.auto.service', name: 'auto-service' + + integrationTestImplementation project(':docker-proxy-junit-jupiter') + integrationTestImplementation group: 'com.palantir.docker.compose', name: 'docker-compose-junit-jupiter' + + integrationTestImplementation group: 'junit', name: 'junit' + integrationTestImplementation group: 'org.assertj', name: 'assertj-core' + integrationTestImplementation group: 'org.junit.jupiter', name: 'junit-jupiter' } javaVersion { diff --git a/docker-proxy-rule-core-jdk21/src/integrationTest/java/com/palantir/docker/proxy/DockerProxyExtensionJdk21Test.java b/docker-proxy-rule-core-jdk21/src/integrationTest/java/com/palantir/docker/proxy/DockerProxyExtensionJdk21Test.java new file mode 100644 index 00000000..a4d6db62 --- /dev/null +++ b/docker-proxy-rule-core-jdk21/src/integrationTest/java/com/palantir/docker/proxy/DockerProxyExtensionJdk21Test.java @@ -0,0 +1,135 @@ +/* + * (c) Copyright 2019 Palantir Technologies Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.palantir.docker.proxy; + +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +import com.palantir.docker.compose.DockerComposeExtension; +import com.palantir.docker.compose.connection.Container; +import com.palantir.docker.compose.logging.LogDirectory; +import java.io.IOException; +import java.net.URL; +import java.net.URLConnection; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +class DockerProxyExtensionJdk21Test { + @RegisterExtension + static final DockerComposeExtension DOCKER_COMPOSE_EXTENSION = DockerComposeExtension.builder() + .file("src/integrationTest/resources/DockerProxyExtensionJdk21Test-services.yml") + .saveLogsTo(LogDirectory.circleAwareLogDirectory(DockerProxyExtensionJdk21Test.class)) + .waitingForService("webserver", Container::areAllPortsOpen) + .build(); + + @Test + void canReachDockerContainerByContainerNameWithProjectSpecified() throws IOException, InterruptedException { + DockerProxyExtension dockerProxyExtension = DockerProxyExtension.fromProjectName( + DOCKER_COMPOSE_EXTENSION.projectName(), DockerProxyExtensionJdk21Test.class); + try { + dockerProxyExtension.before(); + URLConnection urlConnection = new URL("http://webserver").openConnection(); + urlConnection.connect(); + } finally { + dockerProxyExtension.after(); + } + } + + @Test + void canReachDockerContainerByHostnameWithProjectSpecified() throws IOException, InterruptedException { + DockerProxyExtension dockerProxyExtension = DockerProxyExtension.fromProjectName( + DOCKER_COMPOSE_EXTENSION.projectName(), DockerProxyExtensionJdk21Test.class); + try { + dockerProxyExtension.before(); + URLConnection urlConnection = new URL("http://web").openConnection(); + urlConnection.connect(); + } finally { + dockerProxyExtension.after(); + } + } + + @Test + void canReachDockerContainerByHostnameAndDomainNameWithProjectSpecified() throws IOException, InterruptedException { + DockerProxyExtension dockerProxyExtension = DockerProxyExtension.fromProjectName( + DOCKER_COMPOSE_EXTENSION.projectName(), DockerProxyExtensionJdk21Test.class); + try { + dockerProxyExtension.before(); + URLConnection urlConnection = new URL("http://web.server.here").openConnection(); + urlConnection.connect(); + } finally { + dockerProxyExtension.after(); + } + } + + @Test + void canReachDockerContainerByContainerNameWithNetworkSpecified() throws IOException, InterruptedException { + DockerProxyExtension dockerProxyExtension = DockerProxyExtension.fromNetworkName( + DOCKER_COMPOSE_EXTENSION.projectName().asString() + "_default", DockerProxyExtensionJdk21Test.class); + try { + dockerProxyExtension.before(); + URLConnection urlConnection = new URL("http://webserver").openConnection(); + urlConnection.connect(); + } finally { + dockerProxyExtension.after(); + } + } + + @Test + void canReachDockerContainerByHostnameWithNetworkSpecified() throws IOException, InterruptedException { + DockerProxyExtension dockerProxyExtension = DockerProxyExtension.fromNetworkName( + DOCKER_COMPOSE_EXTENSION.projectName().asString() + "_default", DockerProxyExtensionJdk21Test.class); + try { + dockerProxyExtension.before(); + URLConnection urlConnection = new URL("http://web").openConnection(); + urlConnection.connect(); + } finally { + dockerProxyExtension.after(); + } + } + + @Test + void canReachDockerContainerByHostnameAndDomainNameWithNetworkSpecified() throws IOException, InterruptedException { + DockerProxyExtension dockerProxyExtension = DockerProxyExtension.fromNetworkName( + DOCKER_COMPOSE_EXTENSION.projectName().asString() + "_default", DockerProxyExtensionJdk21Test.class); + try { + dockerProxyExtension.before(); + URLConnection urlConnection = new URL("http://web.server.here").openConnection(); + urlConnection.connect(); + } finally { + dockerProxyExtension.after(); + } + } + + @Test + void otherHostnamesStillResolve() throws IOException, InterruptedException { + DockerProxyExtension dockerProxyExtension = DockerProxyExtension.fromProjectName( + DOCKER_COMPOSE_EXTENSION.projectName(), DockerProxyExtensionJdk21Test.class); + try { + dockerProxyExtension.before(); + URLConnection urlConnection = new URL("http://www.palantir.com").openConnection(); + urlConnection.connect(); + } finally { + dockerProxyExtension.after(); + } + } + + @Test + void runningProxyRuleBeforeDockerComposeRuleFails() { + assertThatExceptionOfType(IllegalStateException.class).isThrownBy(() -> DockerProxyExtension.fromNetworkName( + "doesnotexist", DockerProxyExtensionJdk21Test.class) + .before()); + } +} diff --git a/docker-proxy-rule-core-jdk21/src/integrationTest/resources/DockerProxyExtensionJdk21Test-services.yml b/docker-proxy-rule-core-jdk21/src/integrationTest/resources/DockerProxyExtensionJdk21Test-services.yml new file mode 100644 index 00000000..9b64c179 --- /dev/null +++ b/docker-proxy-rule-core-jdk21/src/integrationTest/resources/DockerProxyExtensionJdk21Test-services.yml @@ -0,0 +1,7 @@ +version: '2' + +services: + webserver: + hostname: web + domainname: server.here + image: nginx diff --git a/docker-proxy-rule-core-jdk21/src/main/java/com/palantir/docker/proxy/DockerProxyInetAddressResolverProvider.java b/docker-proxy-rule-core-jdk21/src/main/java/com/palantir/docker/proxy/DockerProxyInetAddressResolverProvider.java index 3b18e152..537173cb 100644 --- a/docker-proxy-rule-core-jdk21/src/main/java/com/palantir/docker/proxy/DockerProxyInetAddressResolverProvider.java +++ b/docker-proxy-rule-core-jdk21/src/main/java/com/palantir/docker/proxy/DockerProxyInetAddressResolverProvider.java @@ -16,9 +16,11 @@ package com.palantir.docker.proxy; +import com.google.auto.service.AutoService; import java.net.spi.InetAddressResolver; import java.net.spi.InetAddressResolverProvider; +@AutoService(InetAddressResolverProvider.class) public final class DockerProxyInetAddressResolverProvider extends InetAddressResolverProvider { @Override diff --git a/docker-proxy-rule-core-jdk21/src/main/resources/META-INF/services/java.net.spi.InetAddressResolverProvider b/docker-proxy-rule-core-jdk21/src/main/resources/META-INF/services/java.net.spi.InetAddressResolverProvider deleted file mode 100644 index 11eb908e..00000000 --- a/docker-proxy-rule-core-jdk21/src/main/resources/META-INF/services/java.net.spi.InetAddressResolverProvider +++ /dev/null @@ -1 +0,0 @@ -com.palantir.docker.proxy.DockerProxyManager$DockerProxyInetAddressResolverProvider diff --git a/docker-proxy-rule-core-jdk21/src/test/java/com/palantir/docker/proxy/DockerContainerInfoUtilsTest.java b/docker-proxy-rule-core-jdk21/src/test/java/com/palantir/docker/proxy/DockerContainerInfoUtilsTest.java deleted file mode 100644 index 86165593..00000000 --- a/docker-proxy-rule-core-jdk21/src/test/java/com/palantir/docker/proxy/DockerContainerInfoUtilsTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * (c) Copyright 2019 Palantir Technologies Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.palantir.docker.proxy; - -import static com.palantir.docker.proxy.DockerContainerInfoUtils.IP_FORMAT_STRING; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import com.palantir.docker.compose.execution.DockerExecutable; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.Optional; -import java.util.concurrent.TimeUnit; -import org.junit.Test; - -public class DockerContainerInfoUtilsTest { - private static final String CONTAINER_ID = "container-id"; - - private final Process response = mock(Process.class); - private final DockerExecutable dockerExecutable = mock(DockerExecutable.class); - - @Test - public void getContainerIpFromIdDoesNotThrowWhenContainerIsStopped() throws IOException, InterruptedException { - when(response.getInputStream()).thenReturn(getDockerOutputForStoppedContainer()); - when(response.waitFor(anyLong(), any(TimeUnit.class))).thenReturn(true); - when(response.exitValue()).thenReturn(0); - when(dockerExecutable.execute("inspect", "--format", IP_FORMAT_STRING, CONTAINER_ID)) - .thenReturn(response); - - Optional ip = DockerContainerInfoUtils.getContainerIpFromId(dockerExecutable, CONTAINER_ID); - assertThat(ip).isNotPresent(); - } - - private static InputStream getDockerOutputForStoppedContainer() { - return new ByteArrayInputStream("\n".getBytes(StandardCharsets.UTF_8)); - } -} diff --git a/docker-proxy-rule-core-jdk21/src/test/java/com/palantir/docker/proxy/DockerNameServiceTest.java b/docker-proxy-rule-core-jdk21/src/test/java/com/palantir/docker/proxy/DockerNameServiceTest.java deleted file mode 100644 index e797db11..00000000 --- a/docker-proxy-rule-core-jdk21/src/test/java/com/palantir/docker/proxy/DockerNameServiceTest.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * (c) Copyright 2017 Palantir Technologies Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.palantir.docker.proxy; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import com.google.common.net.InetAddresses; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Optional; -import org.junit.Test; - -public class DockerNameServiceTest { - private static final String HOST_NAME = "host"; - private static final String HOST_IP = "172.0.2.5"; - private static final InetAddress HOST_IP_INET = InetAddresses.forString("172.0.2.5"); - - private final DockerContainerInfo containerInfo = mock(DockerContainerInfo.class); - private final DockerNameService dockerNameService = new DockerNameService(containerInfo); - - @Test - public void shouldReturnIpOfHost() throws UnknownHostException { - when(containerInfo.getIpForHost(HOST_NAME)).thenReturn(Optional.of(HOST_IP)); - - InetAddress[] hostAddresses = dockerNameService.lookupAllHostAddr(HOST_NAME); - - assertThat(hostAddresses).containsExactly(HOST_IP_INET); - } - - @Test - public void shouldOnlyQueryTheSupplierOncePerLookupCall() throws UnknownHostException { - when(containerInfo.getIpForHost(HOST_NAME)).thenReturn(Optional.of(HOST_IP)); - - dockerNameService.lookupAllHostAddr(HOST_NAME); - - verify(containerInfo, times(1)).getIpForHost(HOST_NAME); - } - - @Test - public void shouldGetIpOfHostFromSupplierEveryTime() throws UnknownHostException { - when(containerInfo.getIpForHost(HOST_NAME)).thenReturn(Optional.of(HOST_IP)); - - dockerNameService.lookupAllHostAddr(HOST_NAME); - dockerNameService.lookupAllHostAddr(HOST_NAME); - - verify(containerInfo, times(2)).getIpForHost(HOST_NAME); - } - - @Test(expected = UnknownHostException.class) - public void shouldThrowUnknownHostExceptionWhenNoIpForHost() throws UnknownHostException { - when(containerInfo.getIpForHost(HOST_NAME)).thenReturn(Optional.empty()); - - dockerNameService.lookupAllHostAddr(HOST_NAME); - } - - @Test - public void shouldGetHostFromIp() throws UnknownHostException { - when(containerInfo.getHostForIp(HOST_IP)).thenReturn(Optional.of(HOST_NAME)); - - String host = dockerNameService.getHostByAddr(HOST_IP_INET.getAddress()); - - assertThat(host).isEqualTo(HOST_NAME); - } - - @Test - public void shouldOnlyQueryTheSupplierOncePerHostByAddrCall() throws UnknownHostException { - when(containerInfo.getHostForIp(HOST_IP)).thenReturn(Optional.of(HOST_NAME)); - - dockerNameService.getHostByAddr(HOST_IP_INET.getAddress()); - - verify(containerInfo, times(1)).getHostForIp(HOST_IP); - } - - @Test - public void shouldGetHostOfIpFromSupplierEveryTime() throws UnknownHostException { - when(containerInfo.getHostForIp(HOST_IP)).thenReturn(Optional.of(HOST_NAME)); - - dockerNameService.getHostByAddr(HOST_IP_INET.getAddress()); - dockerNameService.getHostByAddr(HOST_IP_INET.getAddress()); - - verify(containerInfo, times(2)).getHostForIp(HOST_IP); - } - - @Test(expected = UnknownHostException.class) - public void shouldThrowUnknownHostExceptionWhenNoHostForIp() throws UnknownHostException { - when(containerInfo.getHostForIp(HOST_IP)).thenReturn(Optional.empty()); - - dockerNameService.getHostByAddr(HOST_IP_INET.getAddress()); - } -} diff --git a/docker-proxy-rule-core-jdk21/src/test/java/com/palantir/docker/proxy/DockerProxySelectorTest.java b/docker-proxy-rule-core-jdk21/src/test/java/com/palantir/docker/proxy/DockerProxySelectorTest.java deleted file mode 100644 index ebd1ff62..00000000 --- a/docker-proxy-rule-core-jdk21/src/test/java/com/palantir/docker/proxy/DockerProxySelectorTest.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * (c) Copyright 2017 Palantir Technologies Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.palantir.docker.proxy; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import com.google.common.base.Throwables; -import com.google.common.collect.ImmutableList; -import com.google.common.net.InetAddresses; -import com.palantir.docker.compose.connection.Cluster; -import com.palantir.docker.compose.connection.Container; -import com.palantir.docker.compose.connection.ContainerCache; -import com.palantir.docker.compose.connection.DockerPort; -import com.palantir.docker.compose.connection.ImmutableCluster; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.net.ProxySelector; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.List; -import java.util.Optional; -import org.junit.Before; -import org.junit.Test; - -public class DockerProxySelectorTest { - private static final String CLUSTER_IP = "172.17.0.1"; - private static final int PROXY_EXTERNAL_PORT = 12345; - private static final InetSocketAddress PROXY_ADDRESS = - new InetSocketAddress(InetAddresses.forString(CLUSTER_IP), PROXY_EXTERNAL_PORT); - - private static final String TEST_IP = "172.17.0.5"; - private static final String TEST_HOSTNAME = "some-address"; - private static final URI TEST_IP_URI = createUriUnsafe("http://172.17.0.5"); - private static final URI TEST_HOSTNAME_URI = createUriUnsafe("http://some-address"); - - private final DockerContainerInfo containerInfo = mock(DockerContainerInfo.class); - private final ProxySelector originalProxySelector = mock(ProxySelector.class); - private final ProxySelector dockerProxySelector = - new DockerProxySelector(setupProxyContainer(), containerInfo, originalProxySelector); - - @Before - public void originalProxySelectorIsNoProxy() { - when(originalProxySelector.select(any())).thenReturn(ImmutableList.of(Proxy.NO_PROXY)); - } - - @Test - public void nonDockerAddressesShouldDelegateToPassedInSelector() { - when(containerInfo.getIpForHost(TEST_HOSTNAME)).thenReturn(Optional.empty()); - when(containerInfo.getHostForIp(TEST_HOSTNAME)).thenReturn(Optional.empty()); - - List selectedProxy = dockerProxySelector.select(TEST_HOSTNAME_URI); - - assertThat(selectedProxy).containsExactly(Proxy.NO_PROXY); - - verify(originalProxySelector, times(1)).select(TEST_HOSTNAME_URI); - } - - @Test - public void dockerAddressesShouldGoThroughAProxy() throws URISyntaxException { - when(containerInfo.getIpForHost(TEST_HOSTNAME)).thenReturn(Optional.of(TEST_IP)); - - List selectedProxy = dockerProxySelector.select(TEST_HOSTNAME_URI); - - assertThat(selectedProxy).containsExactly(new Proxy(Proxy.Type.SOCKS, PROXY_ADDRESS)); - } - - @Test - public void dockerIpsShouldGoThroughAProxy() { - when(containerInfo.getHostForIp(TEST_IP)).thenReturn(Optional.of(TEST_HOSTNAME)); - - List selectedProxy = dockerProxySelector.select(TEST_IP_URI); - - assertThat(selectedProxy).containsExactly(new Proxy(Proxy.Type.SOCKS, PROXY_ADDRESS)); - } - - @Test(expected = IllegalArgumentException.class) - public void connectionFailedShouldThrowOnNullUri() { - dockerProxySelector.connectFailed(null, PROXY_ADDRESS, new IOException()); - } - - @Test(expected = IllegalArgumentException.class) - public void connectionFailedShouldThrowOnNullAddress() { - dockerProxySelector.connectFailed(TEST_HOSTNAME_URI, null, new IOException()); - } - - @Test(expected = IllegalArgumentException.class) - public void connectionFailedShouldThrowOnNullException() { - dockerProxySelector.connectFailed(TEST_HOSTNAME_URI, PROXY_ADDRESS, null); - } - - @Test - public void connectionFailedShouldNotThrowOnValidArguments() { - dockerProxySelector.connectFailed(TEST_HOSTNAME_URI, PROXY_ADDRESS, new IOException()); - } - - @Test - public void connectionFailedShouldDelegateToPassedInSelector() { - IOException exception = new IOException(); - dockerProxySelector.connectFailed(TEST_HOSTNAME_URI, PROXY_ADDRESS, exception); - - verify(originalProxySelector, times(1)).connectFailed(TEST_HOSTNAME_URI, PROXY_ADDRESS, exception); - } - - private static Cluster setupProxyContainer() { - Container proxyContainer = mock(Container.class); - when(proxyContainer.port(DockerProxySelector.PROXY_CONTAINER_PORT)) - .thenReturn(new DockerPort(CLUSTER_IP, PROXY_EXTERNAL_PORT, DockerProxySelector.PROXY_CONTAINER_PORT)); - - ContainerCache containerCache = mock(ContainerCache.class); - when(containerCache.container(DockerProxySelector.PROXY_CONTAINER_NAME)).thenReturn(proxyContainer); - - return ImmutableCluster.builder() - .ip(CLUSTER_IP) - .containerCache(containerCache) - .build(); - } - - private static URI createUriUnsafe(String uriString) { - try { - return new URI(uriString); - } catch (URISyntaxException e) { - throw Throwables.propagate(e); - } - } -} diff --git a/docker-proxy-rule-core/build.gradle b/docker-proxy-rule-core/build.gradle index 8cd3f304..5c4985ac 100644 --- a/docker-proxy-rule-core/build.gradle +++ b/docker-proxy-rule-core/build.gradle @@ -4,6 +4,8 @@ dependencies { api group: 'com.palantir.docker.compose', name: 'docker-compose-rule-core' implementation group: 'one.util', name: 'streamex' + runtimeOnly project(":docker-proxy-rule-core-jdk21") + testImplementation group: 'junit', name: 'junit' testImplementation group: 'org.assertj', name: 'assertj-core' testImplementation group: 'org.mockito', name: 'mockito-core' diff --git a/versions.lock b/versions.lock index a0e5113f..7fbb2fcb 100644 --- a/versions.lock +++ b/versions.lock @@ -11,6 +11,7 @@ com.fasterxml.jackson.datatype:jackson-datatype-joda:2.12.3 (1 constraints: 7e1c com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.12.3 (1 constraints: 7e1c99a4) com.fasterxml.jackson.module:jackson-module-afterburner:2.12.3 (1 constraints: 7e1c99a4) com.github.zafarkhaja:java-semver:0.9.0 (1 constraints: c315c0d2) +com.google.auto.service:auto-service-annotations:1.1.1 (1 constraints: 0505f435) com.google.code.findbugs:jsr305:3.0.2 (1 constraints: 980fcc86) com.google.errorprone:error_prone_annotations:2.7.1 (2 constraints: f5201957) com.google.guava:guava:21.0 (2 constraints: cc2bc2d1) diff --git a/versions.props b/versions.props index 9191e6a9..28a1d680 100644 --- a/versions.props +++ b/versions.props @@ -1,4 +1,5 @@ com.fasterxml.jackson.core:jackson-databind = 2.14.2 +com.google.auto.service:* = 1.1.1 com.palantir.docker.compose:* = 1.8.0 junit:junit = 4.13.2 one.util:streamex = 0.8.1