Загрузить ресурс из другого модуля в Java 11 - PullRequest
3 голосов
/ 16 июня 2020

Использование Java 11 и Gradle.
Наличие модулей - база данных и пользовательский интерфейс.

Имеет следующую структуру:

.
├── build.gradle
├── database
│   ├── build.gradle
│   └── src
│       ├── main
│       │   ├── java
│       │   │   └── com
│       │   │       └── company
│       │   │           └── services
│       │   │               └── LoadData.java
│       │   └── resources
│       └── test
│           └── resources
│               └── dbinit
│                   └── data.sql
└── ui
    ├── build.gradle
    └── src
        ├── main
        │   ├── java
        │   └── resources
        └── test
            ├── java
            │   └── com
            │       └── company
            │           └── ui
            │               └── tests
            │                   └── BaseUI.java
            └── resources

Я бы хотел выполнить в классе BaseUI из модуля пользовательского интерфейса метод класса LoadData из модуля базы данных.
Этот метод должен получить файл из ресурсов базы данных и произвести некоторые манипуляции.
Но при его выполнении я получаю исключение нулевого указателя.

public class BaseUI {
    @Test
    public void getData(){
        LoadData loadData = new LoadData();
        loadData.insertData("dbinit/data.sql"); 
    }
}

public class LoadData {
    public void insertData(String fileName){
        BufferedReader reader = new BufferedReader(new InputStreamReader(
        LoadData.class.getClassLoader().getResourceAsStream(fileName)));
    }
}

Насколько я понимаю, он ищет файл внутри модуля ui, а не внутри модуля базы данных.
Если я перенесу метод getData в класс LoadData - все работает.
В Java 9 можно было сделать следующее, но в Java 11 устарело:

Optional<Module> otherModule = ModuleLayer.boot().findModule("database");
otherModule.getResourceAsStream("dbinit/data.sql");
...