我在POM中使用Apache Poi版本3.8。但由于某些内部依赖性,它仍在下载poi-3.2和poi-3.8(可能)。对我来说奇怪的行为是我的项目使用poi-3.2甚至我在POM中提到了3.8版本。我已经谷歌搜索了同样的东西,但发现自己不走运。 这是我的POM条目:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.8</version>
<type>jar</type>
</dependency>
我已经通过代码检查了我的项目在类路径中使用的poi jar:
ClassLoader classloader =
org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader();
URL res = classloader.getResource(
"org/apache/poi/poifs/filesystem/POIFSFileSystem.class");
String path = res.getPath();
System.out.println("Core POI came from " + path);
打印:
Core POI came from file:/D:/Software/Softwares/apache-tomcat-6.0.33/webapps/scd-web/WEB-INF/lib/poi-3.2.jar!/org/apache/poi/poifs/filesystem/POIFSFileSystem.class
在同一个文件夹中有一个poi-3.8.jar,但是类路径拾取3.2。
我的问题是: 我该怎么办才能使我的项目使用poi-3.8.jar而不是poi-3.2.jar。
非常感谢!!
编辑:
输出mvn dependency:tree
[INFO] Building SCD-common [INFO] task-segment: [dependency:tree]
[INFO]
------------------------------------------------------------------------
[WARNING] While downloading xmlbeans:xmlbeans:2.3.0 This artifact has been relocated to org.apache.xmlbeans:xmlbeans:2.3.0.
[INFO] [dependency:tree] [INFO] com.idc:scd-common:jar:4.2.0.5
[INFO] +- org.springframework:spring-webmvc:jar:2.5.6:compile
[INFO] | +- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] | +- org.springframework:spring-beans:jar:2.5.6:compile
[INFO] | +- org.springframework:spring-context-support:jar:2.5.6:compile
[INFO] | \- org.springframework:spring-web:jar:2.5.6:compile
[INFO] +- com.idc.worldwide.keystones:service-single-signon-dynamo-api:jar:1.0:compile
[INFO] +- com.idc.worldwide.keystones:service-single-signon-dynamo-database-impl:jar:1.0.3:compile
[INFO] | +- org.apache:commons-dbcp:jar:1.2.2:compile
[INFO] | +- org.apache:commons-pool:jar:1.4:compile
[INFO] | \- com.idc.worldwide.webchannel:sage-core:jar:3.2.0.001:compile
[INFO] | +- com.idc.webchannel.legacy.sage-dependencies:aspose-slides:jar:1. 0:compile
[INFO] | +- com.servlets:cos:jar:09May2002:compile
[INFO] | +- com.sun:jai_codec:jar:1.1.3:compile
[INFO] | +- com.sun:jai_core:jar:1.1.3:compile
[INFO] | +- com.verity:k2:jar:5.00.3177.0:compile
[INFO] | +- org.apache:poi:jar:3.2:compile
[INFO] | +- org.apache:poi_contrib:jar:3.2:compile
[INFO] | +- org.apache:poi_scratchpad:jar:3.2:compile
[INFO] | \- org.springframework:spring:jar:2.5.6:compile
[INFO] +- org.springframework:spring-core:jar:3.0.5.RELEASE:compile
[INFO] | \- org.springframework:spring-asm:jar:3.0.5.RELEASE:compile
[INFO] +- org.springframework:spring-aop:jar:3.0.5.RELEASE:compile
答案 0 :(得分:3)
有various mvn command来帮助解决此问题:
mvn dependency:analyze-dep-mgt
将打印有关依赖性解析的详细信息。
mvn dependency:tree
将打印依赖关系树(非常有助于查看依赖关系的依赖关系)
将打印由pom层次结构合并产生的pom。
如果你没有找到任何带有maven的poi-3.2的引用,你可以在IDE中查看你的类路径。你是否通过maven添加任何jar?
使用这些命令的结果编辑您的问题可以帮助我们。
答案 1 :(得分:2)
运行
mvn dependency:tree
检查哪个库对poi 3.2具有传递依赖性。然后,您可以将它排除在您的pom中。
<dependency>
<groupId>sample.group</groupId>
<artifactId>sample-artifactB</artifactId>
<version>1</version>
<exclusions>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
</exclusion>
</exclusions>
</dependency>
答案 2 :(得分:2)
看起来像
org.apache:poi:jar:3.2
是
的编译依赖项com.idc.worldwide.keystones:service-single-signon-dynamo-database-impl
(虽然我认为你可能会削减一些东西)
和
org.apache.poi:poi:jar:3.8
不是依赖项(它不在依赖关系树中)。
确保您的<dependency>
条目在<dependencies>
标记内。
答案 3 :(得分:0)
也许你正在将普通依赖与插件依赖混合在一起,请参阅here(不太合适的答案)。
如果您有子项目,请在根POM中使用依赖关系管理。