java: jakarta.inject.Provider.get() 被定义在一个不可访问的类或接口中

问题描述

我正在尝试在我的 Java (SE) FX 应用程序中使用 dependency injection,但在使用以下代码时出现错误 java: jakarta.inject.Provider.get() is defined in an inaccessible class or interface

@Log4j2
public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Weld weld = new Weld();
        try (WeldContainer container = weld.initialize()) {
            container.select(MainWindowLoader.class).get().loadMainWindow(primaryStage);
        }
    }
}

MainWindowLoader 类如下所示。

public class MainWindowLoader {
  public void loadMainWindow(Stage primaryStage) throws Exception {
    Parent parent = FXMLLoader.load(getClass().getResource("/MainWindow.fxml"));

    Scene scene = new Scene(parent);

    final ObservableList<String> stylesheets = scene.getStylesheets();
    stylesheets.addAll(getClass().getResource("/css/style.css").toExternalForm());

    primaryStage.setTitle("Avengers Manager");
    primaryStage.setScene(scene);

    primaryStage.show();
  }
}

我正在使用以下依赖项。

<!-- weld for dependency injection -->
<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se-core</artifactId>
    <version>4.0.1.SP1</version>
</dependency>

我唯一的一个 module-info.java 文件看起来像这样。

module avengers-manager {

  requires weld.se.core;
  requires weld.environment.common;
  requires weld.core.impl;
  requires jakarta.inject;

  opens us.tony.stark.avengers-manager;
}

有什么想法吗?

解决方法

对此的解决方案是使用阴影依赖。

<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se-shaded</artifactId>
    <version>4.0.1.SP1</version>
</dependency>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...