2016-11-17 249 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。我试着做下面的步骤与最新的iText 7.0.1取代的JasperReport的iText 2.1.7:用最新的iText 7.0.1替换JasperReport iText 2.1.7

1.排除默认的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.运行MVN和测试报告功能,我得到了以下错误:

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

它看起来像Jasp erReport正在尝试查找名称空间为“com.lowagie ...”的旧iText类。 我试图解压缩新的iText 7.0.1 jar包,这些类位于包“com.itextpdf ...”中。

如何让JasperReport调用新的iText jar?

+3

*“我怎样才能让JasperReport调用新的iText jar?”* - ***重写正在使用iText的JasperReport类!***严肃地说,你不想说你只是替换依赖一个版本的主要部分增加了5(2.1.7乘7.0.1),并期望所有东西都可以直接使用,对吗?不仅类的包已经改变,7.x API是完全重写的,兼容性被设计破坏以摆脱许多旧罪。 – mkl

+0

有人在Jasper报告网站上提出了同样的问题:http://community.jaspersoft.com/questions/1035351/itext7-support。如果你看那个页面,看看它是否得到了维护Jasper Reports的人的回答,这可能会很有用。 –

回答

3

您不能用iText 7替换iText 2.1.7,因为两个版本之间的差异太大。我们确实知道一些使用JasperReports使用iText 5的人。这需要对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的7取代的iText 2.1.7最大的问题,就是JasperReports的依赖PdfGraphics2D,我们没有将该部分移植到iText 7(尚未)。我们甚至可能决定不移植那部分,因为如果您选择使用PdfGraphics2D(而且PDF/UA变得越来越重要),则无法创建PDF/UA。

(*)2009年,我决定从包名中删除我的名字。当我第一次发布iText时,我只拥有lowagie.com域名,并且我使用com.lowagie包来编写我编写的所有Java代码。我没有想到iText会取得这样的成功。当每个人都开始使用iText时,每个人都开始亲自问我问题。我再也没有生活。因此,我创建了一家公司,我们专业化iText,用更中立的com.itextpdf代替com.lowagie就是其中的一个专业化。

+0

感谢布鲁诺的回复。另外的问题,如果我们在JasperReport中继续使用iText 2.1.7,是否存在IP问题? –

+0

这在iText FAQ中有详细解释:http://developers.itextpdf.com/question/versions-older-than-5 –