mazhengxuan created HBASE-30503:
-----------------------------------

             Summary: Exclude forked jersey-json from client artifacts and 
binary distributions
                 Key: HBASE-30503
                 URL: https://issues.apache.org/jira/browse/HBASE-30503
             Project: HBase
          Issue Type: Bug
          Components: build, dependencies, shading
    Affects Versions: 2.6.7, 2.6.2
            Reporter: mazhengxuan
            Assignee: mazhengxuan


Hadoop 3.3.5 replaced com.sun.jersey:jersey-json with 
com.github.pjfanning:jersey-json. HBase still excludes the old coordinate, so 
the fork is included while jersey-core is excluded.

The shaded client contains JAX-RS service providers whose parent classes are 
missing. Applications discovering these providers through ServiceLoader fail 
with NoClassDefFoundError. The fork also bypasses the binary assembly's 
com.sun.jersey:* exclusion.

Confirmed with these released hbase-shaded-client artifacts:
* 2.6.2-hadoop3 on JDK 8.
* 2.6.7-hadoop3 on JDK 8, 11 and 17.

To reproduce, download 
[hbase-shaded-client-2.6.7-hadoop3.jar|https://repo.maven.apache.org/maven2/org/apache/hbase/hbase-shaded-client/2.6.7-hadoop3/hbase-shaded-client-2.6.7-hadoop3.jar]
 and 
[javax.ws.rs-api-2.1.1.jar|https://repo.maven.apache.org/maven2/javax/ws/rs/javax.ws.rs-api/2.1.1/javax.ws.rs-api-2.1.1.jar]
 into the same directory, then save this as JerseySpiProbe.java:

{code:java}
import java.util.ServiceLoader;
import javax.ws.rs.ext.MessageBodyWriter;

public class JerseySpiProbe {
  public static void main(String[] args) {
    int count = 0;
    for (MessageBodyWriter<?> provider : 
ServiceLoader.load(MessageBodyWriter.class)) {
      System.out.println(provider.getClass().getName());
      count++;
    }
    System.out.println("Loaded providers: " + count);
  }
}
{code}

Run:

{code:bash}
javac -cp javax.ws.rs-api-2.1.1.jar JerseySpiProbe.java

# Passes: Loaded providers: 0
java -cp .:javax.ws.rs-api-2.1.1.jar JerseySpiProbe

# Fails after adding the HBase client
java -cp .:javax.ws.rs-api-2.1.1.jar:hbase-shaded-client-2.6.7-hadoop3.jar 
JerseySpiProbe
{code}

The last command fails with:

{noformat}
java.lang.NoClassDefFoundError: 
org/apache/hadoop/hbase/shaded/com/sun/jersey/core/provider/jaxb/AbstractRootElementProvider
{noformat}

Adding the HBase client should not break JAX-RS provider discovery. The 
dependency and assembly exclusions should also cover the forked coordinate.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to