Apache POI Запись в Excel Работает в Eclipse, но не после компиляции в Jar в OpenJDK 11 - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть проект, который включает в себя запись в электронную таблицу Excel (.xlsx) с использованием Apache POI XSSFWorkbook () class.

Он отлично работал в предыдущей версии Apache POI для Java 8. Недавно мы перенесли нашу кодовую базу в OpenJDK 11 и обновили нашу версию Maven для Apache POI до 4.1.0, как указано в FAQ Apache POI FAQ .

В Eclipse Сам он может генерировать таблицы Excel для моего рабочего стола, как и ожидалось (на компьютере с Win 7). Однако после создания пакета maven в файл jar версия jar не работает.

Я что-то неправильно компилирую? Фрагмент ниже (не содержит все классы, так как есть куча других классов, которые читают данные из другого источника)

private Workbook getWorkbook(String excelFilePath)
        throws IOException, EncryptedDocumentException, InvalidFormatException {
    Workbook workbook = null;

    if (excelFilePath.endsWith("xlsx")) {
        workbook = new XSSFWorkbook();
    //} else if (excelFilePath.endsWith("xls")) {
        //workbook = new HSSFWorkbook();
    } else {
        throw new IllegalArgumentException("The specified file is not Excel file");
    }

    return workbook;
}

public void writeReport(String excelFilePath) throws Exception {
    workbook = getWorkbook(excelFilePath);
    createHelper = workbook.getCreationHelper();

    //Summary Sheet
    TCOTSummarySheet summarySheet = new TCOTSummarySheet(workbook);
    summarySheet.setProject(PROJECT);
    summarySheet.setMaps(headerInfo, reportInfo, queryLinks);
    summarySheet.createSheet();

    //Bug Breakdown Sheet
    if (bugBreakdownFlag) {
        TCOTBugBreakdownSheet bugBreakdownSheet = new TCOTBugBreakdownSheet(workbook);
        bugBreakdownSheet.setSummarySheet(summarySheet);
        bugBreakdownSheet.setMaps(headerInfo, reportInfo, queryLinks);
        bugBreakdownSheet.createSheet();
    }


    //Complete Write
    try (FileOutputStream outputStream = new FileOutputStream(excelFilePath)) {
        workbook.write(outputStream);
    }
    catch (Exception e) {
        System.out.println(e.getLocalizedMessage());
    }
    workbook.close();
}

РЕДАКТИРОВАТЬ:

Чтобы дать больше контекста в всеобъемлющем project это проект JavaFX, написанный на OpenJDK 11.

Эта конкретная часть включает в себя запуск приложения Swing, выполняемого из JavaFX. На самом деле это приложение Swing использует Apache POI для генерации отчетов Excel. Возможно, это связано с проблемой многопоточности?

РЕДАКТИРОВАТЬ 2: Добавлено изображение трассировки стека enter image description here

РЕДАКТИРОВАТЬ 3: Я попытался добавить зависимости javax в мой pom . xml, а также попытался добавить их в качестве внешних библиотек, на которые ссылаются, но безрезультатно.

<!-- JAXB/Javax Dependencies -->
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.4.0-b180830.0359</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.activation/javax.activation-api -->
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>javax.activation-api</artifactId>
        <version>1.2.0</version>
    </dependency>

Я компилировал с пакетом maven.

1 Ответ

0 голосов
/ 02 марта 2020

Проблема заключалась в том, что пользовательский образ среды выполнения не включал jdk.charsets

Необходимо включить jdk.charsets при использовании приложения jlink при создании сред выполнения, используемых apache poi.

...