【问题标题】:Maven Dependancy Refereing old Poi VersionMaven 依赖引用旧的 Poi 版本
【发布时间】:2012-12-15 13:53:04
【问题描述】:

我在我的 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

【问题讨论】:

  • “mvn dependency:tree”的输出是什么?
  • @bowmore: its.. [INFO] 正在扫描项目... [INFO] Reactor 构建顺序:[INFO] 服务合同数据库 [INFO] SCD-common [INFO] SCD-WEB [INFO ] 搜索插件库下载:
  • 您应该将该输出放在问题中,而不是在评论中:)
  • 请查看我更新的问题。

标签: java jakarta-ee maven classpath apache-poi


【解决方案1】:

various mvn command帮助解决这个问题:

mvn dependency:analyze-dep-mgt

将打印有关依赖关系解析的详细信息。

mvn dependency:tree

将打印依赖关系树(非常有助于查看依赖项的依赖关系)

mvn help:effective-pom

将打印由您的 pom 层次结构合并产生的 pom。

如果您在 maven 中没有找到任何对 poi-3.2 的引用,您可以查看 IDE 中的类路径。你添加任何 jar 绕过 maven 吗?

使用这些命令的结果编辑您的问题可能有助于我们为您提供帮助。

【讨论】:

    【解决方案2】:

    看起来像

    org.apache:poi:jar:3.2
    

    的编译依赖
    com.idc.worldwide.keystones:service-single-signon-dynamo-database-impl
    

    (虽然我认为你可能剪了一些东西)

    org.apache.poi:poi:jar:3.8
    

    不是依赖(它不在依赖树中)。

    确保您的&lt;dependency&gt; 条目位于&lt;dependencies&gt; 标记内。

    【讨论】:

    • 感谢@bowmore,org.apache.poi:poi:jar:3.8 也是依赖项,正如我提到的整个输出太长,无法粘贴到此处。但是我看到3.8也在那里。
    • 尝试分析部分输出是没有好处的。如果您可以将其上传到其他地方(pastebin?)并提供链接,那肯定会有所帮助
    【解决方案3】:

    运行

    mvn dependency:tree 
    

    检查哪个库对 poi 3.2 有传递依赖。然后你可以在你的 pom.xml 中排除它。

    <dependency>
      <groupId>sample.group</groupId>
      <artifactId>sample-artifactB</artifactId>
      <version>1</version>
      <exclusions>
        <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
       </exclusion>
      </exclusions>
    </dependency>
    

    【讨论】:

      【解决方案4】:

      也许您将普通依赖与插件依赖混合在一起,请参阅here(不太合适的答案)。

      如果您有子项目,请在根 POM 中使用依赖管理。

      【讨论】:

        猜你喜欢
        • 2017-07-17
        • 2020-03-29
        • 2016-09-18
        • 2020-10-24
        • 2018-04-16
        • 2010-12-23
        • 1970-01-01
        • 2020-07-26
        • 2019-01-24
        相关资源
        最近更新 更多