[
https://issues.apache.org/jira/browse/HBASE-30211?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Allan Espinosa updated HBASE-30211:
-----------------------------------
Description:
{{hbase-shaded-client:2.6.5-hadoop3}} is doesn't work on Java 18+ due to a
broken {{ServiceLoader}} provider introduced by the shade plugin's class
relocation. The shaded JAR poisons JVM-wide DNS resolution, causing every
operation —
including standard Kerberized HBase client connections — to fail.
On Java 11, the same artifact works correctly for HBase operations
(connecting to Kerberized clusters, listing namespaces). The regression is
specific to Java 18+ where the {{java.net.spi.InetAddressResolverProvider}} SPI
was introduced (JEP 418).
h2. Failure message: ServiceLoader provider not found
{code:java}
java.util.ServiceConfigurationError: java.net.spi.InetAddressResolverProvider:
Provider
org.apache.hadoop.hbase.shaded.org.xbill.DNS.spi.DnsjavaInetAddressResolverProvider
not found
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:593)
at
java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1219)
at java.base/java.net.InetAddress.loadResolver(InetAddress.java:508)
at java.base/java.net.InetAddress.resolver(InetAddress.java:488)
{code:java}
Hypothesis: The Maven shade plugin relocated {{org.xbill.DNS}} to
{{org.apache.hadoop.hbase.shaded.org.xbill.DNS}}. The
{{ServicesResourceTransformer}} rewrote the service file at
{{META-INF/services/java.net.spi.InetAddressResolverProvider}} to
reference the relocated class name. However, the JVM's {{ServiceLoader}}
cannot load the provider at the relocated path. Since
{{InetAddressResolverProvider}} is a JVM-level SPI, this breaks all DNS
resolution in the process — not just Hadoop or
HBase operations.
h2. Steps to reproduce
The following test connects to a Kerberized HBase cluster using only
{{hbase-shaded-client:2.6.5-hadoop3} in its pom.xml. This code works in Java
11 but fails on Java 21:
{code:java}
@Test
void kerberizedHBaseConnection() throws IOException {
Configuration conf = new Configuration();
// Makes UserGroupInformation.setConfiguration() work in the next line
// conf.addResource("core-site.xml");
conf.addResource(new URL("https://example.com/core-site.xml"));
// On Java 11: succeeds
// On Java 21: ServiceConfigurationError -
DnsjavaInetAddressResolverProvider not found
UserGroupInformation.setConfiguration(conf);
Configuration hbaseConfig = HBaseConfiguration.create(conf);
// On Java 11: succeeds
// On Java 21: ServiceConfigurationError -
DnsjavaInetAddressResolverProvider not found
hbaseConfig.addResource(new URL("https://example.com/hbase-site.xml"));
// No issue in Java 21:
// hbaseConfig.addResource("hbase-site.xml");
// On Java 11: succeeds
// On Java 21: ServiceConfigurationError -
DnsjavaInetAddressResolverProvider not found
Connection conn = ConnectionFactory.createConnection(hbaseConfig);
Admin admin = conn.getAdmin();
assertTrue(List.of(admin.listNamespaces()).contains("default"));
{code}
h2. Workaround
Use {{hbase-shaded-client-byo-hadoop}} with an explicit {{hadoop-client}}
dependency instead
was:
{{hbase-shaded-client:2.6.5-hadoop3}} is doesn't work on Java 18+ due to a
broken {{ServiceLoader}} provider introduced by the shade plugin's class
relocation. The shaded JAR poisons JVM-wide DNS resolution, causing every
operation —
including standard Kerberized HBase client connections — to fail.
On Java 11, the same artifact works correctly for HBase operations
(connecting to Kerberized clusters, listing namespaces). The regression is
specific to Java 18+ where the {{java.net.spi.InetAddressResolverProvider}} SPI
was introduced (JEP 418).
h2. Failure message: ServiceLoader provider not found
{code:java}
java.util.ServiceConfigurationError: java.net.spi.InetAddressResolverProvider:
Provider
org.apache.hadoop.hbase.shaded.org.xbill.DNS.spi.DnsjavaInetAddressResolverProvider
not found
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:593)
at
java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1219)
at java.base/java.net.InetAddress.loadResolver(InetAddress.java:508)
at java.base/java.net.InetAddress.resolver(InetAddress.java:488)
{code:java}
Hypothesis: The Maven shade plugin relocated {{org.xbill.DNS}} to
{{org.apache.hadoop.hbase.shaded.org.xbill.DNS}}. The
{{ServicesResourceTransformer}} rewrote the service file at
{{META-INF/services/java.net.spi.InetAddressResolverProvider}} to
reference the relocated class name. However, the JVM's {{ServiceLoader}}
cannot load the provider at the relocated path. Since
{{InetAddressResolverProvider}} is a JVM-level SPI, this breaks all DNS
resolution in the process — not just Hadoop or
HBase operations.
h2. Steps to reproduce
The following test connects to a Kerberized HBase cluster using only
{{hbase-shaded-client:2.6.5-hadoop3} in its pom.xml. This code works in Java
11 but fails on Java 21:
{code:java}
@Test
void kerberizedHBaseConnection() throws IOException {
Configuration conf = new Configuration();
// Makes UserGroupInformation.setConfiguration() work in the next line
// conf.addResource("core-site.xml");
conf.addResource(new URL("https://example.com/core-site.xml"));
// On Java 11: succeeds
// On Java 21: ServiceConfigurationError -
DnsjavaInetAddressResolverProvider not found
UserGroupInformation.setConfiguration(conf);
Configuration hbaseConfig = HBaseConfiguration.create(conf);
// On Java 11: succeeds
// On Java 21: ServiceConfigurationError -
DnsjavaInetAddressResolverProvider not found
hbaseConfig.addResource(new URL("https://example.com/hbase-site.xml"));
// No issue in Java 21:
// hbaseConfig.addResource("hbase-site.xml");
// On Java 11: succeeds
// On Java 21: ServiceConfigurationError -
DnsjavaInetAddressResolverProvider not found
Connection conn = ConnectionFactory.createConnection(hbaseConfig);
Admin admin = conn.getAdmin();
assertTrue(List.of(admin.listNamespaces()).contains("default"));
{code}
> hbase-shaded-client:2.x-hadoop3 DNS lookups raises
> DnsjavaInetAddressResolverProvider not found from Java18+
> ------------------------------------------------------------------------------------------------------------
>
> Key: HBASE-30211
> URL: https://issues.apache.org/jira/browse/HBASE-30211
> Project: HBase
> Issue Type: Bug
> Components: shading
> Affects Versions: 2.6.5
> Reporter: Allan Espinosa
> Priority: Minor
>
> {{hbase-shaded-client:2.6.5-hadoop3}} is doesn't work on Java 18+ due to a
> broken {{ServiceLoader}} provider introduced by the shade plugin's class
> relocation. The shaded JAR poisons JVM-wide DNS resolution, causing every
> operation —
> including standard Kerberized HBase client connections — to fail.
> On Java 11, the same artifact works correctly for HBase operations
> (connecting to Kerberized clusters, listing namespaces). The regression is
> specific to Java 18+ where the {{java.net.spi.InetAddressResolverProvider}}
> SPI was introduced (JEP 418).
> h2. Failure message: ServiceLoader provider not found
> {code:java}
> java.util.ServiceConfigurationError: java.net.spi.InetAddressResolverProvider:
> Provider
> org.apache.hadoop.hbase.shaded.org.xbill.DNS.spi.DnsjavaInetAddressResolverProvider
> not found
> at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:593)
> at
> java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1219)
> at java.base/java.net.InetAddress.loadResolver(InetAddress.java:508)
> at java.base/java.net.InetAddress.resolver(InetAddress.java:488)
> {code:java}
> Hypothesis: The Maven shade plugin relocated {{org.xbill.DNS}} to
> {{org.apache.hadoop.hbase.shaded.org.xbill.DNS}}. The
> {{ServicesResourceTransformer}} rewrote the service file at
> {{META-INF/services/java.net.spi.InetAddressResolverProvider}} to
> reference the relocated class name. However, the JVM's {{ServiceLoader}}
> cannot load the provider at the relocated path. Since
> {{InetAddressResolverProvider}} is a JVM-level SPI, this breaks all DNS
> resolution in the process — not just Hadoop or
> HBase operations.
> h2. Steps to reproduce
> The following test connects to a Kerberized HBase cluster using only
> {{hbase-shaded-client:2.6.5-hadoop3} in its pom.xml. This code works in Java
> 11 but fails on Java 21:
> {code:java}
> @Test
> void kerberizedHBaseConnection() throws IOException {
> Configuration conf = new Configuration();
> // Makes UserGroupInformation.setConfiguration() work in the next line
> // conf.addResource("core-site.xml");
> conf.addResource(new URL("https://example.com/core-site.xml"));
> // On Java 11: succeeds
> // On Java 21: ServiceConfigurationError -
> DnsjavaInetAddressResolverProvider not found
> UserGroupInformation.setConfiguration(conf);
> Configuration hbaseConfig = HBaseConfiguration.create(conf);
> // On Java 11: succeeds
> // On Java 21: ServiceConfigurationError -
> DnsjavaInetAddressResolverProvider not found
> hbaseConfig.addResource(new URL("https://example.com/hbase-site.xml"));
> // No issue in Java 21:
> // hbaseConfig.addResource("hbase-site.xml");
> // On Java 11: succeeds
> // On Java 21: ServiceConfigurationError -
> DnsjavaInetAddressResolverProvider not found
> Connection conn = ConnectionFactory.createConnection(hbaseConfig);
> Admin admin = conn.getAdmin();
> assertTrue(List.of(admin.listNamespaces()).contains("default"));
> {code}
> h2. Workaround
> Use {{hbase-shaded-client-byo-hadoop}} with an explicit {{hadoop-client}}
> dependency instead
--
This message was sent by Atlassian Jira
(v8.20.10#820010)