Itext Java 11: незаконный рефлексивный доступ. Com.itextpdf.io.source.ByteBufferRandomAccessSource $ 1 - PullRequest
0 голосов
/ 14 ноября 2018

Недавно обновлен до Java 11 и начал выполнять проверку регрессии. В настоящее время при попытке вызова com.itextpdf.text.pdf.PdfReader.close появляется ошибка нелегального рефлексивного доступа. В настоящее время на Itext версии 5.5.13, но также попробовал на Itext 7.0.0 и имел ту же проблему.

У кого-нибудь есть предложения по устранению проблем совместимости между Java-11 и Itext?

ВНИМАНИЕ: произошла недопустимая операция доступа с отражением ВНИМАНИЕ: Незаконный рефлексивный доступ com.itextpdf.io.source.ByteBufferRandomAccessSource $ 1 (файл: ... репозиторий / com / itextpdf / io / 7.0.0 / io-7.0.0.jar) в метод java.nio.DirectByteBuffer.cleaner () ПРЕДУПРЕЖДЕНИЕ. это к хранителям com.itextpdf.io.source.ByteBufferRandomAccessSource $ 1 ПРЕДУПРЕЖДЕНИЕ. Использование --illegal-access = warn для включения предупреждений о дальнейших незаконных операциях доступа с отражением ВНИМАНИЕ: Все незаконные операции доступа будут отказано в будущем выпуске

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Пока я комментирую комментарии, призывающие вас отладить код и найти основную причину (а затем отправить запрос на извлечение) или создать проблему в iText Jira, если вы являетесь клиентом с контрактом на поддержку (что повысит приоритет проблемы), вот предложение обходного пути (которое я не проверял, но я шансы, что это будет работать):

Используйте конструкторы PdfReader и PdfWriter, которые принимают InputStream и OutputStream соответственно. В этом случае код, вызывающий проблему, не должен вызываться. То же самое для всех остальных случаев, когда iText взаимодействует с вашей файловой системой - упаковывать все в InputStream / OutputStream или работать с byte[] массивами.

Итак, эта строка:

new PdfDocument(new PdfReader(inFilePath), new PdfWriter(outFilePath))

становится таким:

new PdfDocument(new PdfReader(new FileInputStream(inFilePath)), 
                new PdfWriter(new FileOutputStream(outFilePath)))

Возможно, вы также захотите обернуть потоки в BufferedInputStream / BufferedOutputStream.

Аналогично, при работе с PdfFontFactory используйте методы, которые принимают byte[] вместо String, представляющего путь к файлу, и т. Д.

0 голосов
/ 14 ноября 2018

Если вам интересно, что такое нелегальный рефлексивный доступ, пожалуйста, обратитесь сюда: что такое нелегальный рефлексивный доступ

Это особое предупреждение приходит из этого класса:

https://github.com/itext/itext7/blob/develop/io/src/main/java/com/itextpdf/io/source/ByteBufferRandomAccessSource.java

Из этого конкретного метода:

private static boolean clean(final java.nio.ByteBuffer buffer) {
    if (buffer == null || !buffer.isDirect())
        return false;

    Boolean b = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
        public Boolean run() {
            Boolean success = Boolean.FALSE;
            try {
                // java 9
                if (UNMAP_SUPPORTED)
                    CLEANER.freeBuffer(buffer.toString(), buffer);
                // java 8 and lower
                else {
                    Method getCleanerMethod = buffer.getClass().getMethod("cleaner", (Class<?>[]) null);
                    getCleanerMethod.setAccessible(true);
                    Object cleaner = getCleanerMethod.invoke(buffer, (Object[]) null);
                    Method clean = cleaner.getClass().getMethod("clean", (Class<?>[]) null);
                    clean.invoke(cleaner, (Object[]) null);
                }
                success = Boolean.TRUE;
            } catch (Exception e) {
                // This really is a show stopper on windows
                Logger logger = LoggerFactory.getLogger(ByteBufferRandomAccessSource.class);
                logger.debug(e.getMessage());
            }
            return success;
        }
    });

    return b;
}

Эта строка точно:

getCleanerMethod.setAccessible(true);

Пока это предупреждение не мешает iText отРаботая, как и ожидалось, я думаю, что лучшее, что вы можете сделать, - это отправить вопрос / PR команде iText и дождаться, когда будет доступно исправление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...