의존의 scope: compile, runtime, provided, test
앞의 pom.xml 파일에서 <dependency> 부분을 보면 <scope>를 포함하고 있는 것과 그렇지 않은 것이 존재한다는 것을 알 수 있다. <scope>는 의존하는 모듈이 언제 사용되는 지를 설정할 때 사용되며, <scope>에 올 수 있는 값은 다음의 네 가지가 존재한다.
- compile - 컴파일 할 때 필요. 테스트 및 런타임에도 클래스패스에 포함된다. <scope>를 설정하지 않을 경우 기본 값은 compile 이다.
- runtime - 런타임에 필요. JDBC 드라이버 등이 예가 된다. 프로젝트의 코드를 컴파일 할 때는 필요하지 않지만, 실행할 때 필요하다는 것을 의미한다. 배포시 포함된다.
- provided - 컴파일 할 때 필요하지만, 실제 런타임 때에는 컨테이너 같은 것에서 기본으로 제공되는 모듈임을 의미한다. 예를 들어, 서블릿이나 JSP API 등이 이에 해당한다. 배포시 제외된다.
- test - 테스트 코드를 컴파일 할 때 필요. Mock 테스트를 위한 모듈이 예이다. 테스트 시에 클래스패스에 포함되며, 배포시 제외된다.
출처 - http://easymicro.egloos.com/5477280
Maven 2에서는 dependency를 가지는 대상에 대해서 다음과 같이 scope을 지정하고 있다.
* provided : compile 과 매우 유사히지만, 실행시 의존관계를 제공하는 JDK나 컨테이너에 대해서 적용됨. 예를 들어, JEE에 대한 웹 어플리케이션을 만드는 경우, 웹 컨테이너가 서블릿 API와 Java EE API관련 클래스들을 제공하기 때문에 provided 영역으로 의존관계가 세팅되어야 함. 이 영역은 컴파일과 테스트의 클래스패스 용으로 사용되며, 자동영역임.
* runtime : 의존관계가 컴파일시 필요하지 않지만, 실행시 필요함을 의미함. 실행시와 테스트 클래스패스에 속하지만, 컴파일 클래스패스에는 속하지 않음.
* test : 일반적인 어플리케이션 사용에 대해서는 의존관계가 필요없고, 테스트 컴파일과 실행 시점에만 사용됨.
* system : 명시적으로 해당 JAR를 포함하는 것이 제공되어야 한다는 것을 제외하고 provided와 유사함. artifact는 항상 사용가능하며 레파지토리에서 검색하지 않음.
* import (Maven 2.0.9 이후에서만 적용) : 이 영역은 <dependencyManagement>에서 pom의 의존관계에 대해서 사용됨. 지정된 POM이 해당 POM의 <dependencyManagement> 영역에 있는 의존관계로 대체됨을 의미함. 이것들이 대체되기 때문에 import 영역의 의존관계들은 실질적으로 의존에 대한 제약에 대해 관여하지 않음.
Maven 2에서는 다음과 같이 POM에 설정된다.
<groupId>group-a</groupId>
<artifactId>artifact-b</artifactId>
<version>1.0</version>
<type>bar</type>
<scope>runtime</scope>
</dependency>
기존 Maven1 에서는 이러한 설정이 없지만, Maven2로의 변경이나, Maven2로 만들어진 POM을 사용하는 경우에 유용하게 하기 위해서 다음과 같이 설정하면 된다.
<groupId>foo</groupId>
<artifactId>bar</artifactId>
<version>1.0</version>
<properties>
<scope>test</scope>
</properties>
</dependency>
출처 - http://homo-ware.tistory.com/43
메이븐(Maven)을 사용하게 되면 POM 파일을 다루게 됩니다. POM은 Project Object Model의 약자인데, pom.xml 파일을 통해 dependency라고 부르는 의존성 설정을 합니다. 그리고 각 dependency는 scope을 가지고 있습니다. 여기서 scope는 해당 dependency가 포함되는 범위에 대한 타입이라 말 할 수 있습니다.
Maven Scope 종류
1. compile
compile은 기본 scope를 생략하면 적용됩니다. compile 의존관계에 있는 것은 프로젝트의 모든 클래스에서 사용가능합니다. 또한 이와 같은 의존관계는 의존관계에 있는 프로젝트에 포함됩니다.
2. provided
compile과 유사하지만, 다른 외부 컨테이너에서 제공되는 API인경우 provided로 지정 시 마지막 패키징할 때 포함되지 않습니다. 예를 들면 tomcat에서 기본적으로 servlet api를 제공하기 때문에 servlet api를 provided로 지정하면 패키징시 제외됩니다.
3. runtime
의존관계가 컴파일시 필요하지 않지만, 실행시 필요함을 의미합니다. 실행시와 테스트 클래스패스에 속하지만, 컴파일 클래스패스에는 속하지 않습니다.
4. test
일반적인 어플리케이션 사용에 대해서는 의존관계가 필요없고, 테스트 컴파일과 실행 시점에만 사용됩니다.
5. system
명시적으로 해당 JAR를 포함하는 것이 제공되어야 한다는 것을 제외하고 provided와 유사합니다. artifact는 항상 사용가능하며 레파지토리에서 검색하지 않습니다.
6. import (Maven 2.0.9 이후 버전에서만 적용됩니다)
이 영역은 <dependencyManagement>에서 pom의 의존관계에 대해서 사용됩니다. 지정된 POM이 해당 POM의 <dependencyManagement> 영역에 있는 의존관계로 대체됨을 의미합니다. 이것들이 대체되기 때문에 import 영역의 의존관계들은 실질적으로 의존에 대한 제약에 대해 관여하지 않습니다.
레퍼런스(Reference)
source - https://blog.naver.com/PostView.naver?blogId=dktmrorl&logNo=222418137899&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView
메이븐의 scope는 compile, runtime, test, provided, system 이 있습니다. 이 중에서 custom jar를 관리하기 위해서 system scope를 지정해서 사용했었는데, war파일 패키징에서 누락되게 됩니다. WEB-INF/lib 폴더에 복사되지 않는다는 뜻입니다. 이 때문에 다음과 같이 코드를 작성했다면, in-project 저장소를 구성해서 변경하는 것이 좋습니다.
<!-- custom -->
<dependency>
<groupId>Acme.JPG</groupId>
<artifactId>AcmeGif</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${basedir}/libs/AcmeGif-1.0.0.jar</systemPath>
</dependency>
<dependency>
<groupId>com.cubrid</groupId>
<artifactId>cubrid-jdbc</artifactId>
<version>8.3.1.0152</version>
<scope>system</scope>
<systemPath>${basedir}/libs/cubrid-jdbc-8.3.1.0152.jar</systemPath>
</dependency>
위 세팅을 다음과 같이 변경합니다.
<repositories>
<repository>
<id>in-project</id>
<name>In Project Repo</name>
<url>file://${project.basedir}/libs</url>
</repository>
</repositories>
<!-- custom -->
<dependency>
<groupId>Acme.JPG</groupId>
<artifactId>AcmeGif</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.cubrid</groupId>
<artifactId>cubrid-jdbc</artifactId>
<version>8.3.1.0152</version>
</dependency>
libs 폴더 구성도 다음과 같이 바뀝니다.
source - https://okjsp.tistory.com/1165644118
'IDE & Build > Maven' 카테고리의 다른 글
maven - 기초 사용법 3 (0) | 2013.06.08 |
---|---|
maven - 기초 사용법 2 (0) | 2013.06.08 |
maven install such as to add Microsoft SQL JDBC driver to Maven (0) | 2012.12.07 |
maven 기초 사용법 (0) | 2012.11.21 |
메이븐 프로젝트에서 src/main/resource 에 xml 파일 읽기 (0) | 2012.11.12 |