[Maven実戦](8)依存構成と依存範囲

15455 ワード

1. 依存構成
基本構成に依存:

   
   
   
   
<project>
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<exclusions>
<exclusion>
<groupId>...</groupId>
<artifactId>...</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>

 
プロジェクトではjunit jarパッケージに依存するテストが必要です.依存構成は次のとおりです.

    
    
    
    
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>

ルート要素の下のprojectの下のdependenciesは、1つまたは複数のdependency要素を含み、1つまたは複数のプロジェクト依存性を宣言することができる.各依存に含まれる要素は次のとおりです.
 
groupId,artifactId,version:依存する基本座標は、いずれの依存にとっても基本座標が最も重要であり、Mavenは座標に基づいて必要な依存を見つけることができる.
type:プロジェクト座標定義のpackagingに対応する依存タイプ.ほとんどの場合、要素は宣言する必要はありません.デフォルトはjarです.
scope:依存する範囲で、以下で詳しく説明します.
optional:タグ依存はオプションかどうか.
Exclutions:伝達依存性を排除するために使用されます.後述します.
2.依存範囲
依存範囲の知識について説明します.
Mavenは
プライマリコードをコンパイルする際には一連の使用が必要です
classpath、
テストのコンパイルと実行には別のセットが使用されます
classpath,実際
プロジェクトを実行するとき、また1セット使用します.
classpath.
依存範囲は制御に使用されます
この3つに依存する
classpath(
classpathのコンパイル、classpathのテスト、classpathの実行)の関係.Mavenには次の依存範囲があります.
 
compile:依存範囲をコンパイルします.指定されていない場合は、この依存範囲がデフォルトで使用されます.この依存範囲のMaven依存を使用すると、3つのclasspathのコンパイル、テスト、実行に有効です.典型的な例はspring-coreであり、コンパイル、テスト、実行時にこの依存を使用する必要があります.
provided:依存範囲が指定されています.この依存範囲のMaven依存を使用すると、classpathのコンパイルとテストには有効ですが、実行時には無効です.典型的な例はservlet-apiであり,プロジェクトをコンパイル・テストする際にはこの依存が必要であるが,プロジェクトを実行する際にはコンテナが提供されているため,Mavenを繰り返し導入する必要はない.
test:依存範囲をテストします.この依存範囲を使用するMaven依存は、classpathのテストにのみ有効であり、プライマリコードのコンパイルやプロジェクトの実行時には使用できません.典型的な例はJUnitであり、テストコードをコンパイルし、テストを実行するときにのみ必要です.
runtime:実行時依存範囲.この依存範囲のMaven依存を使用すると、classpathのテストと実行には有効ですが、プライマリコードのコンパイルでは無効です.典型的な例はJDBCドライバ実装であり、プロジェクトマスターコードのコンパイルにはJDKが提供するJDBCインタフェースのみが必要であり、テストまたはプロジェクトの実行時にのみ上記インタフェースの具体的なJDBCドライバを実現する必要がある.
システム:システム依存範囲.この依存範囲はprovidedが示す依存範囲と一致し、classpathのコンパイルとテストには有効ですが、実行時には無効です.ただし、system範囲依存を使用する場合は、systemPath要素を使用して依存ファイルのパスを明示的に指定する必要があります.このような依存性は、Maven倉庫によって解析されるものではなく、ローカルシステムにバインドされることが多く、構築された移植不可能な可能性があるため、システムPath要素は環境変数を参照することができるので、慎重に使用する必要があります.例を挙げると、

    
    
    
    
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<version>2.0</version>
<scope></scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>

import(Maven 2.0.9以上):依存範囲をインポートします.この依存範囲は3つのclasspathに実際の影響を及ぼさない.
上記import以外の各種依存範囲と3種類のclasspathの関係は以下の通りである.
依存範囲(scope)
classpathのテスト
コンパイルclasspath
classpathの実行

compile
Y
Y
Y
spring-core
provided
Y
Y
 
servlet-api
test
Y
 
 
junit
runtime
Y
 
Y
JDBC駆動実装
system
Y
Y
 
ローカル、Maven倉庫以外のクラスライブラリファイル
出典:『Maven実戦』
参考資料:Introduction to the Dependency Mechanism