diff --git a/sdk/trace-shaded-deps/src/main/java/io/opentelemetry/sdk/trace/internal/JcTools.java b/sdk/trace-shaded-deps/src/main/java/io/opentelemetry/sdk/trace/internal/JcTools.java index a293c437aff..e099432ea3b 100644 --- a/sdk/trace-shaded-deps/src/main/java/io/opentelemetry/sdk/trace/internal/JcTools.java +++ b/sdk/trace-shaded-deps/src/main/java/io/opentelemetry/sdk/trace/internal/JcTools.java @@ -28,9 +28,28 @@ public static Queue newFixedSizeQueue(int capacity) { } catch (java.lang.NoClassDefFoundError e) { // Happens when modules such as jdk.unsupported are disabled in a custom JRE distribution return new ArrayBlockingQueue<>(capacity); + } catch (java.lang.ExceptionInInitializerError e) { + if (isSunMiscAccessProhibited(e)) { + return new ArrayBlockingQueue<>(capacity); + } else { + throw e; + } } } + private static boolean isSunMiscAccessProhibited(Throwable t) { + String rootCause = rootCause(t).getMessage(); + return rootCause != null && rootCause.contains("accessClassInPackage.sun.misc"); + } + + public static Throwable rootCause(Throwable throwable) { + Throwable c = throwable; + while (c.getCause() != null && c.getCause() != c) { + c = c.getCause(); + } + return c; + } + /** * Returns the capacity of the {@link Queue}. We cast to the implementation so callers do not need * to use the shaded classes.