3

POM で Apache Poi バージョン 3.8 を使用しています。しかし、いくつかの内部依存関係のために、poi-3.8 と一緒に poi-3.2 をダウンロードしています (そうかもしれません)。私にとって奇妙な動作は、POM で 3.8 バージョンについて言及した場合でも、poi-3.2 を使用する私のプロジェクトです。私は同じことをたくさんグーグルで検索しましたが、運が悪いことに気づきました。ここに私の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.2.jar の代わりに poi-3.8.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
4

4 に答える 4

3

この問題の解決に役立つさまざまな mvn コマンドがあります。

mvn dependency:analyze-dep-mgt

依存関係の解決に関する詳細を表示します。

mvn dependency:tree

依存関係ツリーを出力します (依存関係の依存関係を確認するのに非常に役立ちます)

mvn help:effective-pom

pom 階層のマージの結果として生じる pom を出力します。

maven で poi-3.2 への参照が見つからない場合は、IDE でクラスパスを確認できます。jar バイパス maven を追加しますか?

これらのコマンドの結果を使用して質問を編集すると、役立つ場合があります。

于 2012-12-31T11:46:18.477 に答える
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>タグ内にあることを確認してください。

于 2012-12-31T12:36:20.280 に答える
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>
于 2012-12-31T11:44:39.793 に答える
0

おそらく、通常の依存関係とプラグインの依存関係が混在している可能性があります。ここを参照してください(あまり適切な答えではありません)。

子プロジェクトがある場合は、ルート POM で依存関係管理を使用します。

于 2012-12-31T11:40:32.133 に答える