代码之家  ›  专栏  ›  技术社区  ›  0x1C1B

具有依赖注入的Java模块化

  •  0
  • 0x1C1B  · 技术社区  · 6 年前

    让我们假设 开放JDK 11 + A Guide to Java 9 Modularity 供参考)。

    直到现在我把我所有的 JavaFX公司 基于Google依赖注入框架的项目 圭斯

    SQLiteCompassApplication.java文件

    public class SQLiteCompassApplication extends Application {
    
        public static void main(String[] args) {
            launch(args);
        }
    
        public void start(Stage stage) throws Exception {
    
             Injector injector = Guice.createInjector(new MyModule());
    
             FXMLLoader fxmlLoader = injector.getInstance(FXMLLoader.class);
    
             try(InputStream fxmlStream = getClass().getResourceAsStream("/view/View.fxml")) {
    
                Parent root = fxmlLoader.load(fxmlStream);
                stage.setScene(new Scene(root));
                stage.setTitle("SQLite Compass");
                stage.setOnCloseRequest(event -> System.exit(0));
                stage.show();
            }
        }
    }
    

    module-info.java模块

    module org.x1c1b.sqlitecompass {
    
        requires javafx.controls;
        requires javafx.fxml;
        requires com.google.guice;
    
        exports org.x1c1b.sqlitecompass;
    }
    

    圭斯 配置,这意味着 圭斯 模块( 为了与java模块混淆),它没有被粘贴,但仍然适用于非模块化项目。

    执行此代码时,我收到以下异常:

    Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field com.google.inject.Injector org.x1c1b.sqlitecompass.config.provider.FXMLLoaderProvider.injector accessible: module org.x1c1b.sqlitecompass does not "opens org.x1c1b.sqlitecompass.config.provider" to module com.google.guice
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:340)
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:280)
        at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:176)
        at java.base/java.lang.reflect.Field.setAccessible(Field.java:170)
        at com.google.guice@4.2.2/com.google.inject.internal.SingleFieldInjector.<init>(SingleFieldInjector.java:38)
        at com.google.guice@4.2.2/com.google.inject.internal.MembersInjectorStore.getInjectors(MembersInjectorStore.java:126)
        at com.google.guice@4.2.2/com.google.inject.internal.MembersInjectorStore.createWithListeners(MembersInjectorStore.java:93)
        at com.google.guice@4.2.2/com.google.inject.internal.MembersInjectorStore.access$000(MembersInjectorStore.java:36)
        at com.google.guice@4.2.2/com.google.inject.internal.MembersInjectorStore$1.create(MembersInjectorStore.java:45)
        at com.google.guice@4.2.2/com.google.inject.internal.MembersInjectorStore$1.create(MembersInjectorStore.java:41)
        at com.google.guice@4.2.2/com.google.inject.internal.FailableCache$1.load(FailableCache.java:40)
        at com.google.common@25.1-android/com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3444)
        at com.google.common@25.1-android/com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2193)
        at com.google.common@25.1-android/com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2152)
        at com.google.common@25.1-android/com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2042)
        ... 39 more
    Exception running application org.x1c1b.sqlitecompass.SQLiteCompassApplication
    

    opens org.x1c1b.sqlitecompass.config.provider; module-info.java

    我应该如何配置我的模块/ module-info.java模块 使用它 一般来说?是否可以使用 谷歌Guice 模块化 结合起来?

    编辑

    • 添加 exports org.x1c1b.sqlitecompass.config 圭斯 module-info.java模块
    • --add-opens java.base/java.lang=com.google.guice

    但我想这更像是一个解决办法 here

    0 回复  |  直到 6 年前
        1
  •  1
  •   mipa    6 年前

    你必须打开所有的包,这些包将通过Guice的反射来访问。 open 把这个词放在 module 在你的 module-info.java .