从昨天开始,由于iText jar,我在使用maven进行编译时遇到了问题。我的项目依赖于jasperreports-2.0.1,它依赖于itext-1.02b或更高版本。
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>[1.02b,)</version>
<scope>compile</scope>
</dependency>
这是maven中的日志错误:
Failed to collect dependencies for [jasperreports:jasperreports:jar:2.0.1 (compile)]: Failed to read artifact descriptor for com.lowagie:itext:jar:4.2.2: Could not transfer artifact com.itextpdf:itextpdf:pom:4.2.2 from/to jaspersoft (http://www.jasperforge.org/maven2): Access denied to http://www.jasperforge.org/maven2/com/itextpdf/itextpdf/4.2.2/itextpdf-4.2.2.pom. Error code 403, Forbidden -> [Help 1]
我看到here来自Amedee Van Gasse的评论,该评论说明了一个没有jar的4.2.2版本。
为什么1.02b版本附加到4.2.2?
编辑:Jasper-reports使用开放版本范围:
[1.02b)
这个范围说maven采取图书馆最新版本。
随着来自iText的update添加新版Pom没有jar并编辑maven-central的maven-metadata到no-jar版本根据最新的com.lowagie库将编译崩溃到所有jar。
在本地更新您的maven-metadata-central.xml(以及其他元数据,如果您的公司拥有它自己的nexus.public)从... m2 \ repository \ com \ lowagie \ itext到那个工作。暂时解决方案直到iText更新元数据或所有依赖于它的最新版本的公司更新它的pomcom
<metadata modelVersion="1.1.0">
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<versioning>
<latest>4.2.1</latest>
<release>4.2.1</release>
<versions>
<version>0.99</version>
<version>1.1.4</version>
<version>1.02b</version>
<version>1.2.3</version>
<version>1.3</version>
<version>1.3.1</version>
<version>1.4</version>
<version>1.4.8</version>
<version>2.0.1</version>
<version>2.0.6</version>
<version>2.0.7</version>
<version>2.0.8</version>
<version>2.1.0</version>
<version>2.1.2</version>
<version>2.1.3</version>
<version>2.1.4</version>
<version>2.1.5</version>
<version>2.1.7</version>
<version>4.2.0</version>
<version>4.2.1</version>
</versions>
<lastUpdated>20150709153501</lastUpdated>
</versioning>
</metadata>
一个更简单的解决方案可能是升级到更新版本的jasperreports
。版本6.1.0
依赖于iText:
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7.js2</version>
<scope>compile</scope>
</dependency>
不再对iText有“浮动”依赖,而且它是为jasperreports定制的版本!
有关完整的http://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports/6.1.0,请参阅pom.xml
。
问题确实存在于碧玉报道的POM中:
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>[1.02b,)</version>
<scope>compile</scope>
</dependency>
Jasper-reports至少从2012年11月开始分发(修改过的)iText 2.1.7
版本(如果内存对我很好),所以如果你的jasper-reports版本仍然依赖于1.02b
及其版本,那么它必须是一个非常古老的版本。
jasper-reports对iText的依赖应改为:
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>[1.02b,2.1.7]</version>
<scope>compile</scope>
</dependency>
要不就:
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
<scope>compile</scope>
</dependency>
这与这个问题有关:How do I tell Maven to use the latest version of a dependency?该页面充满了关于始终使用最新版本的依赖关系的警告。它降低了构建的可重复性。
2.1.7
是iText Group NV(或其合法前身)与com.lowagie
groupId发布的iText的最后一个版本。由iText Group NV公司发布的iText的下一个版本是版本5.0.0
,带有com.itextpdf
groupId,这意味着它的二进制文件与您当前的代码不兼容。还有AGPL许可证更改的问题,但这超出了StackOverflow的范围,我想限制我对技术问题的回答。
2.1.7
和5.0.0
之间的任何其他版本的iText,如4.2.0
和4.2.1
,都是其他公司的叉子。根据Apache将工件上传到中央存储库(https://maven.apache.org/guides/mini/guide-central-repository-upload.html)的指南,这些公司应该使用不同的groupId,因为该页面在其FAQ中清楚地说明:
我有一个在foo.com开发的foo项目的补丁版本,我应该使用什么groupId?当您修补/修改第三方项目时,该修补版本将成为您的项目,因此应该作为您将要开发的任何项目控制的groupId下分发,而不是在com.foo下。请参阅有关groupId的上述注意事项。
TL; DR如果您不想更改代码,请告诉您的Maven只能获得iText 2.1.7。
我们决定保持相同的jasperreport版本,并在冲突pom中进行此更改:
<dependencies>
<dependency>
<groupId>jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>2.0.1</version>
<exclusions>
<exclusion>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
...
</dependencies>
编辑:将依赖关系更改为2.1.7以确定将来会编译
JasperReports修补了iText并修复了一些错误。因此,您必须在pom / gradle文件中添加已修补的iText repo [1]。
[1] http://jasperreports.sourceforge.net/maven2/
以下是使用jasper报告6.1.1时的参考资料片段供您参考。
repositories {
mavenLocal()
mavenCentral()
maven { url "http://repo.spring.io/release" }
maven { url "http://jaspersoft.artifactoryonline.com/jaspersoft/third-party-ce-artifacts/" }
maven { url "http://jasperreports.sourceforge.net/maven2/" }
}
我们有同样的问题。为了解决这个问题,我们删除了Maven配置的代理参数,并更改了maven-metadata-central的最新版本(在存储库的com \ lowagie \ itext文件夹中)。
一个糟糕的解决方案,但是,暂时的,有效:/
我正在使用gradle,对于当前版本6.8.2
,我得到以下构建错误:
> Could not find com.lowagie:itext:2.1.7.js6
所以我添加了http://jaspersoft.jfrog.io/jaspersoft/third-party-ce-artifacts/
作为存储库,现在它的工作原理。
repositories {
mavenCentral()
maven { url "http://jaspersoft.jfrog.io/jaspersoft/third-party-ce-artifacts/" }
}
dependencies {
compile 'net.sf.jasperreports:jasperreports:6.8.0'
}
我在使用Maven 2.2.1时遇到了同样的问题,我使用Maven 3.2.3及其作品重新构建了我的项目!
你必须使用Maven 3来解决你的问题,这个版本似乎解决了这个bug。