jarパッケージの衝突を解決するための共通の方法のまとめ

7836 ワード

1.問題
まず、変な問題があります.
Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.apache.http.impl.client.HttpClientBuilder.setSSLContext(Ljavax/net/ssl/SSLContext;)Lorg/apache/http/impl/client/HttpClientBuilder
httpsの要求を送るところは全部このエラーを報告します.コードを確認して、HttpClintBuiderを使っていません.でも、httpsclientを使う時に使うと見つけられます.
HttpClients.custom().setSSLContext(context).build()
2.考え方と実践
1.証明書が間違っていますか
まずhttpsの要求ミスが確認できます.最近新しい証明書を交換したので、ssl証明書の問題があると思います.
2.httpsの要求が間違っていますか?
ローカルでhttpsを使って要求してみましたが、完全に正常です.サーバーにアップロードしたJArパッケージが衝突したという疑いしかありません.
3.jarパッケージ衝突
友達のjarカバンを新しく追加しましたので、このカバンが衝突したのではないかと疑っています.確かに衝突したと証明します.
3.問題解決
1.統一したカバンを使う
友商のカバンを見たら、4.4のhttpclientカバンを使っていますが、4.5のカバンを使っていますので、衝突しました.友達にフィードバックします.彼に4.5のjarカバンを使わせてはいけません.そして4.4のカバンを使いたいですが、4.4のカバンは私が使っているhttp方法がないので、jarカバンの衝突問題を解決しなければなりません.
2.共通の方法
a.IDEAを使って依存関係を確認し、衝突があればExcludeを右クリックしてもいいです.
解决jar包冲突通用方法汇总_第1张图片 ideaは衝突jarパッケージを自動的に統合します.pomコードの中ではこうなります.
<dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.12version>
            <scope>testscope>
            <exclusions>
                <exclusion>
                    <artifactId>hamcrest-coreartifactId>
                    <groupId>org.hamcrestgroupId>
                exclusion>
            exclusions>
        dependency>
b.自分でpomファイルを修正する
自分でコードを修正します.上記のように、exclusionを追加すればいいです.外部jarパッケージを導入したので、system Pathタグとscopeタグを追加しました.残念ですが、問題は解決できません.地元が正しいです.しかし、オンラインは間違っています.この時は、mavenプロジェクトは構築時に外部のjarパッケージを優先的に導入したと推測します.
<dependency>
            <groupId>authgroupId>
            <artifactId>open-sdkartifactId>
            <version>1.3.2version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-apiartifactId>
                    <groupId>org.slf4jgroupId>
                exclusion>
            exclusions>
            <scope>systemscope>
            <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/open-sdk-1.3.2.jarsystemPath>
        dependency>
補足してください.scopeラベルの使い方:
  • compleデフォルトのscopeは、dependencyがライフサイクルで使用できるという意味です.そして、これらのdependenciesは依存するプロジェクトに伝達されます.すべての段階に適用して、プロジェクトと一緒に
  • を発表します.
  • providedはcompleと似ていますが、dependencyはJDKまたはコンテナによって提供されることを示しています.例えば、Servlet APと一部のJava EE API.このscopeはコンパイルとテストの間だけ使えます.伝達性がありません.
  • runtimeはdependencyがコンパイル時に機能しないと表していますが、運転とテスト時にJDBCドライバのように、運転とテスト段階が適用されます.
  • testはdependency作用がテスト時に動作しないと表しています.テスト時のみ使用して、試験コードのコンパイルと実行に使用します.プロジェクトに従って発表されません.
  • systemはprovidedと似ていますが、システムでは外部JARパッケージとして提供されています.Mavenはrepositoryで検索しません.
  • c.mavenのロードjarのパッケージ順序を修正する.
    mavenロードjarパッケージの順序は、ルートの長さによって、短いパスのjarパッケージを優先的にロードするので、導入したパッケージ名を成長させてみました.openwerwer-sdk-1.3.2.jar:
    <dependency>
                <groupId>authgroupId>
                <artifactId>openwerwerwerwer-sdkartifactId>
                <version>1.3.2version>
                <exclusions>
                    <exclusion>
                        <artifactId>slf4j-apiartifactId>
                        <groupId>org.slf4jgroupId>
                    exclusion>
                exclusions>
                <scope>systemscope>
                <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/openwerwerwerwer-sdk-1.3.2.jarsystemPath>
            dependency>
    ライン展開、成功!
    4.まとめ
    開発の過程で、オンライン環境とライン下の生産環境が違ってくるかもしれません.プリインストール環境を優先してテストする必要があります.テストする時、一歩ごとの間違いの原因を明らかにすることを優先して、debugの効率を高めることに役立って、多くの回り道を避ける.