dnsjava / dnsjava

dnsjava - an implementation of the DNS protocol in Java
BSD 3-Clause "New" or "Revised" License
932 stars 241 forks source link

org.xbill.DNS.spi.DnsjavaInetAddressResolverProvider not found #338

Closed tzaeschke closed 1 month ago

tzaeschke commented 1 month ago

Problem description

When running my application (Windows, Java 21, dns-java 3.6.1) I get the following Exception:

java.util.ServiceConfigurationError: [java.net](http://java.net/).spi.InetAddressResolverProvider: Provider org.xbill.DNS.spi.DnsjavaInetAddressResolverProvider not found
    at java.base/[java.util.ServiceLoader.fail](http://java.util.serviceloader.fail/)([ServiceLoader.java:589](http://serviceloader.java:589/))
    at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass([ServiceLoader.java:1215](http://serviceloader.java:1215/))
    at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService([ServiceLoader.java:1224](http://serviceloader.java:1224/))
    at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext([ServiceLoader.java:1269](http://serviceloader.java:1269/))
    at java.base/java.util.ServiceLoader$2.hasNext([ServiceLoader.java:1305](http://serviceloader.java:1305/))
    at java.base/java.util.ServiceLoader$3.hasNext([ServiceLoader.java:1387](http://serviceloader.java:1387/))
    at java.base/java.util.ServiceLoader.findFirst([ServiceLoader.java:1800](http://serviceloader.java:1800/))
    at java.base/[java.net](http://java.net/).InetAddress.loadResolver([InetAddress.java:508](http://inetaddress.java:508/))
    at java.base/[java.net](http://java.net/).InetAddress.resolver([InetAddress.java:488](http://inetaddress.java:488/))
    at java.base/[java.net](http://java.net/).InetAddress.getAddressesFromNameService([InetAddress.java:1814](http://inetaddress.java:1814/))
    at java.base/[java.net](http://java.net/).InetAddress$NameServiceAddresses.get([InetAddress.java:1149](http://inetaddress.java:1149/))
    at java.base/[java.net](http://java.net/).InetAddress.getAllByName0([InetAddress.java:1806](http://inetaddress.java:1806/))
    at java.base/[java.net](http://java.net/).InetAddress.getAllByName([InetAddress.java:1676](http://inetaddress.java:1676/))
    at io.grpc.internal.DnsNameResolver$JdkAddressResolver.resolveAddress([DnsNameResolver.java:632](http://dnsnameresolver.java:632/))
    at io.grpc.internal.DnsNameResolver.resolveAddresses([DnsNameResolver.java:219](http://dnsnameresolver.java:219/))
    at io.grpc.internal.DnsNameResolver.doResolve([DnsNameResolver.java:282](http://dnsnameresolver.java:282/))
    at io.grpc.internal.DnsNameResolver$[Resolve.run](http://resolve.run/)([DnsNameResolver.java:318](http://dnsnameresolver.java:318/))
    ...

Problem analysis

DNS Java uses a multi-version Jar. However, while the class org.xbill.DNS.spi.DnsjavaInetAddressResolverProvider is only included when built with Java 18 or later, the service file META-INF/services/java.net.spi.InetAddressResolverProvider is always included.

My theory (not verified): The Maven artifact has probably been built with Java 17 or earlier, hence it contains the service file but not the Java 18 DnsjavaInetAddressResolverProvider. When a Java 18 application uses Java DNS, the service file tries to look up the class and fails.

Workarounds

ibauersachs commented 1 month ago

https://github.com/dnsjava/dnsjava/issues/329#issuecomment-2346138242