Mavenでのoptionとexclusionの違い

6224 ワード

Optional Dependencies
できないとき(どのような理由であれ)プロジェクトをサブモジュールに分割する場合、option依存項目が使用されます.いくつかの依存項目はプロジェクト内のいくつかの機能にのみ使用され、この機能を使用しない場合は必要ありません.理想的には、このような機能はコア機能プロジェクトに依存するサブモジュールに分割されます.この新しいサブプロジェクトにはオプションでない依存項目しかありません.サブプロジェクトの機能を使用することを決めたら、それらが必要です.でも、アイテムは分割できないため(どのような理由であれ)、これらの依存項目はオプションとして宣言されます.ユーザーがオプション依存項目に関連する機能を使用する場合は、自分のアイテムにオプション依存項目を再宣言する必要があります.これは、この状況を処理する最も明確な方法ではありませんが、オプション依存項目と依存項目の除外はギャップソリューションです.
オプションの依存を使用する理由
オプションの依存項目は、スペースとメモリを節約します.これらは、問題のあるjarがライセンスプロトコルに違反したり、クラスパスの問題がWAR、EAR、jarなどにバンドルされたりすることを防止します.
オプションの依存をどのように使用しますか?
依存関係宣言で要素をtrueに設定することで、依存関係をオプションで宣言できます.
    
      ...
      
        
        
          sample.ProjectA
          Project-A
          1.0
          compile
          true 
        
      
    

オプションの依存項目はどのように使用しますか?
1.Project-A -> Project-B

上図はProject-AがProject-Bに依存していることを示している.この関係は、AがそのPOMにおいてBをオプション依存として宣言した場合も変わらない.通常の構築のように、Project-BはProject-Aのクラスパスに追加されます.
1.Project-X -> Project-A

別のアイテム(Project-X)がProject-AをPOMの依存として宣言すると、依存アイテムのオプションの性質が有効になります.Project-BはProject-Xのクラスパスに含まれていません.直接ProjectXのPOMに宣言して、BがXのクラスパスに含まれるようにする必要があります.
例を挙げる
X 2という名前のアイテムがHibernateと似たような機能を持っていると仮定します.MySQL、PostgreSQL、いくつかのバージョンのOracleなど、多くのデータベースをサポートします.サポートされている各データベースには、ドライバjarへの追加の依存が必要です.X 2を構築するには、これらの依存項目をすべてコンパイルする必要があります.ただし、プロジェクトは1つの特定のデータベースのみを使用し、他のドライバは必要ありません.X 2は、これらの依存をオプションとして宣言することができます.したがって、プロジェクトがPOMの直接依存としてX 2を宣言した場合、X 2でサポートされているすべてのドライバは、プロジェクトのクラスパスに自動的に含まれません.プロジェクトには、使用するデータベースの特定のドライバへの明示的な依存関係が含まれている必要があります.
exclusionsの使い方
問題のあるjarを含む要素を要素に追加します.
    
      ...
      
        
          sample.ProjectA
          Project-A
          1.0
          compile
          
              
              sample.ProjectB
              Project-B
            
           
        
      
    

依存項目排除の動作原理といつ使用するか(最後の手段として!)
    Project-A
       -> Project-B
            -> Project-D 
                  -> Project-E
                  -> Project-F
       -> Project C

この図は、Project−AがProject−BおよびC.Project−Bに依存することを示す.Project-DはProject-EとFに依存します.デフォルトでは、ProjectAのクラスパスには次のものが含まれます.
B, C, D, E, F

リポジトリにProject-Dの依存項目が一部欠けており、Project-BのProject-Dの機能に依存する必要がないため、プロジェクトDとその依存項目をプロジェクトAのクラスパスに追加したくないとします.Project-Bの開発者は、Project-D true optional>への依存をマークできます.
    
      sample.ProjectD
      ProjectD
      1.0-SNAPSHOT
      true
    

残念なことに、彼らはいません.最後の手段として、自分のPOMでProject-Aから除外することができます.
    
      4.0.0
      sample.ProjectA
      Project-A
      1.0-SNAPSHOT
      jar
      ...
      
        
          sample.ProjectB
          Project-B
          1.0-SNAPSHOT
          
            
              sample.ProjectD 
              Project-D
            
          
        
      
    

Project-Aをリポジトリに配備し、Project-XがProject-Aへの正常な依存性を宣言した場合、Project-Dはクラスパスから除外されますか?
Project-X -> Project-A

答えは肯定的だ.Project-Aは、Project-Dの実行を必要としないと宣言しているため、Project-Aの伝達依存項目として導入されません.
次に、Project-XがProject-Yに依存していることを考慮して、下図のようにします.
    Project-X -> Project-Y
                   -> Project-B
                        -> Project-D
                           ...

Project-YもProject-Bに依存しており、Project-Dがサポートする機能が確かに必要です.したがって、Project-Dは依存リストから除外されません.Project-Eを解析できる追加のリポジトリも提供できます.この場合、Project-Yの正当な依存性であるため、Project-Dをグローバルに排除しないことが重要です.
もう1つのケースでは、必要でない依存項目がProject-Eであり、Project-Dではないとします.どうやって排除しますか?次の図を参照してください.
    Project-A
       -> Project-B
            -> Project-D 
                  -> Project-E 
                  -> Project-F
       -> Project C

除外は、宣言されたポイントの下にある依存関係図全体に有効です.Project-DではなくProject-Eを除外する場合は、除外をProject-Eに変更するだけですが、除外項目をProject-Dに下に移動しないでください.Project-DのPOMを変えることはできません.可能な場合は、除外ではなくオプションの依存項目を使用するか、Project-Dを複数のサブプロジェクトに分割できます.各サブプロジェクトには通常の依存項目のみが含まれます.
    
      4.0.0
      sample.ProjectA
      Project-A
      1.0-SNAPSHOT
      jar
      ...
      
        
          sample.ProjectB
          Project-B
          1.0-SNAPSHOT
          
            
              sample.ProjectE 
              Project-E
            
          
        
      
    

なぜ除外はPOMレベルではなく依存性に基づいているのですか?
これは、主に依存図が予測可能であることを確保し、排除すべきでない依存項目を排除することによって継承効果を維持するためである.最後の方法を採用し、排除しなければならない場合は、どの依存項目が不要な伝達依存をもたらしたかを絶対に確定する必要があります.
特定の依存項目がクラスパスに表示されず、パスを考慮しないことを確実にしたい場合は、[依存関係の禁止ルール]を設定できます(https://maven.apache.org/enforcer/enforcer-rules/bannedDependencies.html)に問題のある依存項目が見つかった場合、構築は失敗します.コンストラクションに失敗した場合は、強制実行プログラムが見つけた各パスに特定の除外項目を追加する必要があります.