2016-11-17 6 views
3

Мы используем JasperReport 6.1.0, которая имеет зависимость от com.lowagie: itext: jar: 2.1.7.js2. Похоже, что iText 2.1.7 имеет IP-проблему, и iText просит всех пользователей использовать последнюю версию, требующую коммерческой лицензии. Поэтому мы хотели бы купить лицензию iText. Теперь последняя версия iText - 7.0.1. Я попытался сделал следующие шаги, чтобы заменить JasperReport в IText 2.1.7 с последними IText 7.0.1:Замените JasperReport iText 2.1.7 на последнюю версию iText 7.0.1

1. Exclude по умолчанию IText 2.1.7 зависимость в pom.xml

<dependency> 
    <groupId>net.sf.jasperreports</groupId> 
    <artifactId>jasperreports</artifactId> 
    <version>6.1.0</version> 
    <exclusions> 
    <exclusion> 
     <groupId>com.lowagie</groupId> 
     <artifactId>itext</artifactId> 
    </exclusion> 
    ... 

2. Добавить новые банки IText в pom.xml

<dependency> 
    <groupId>com.itextpdf</groupId> 
    <artifactId>barcodes</artifactId> 
    <version>7.0.1</version> 
    <!-- barcodes depends on kernel --> 
</dependency> 
<dependency> 
    <groupId>com.itextpdf</groupId> 
    <artifactId>font-asian</artifactId> 
    <version>7.0.1</version> 
</dependency> 
<dependency> 
    <groupId>com.itextpdf</groupId> 
    <artifactId>forms</artifactId> 
    <version>7.0.1</version> 
    <!-- forms depends on kernel and layout --> 
</dependency> 
<dependency> 
    <groupId>com.itextpdf</groupId> 
    <artifactId>hyph</artifactId> 
    <version>7.0.1</version> 
</dependency> 
<dependency> 
    <groupId>com.itextpdf</groupId> 
    <artifactId>io</artifactId> 
    <version>7.0.1</version> 
</dependency> 
<dependency> 
    <groupId>com.itextpdf</groupId> 
    <artifactId>kernel</artifactId> 
    <version>7.0.1</version> 
    <!-- kernel depends on io --> 
</dependency> 
<dependency> 
    <groupId>com.itextpdf</groupId> 
    <artifactId>layout</artifactId> 
    <version>7.0.1</version> 
    <!-- layout depends on kernel --> 
</dependency> 
<dependency> 
    <groupId>com.itextpdf</groupId> 
    <artifactId>pdfa</artifactId> 
    <version>7.0.1</version> 
    <!-- pdfa depends on kernel --> 
</dependency> 
<dependency> 
    <groupId>com.itextpdf</groupId> 
    <artifactId>sign</artifactId> 
    <version>7.0.1</version> 
    <!-- sign depends on kernel, layout and forms --> 
</dependency> 

3. Выполнить МВН и функция отчет об испытаниях, я получил ниже ошибки:

2016-11-17 14:43:36,520 ERROR [c.i.c.d.DeferredOperationManager] [ Thread-49] Exception on Deferred Operation. Operation UUID: 2a647922-d6d0-450d-9b2d-4d97638ba03f. UI Error key:d9a16093-be20-4278-9f8b-93120c0a2231 - Error: java.lang.NoClassDefFoundError: com/lowagie/text/SplitCharacter

Это выглядит л ike JasperReport пытается найти старые классы iText, пространство имен которых «com.lowagie ...». Я попытался распаковать новую iText 7.0.1 jar, классы в пакете «com.itextpdf ...».

Как я могу заставить JasperReport вызывать новый баннер iText?

+3

* «Как я могу заставить JasperReport вызывать новый баннер iText?» * - *** Переписать классы JasperReport, которые используют iText! *** Серьезно, вы не хотите говорить, что вы просто заменяете зависимость с версией, большая часть которой увеличена на 5 (2.1.7 на 7.0.1) и ожидаете, что все будет готово, не так ли? Изменены не только пакеты классов, API 7.x - это полная переписывание, совместимость нарушена дизайном, чтобы избавиться от многих старых грехов. – mkl

+0

Кто-то задал тот же вопрос на веб-сайте отчетов Jasper: http://community.jaspersoft.com/questions/1035351/itext7-support. Было бы полезно, если бы вы просмотрели эту страницу, чтобы узнать, получает ли она ответ от людей, которые поддерживают отчеты Jasper. –

ответ

3

Вы не можете заменить iText 2.1.7 iText 7, потому что различия между двумя версиями слишком велики. Мы знаем некоторых людей, которые перешли на использование iText 5 с JasperReports. Для этого требуется ряд изменений в JasperReports, таких как изменение имен пакетов с com.lowagie по номеру com.itextpdf (*) и изменение ссылок на com.lowagie.text.Color на номер com.itextpdf.text.BaseColor.

В iText мы заметили, что мы поразили потолок iText 5. Например: мы сохраняем текст с использованием char, что означает, что каждый символ хранится с использованием всего 2 байтов. Этого было недостаточно, если мы хотели поддержать хинди. Нам пришлось переписать полный слой шрифта, если мы хотим добавить поддержку языков индексов в iText. «Замена слоя шрифта» в iText 5 было бы очень сложно, так как слой шрифта стал основой, на которой строится весь остальной код. Отсюда наше решение переписать полный API.

Вы можете посмотреть видео, которое входит в более подробно о данном решении здесь: Devoxx 2016: "Oops I broke my API"

Однако: самая большая проблема с заменой IText 2.1.7 с IText 7, является то, что JasperReports зависит от PdfGraphics2D и мы не имеем портировал эту часть на iText 7 (пока). Мы даже можем решить не переносить эту часть, потому что невозможно создать PDF/UA, если вы решите использовать PdfGraphics2D (и PDF/UA становится все более и более важным).

(*) В 2009 году я решил удалить свое имя из имен пакетов. Когда я впервые выпустил iText, мне принадлежал только домен lowagie.com, и я использовал com.lowagie пакеты для всего кода Java, который я написал. Я не ожидал, что iText достигнет такого успеха. Когда все начали использовать iText, все начали задавать мне вопросы лично. У меня больше не было жизни. Поэтому я создал компанию, мы профессионализировали iText и заменили com.lowagie тем, что более нейтральным com.itextpdf была одна из тех профессионализаций.

+0

Спасибо Бруно за ответ. Дополнительный вопрос, если мы продолжаем использовать iText 2.1.7 в JasperReport, есть ли проблема IP? –

+0

Это подробно объясняется в FAQ iText: http://developers.itextpdf.com/question/versions-older-than-5 –

Смежные вопросы