2017-09-18 5 views
3

J'essaie de voir comment le conteneur Weld CDI peut fonctionner avec JPMS. J'ai donc la configuration suivante.Le module automatique peut-il lire les classes du module nommé dans le paquet exporté dans Java 9?

J'ai mon module nommé et soudé soi-même comme module automatique. Dans mon module je

module my.module { 
    requires weld.se.shaded; 
    exports com.foo; 
} 

NewClass

package com.foo; 

import javax.enterprise.context.ApplicationScoped; 
import javax.inject.Inject; 

@ApplicationScoped 
public class NewClass { 

    @Inject 
    private NewBean bean; 

    public void doIt() { 
     bean.doIt(); 
    } 

} 

classe NewBean

package com.foo; 

import javax.enterprise.context.Dependent; 

@Dependent 
public class NewBean { 

    public void doIt() { 
     System.out.println("I am doing it"); 
    } 
} 

Et c'est le résultat

Sep 18, 2017 2:33:12 PM org.jboss.weld.bootstrap.WeldStartup <clinit> 
INFO: WELD-000900: 3.0.2 (2017-09-18 08:49) 
Sep 18, 2017 2:33:12 PM org.jboss.weld.environment.deployment.discovery.ReflectionDiscoveryStrategy processAnnotatedDiscovery 
INFO: WELD-ENV-000014: Falling back to Java Reflection for bean-discovery-mode="annotated" discovery. Add org.jboss:jandex to the classpath to speed-up startup. 
Sep 18, 2017 2:33:12 PM org.jboss.weld.bootstrap.WeldStartup startContainer 
INFO: WELD-000101: Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously. 
Exception in thread "main" java.lang.reflect.InaccessibleObjectException 
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488) 
    at java.base/java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:590) 
    at java.base/java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:996) 
    at [email protected]/org.jboss.weld.executor.AbstractExecutorServices.checkForExceptions(AbstractExecutorServices.java:72) 
    at [email protected]/org.jboss.weld.executor.AbstractExecutorServices.invokeAllAndCheckForExceptions(AbstractExecutorServices.java:58) 
    at [email protected]/org.jboss.weld.executor.AbstractExecutorServices.invokeAllAndCheckForExceptions(AbstractExecutorServices.java:66) 
    at [email protected]/org.jboss.weld.bootstrap.ConcurrentBeanDeployer.createClassBeans(ConcurrentBeanDeployer.java:65) 
    at [email protected]/org.jboss.weld.bootstrap.BeanDeployment.createBeans(BeanDeployment.java:256) 
    at [email protected]/org.jboss.weld.bootstrap.WeldStartup.deployBeans(WeldStartup.java:422) 
    at [email protected]/org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:83) 
    at [email protected]/org.jboss.weld.environment.se.Weld.initialize(Weld.java:789) 
    at my.module/com.foo.NewMain.main(NewMain.java:47) 
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private com.foo.NewBean com.foo.NewClass.bean accessible: module my.module does not "opens com.foo" to module weld.se.shaded 
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:337) 
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:281) 
    at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:176) 
    at java.base/java.lang.reflect.Field.setAccessible(Field.java:170) 
    at [email protected]/org.jboss.weld.security.GetAccessibleCopyOfMember.of(GetAccessibleCopyOfMember.java:38) 
    at [email protected]/org.jboss.weld.security.GetAccessibleCopyOfMember.run(GetAccessibleCopyOfMember.java:44) 
    at [email protected]/org.jboss.weld.security.GetAccessibleCopyOfMember.run(GetAccessibleCopyOfMember.java:26) 
    at java.base/java.security.AccessController.doPrivileged(Native Method) 
    at [email protected]/org.jboss.weld.injection.FieldInjectionPoint.<init>(FieldInjectionPoint.java:65) 

Comment expliquer cette exception

Causée par: java.lang.reflect.InaccessibleObjectException: Impossible de Rendre privé com.foo.NewBean com.foo.NewClass.bean accessible terrain: Module my.module ne "ouvre com.foo" au module weld.se.shaded

Il y a une table hereenter image description here dont je peux comprendre que le module automatique peut lire module nommé (application). Alors pourquoi ça ne marche pas?

Répondre

4

Vous devriez probablement essayer de remplacer

exports com.foo 

dans votre module-info.java avec

opens com.foo 

La directive opens dans une déclaration du module déclare un paquet à être ouvert pour permettre à tous types dans le paquet, et tout leurs membres, et non seulement les types publics et leurs membres publics, sont pris en compte par les API qui prennent en charge l'accès privé ou un moyen de contourner ou de supprimer les contrôles par défaut du contrôle d'accès au langage Java.

+0

Oui, cela semble résoudre le problème. Pourriez-vous expliquer la différence entre 'opens' et' exports'? –