+ * The forwarder must be a lambda defined in the entry-point module + * (not the core module) so that the JVM sees the correct caller for + * the {@code addOpens} permission check. + *
+ * + *+ * When running on the classpath (unnamed module), calling this + * method is unnecessary — the forwarder is never invoked. + *
+ * + * @param forwarder the forwarding callback + */ + default void setModuleAccessForwarder(ModuleAccessForwarder forwarder) { + // no-op by default — overridden in WeldBootstrap + } } \ No newline at end of file diff --git a/weld-spi/src/main/java/org/jboss/weld/bootstrap/api/ModuleAccessForwarder.java b/weld-spi/src/main/java/org/jboss/weld/bootstrap/api/ModuleAccessForwarder.java new file mode 100644 index 00000000..209fe008 --- /dev/null +++ b/weld-spi/src/main/java/org/jboss/weld/bootstrap/api/ModuleAccessForwarder.java @@ -0,0 +1,30 @@ +/* + * Copyright The Weld Authors + * SPDX-License-Identifier: Apache-2.0 + */ +package org.jboss.weld.bootstrap.api; + +/** + * Callback for forwarding JPMS module access from an entry-point module + * (SE or Servlet) to the core module. The entry-point module creates a + * lambda that calls {@link Module#addOpens(String, Module)}, and core + * invokes it lazily before reflective access to user bean packages. + * + *+ * The callback must be defined (as a lambda or method reference) in the + * entry-point module so that the JVM's stack-walking check for + * {@code addOpens} sees the correct caller module. + *
+ */ +@FunctionalInterface +public interface ModuleAccessForwarder { + + /** + * Forward access from the source module's package to the target module. + * + * @param sourceModule the module that owns the package to be opened + * @param packageName the package name to open + * @param targetModule the module that needs access + */ + void forwardAccess(Module sourceModule, String packageName, Module targetModule); +} diff --git a/weld/src/main/java/module-info.java b/weld/src/main/java/module-info.java new file mode 100644 index 00000000..ef220d93 --- /dev/null +++ b/weld/src/main/java/module-info.java @@ -0,0 +1,22 @@ +/* + * Copyright The Weld Authors + * SPDX-License-Identifier: Apache-2.0 + */ +module org.jboss.weld.api { + requires transitive jakarta.cdi; + requires static jakarta.servlet; + + exports org.jboss.weld.bootstrap.event; + exports org.jboss.weld.context; + exports org.jboss.weld.context.activator; + exports org.jboss.weld.context.api; + exports org.jboss.weld.context.bound; + exports org.jboss.weld.context.ejb; + exports org.jboss.weld.context.http; + exports org.jboss.weld.context.unbound; + exports org.jboss.weld.events; + exports org.jboss.weld.inject; + exports org.jboss.weld.interceptor; + exports org.jboss.weld.invoke; + exports org.jboss.weld.proxy; +}