maven - scope

IDE & Build/Maven 2013. 4. 5. 14:12

 

의존의 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을 지정하고 있다.

* compile : 기본영역으로 아무것도 지정되지 않은 경우 사용됨. compile 의존관계에 있는 것은 프로젝트의 모든 클래스에서 사용가능함. 또한, 이와 같은 의존관계는 의존관계에 있는 프로젝트에 포함됨.
* 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에 설정된다.

<dependency>
      <groupId>group-a</groupId>
      <artifactId>artifact-b</artifactId>
      <version>1.0</version>
      <type>bar</type>
      <scope>runtime</scope>
</dependency>

기존 Maven1 에서는 이러한 설정이 없지만, Maven2로의 변경이나, Maven2로 만들어진 POM을 사용하는 경우에 유용하게 하기 위해서 다음과 같이 설정하면 된다.

<dependency>
  <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

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
</dependency>

compile은 기본 scope를 생략하면 적용됩니다. compile 의존관계에 있는 것은 프로젝트의 모든 클래스에서 사용가능합니다. 또한 이와 같은 의존관계는 의존관계에 있는 프로젝트에 포함됩니다.

2. provided

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>

compile과 유사하지만, 다른 외부 컨테이너에서 제공되는 API인경우 provided로 지정 시 마지막 패키징할 때 포함되지 않습니다. 예를 들면 tomcat에서 기본적으로 servlet api를 제공하기 때문에 servlet api를 provided로 지정하면 패키징시 제외됩니다.

3. runtime

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
<scope>runtime</scope>
</dependency>

의존관계가 컴파일시 필요하지 않지만, 실행시 필요함을 의미합니다. 실행시와 테스트 클래스패스에 속하지만, 컴파일 클래스패스에는 속하지 않습니다.

4. test

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

일반적인 어플리케이션 사용에 대해서는 의존관계가 필요없고, 테스트 컴파일과 실행 시점에만 사용됩니다.

5. system

<dependency>
<groupId>com.baeldung</groupId>
<artifactId>custom-dependency</artifactId>
<version>1.3.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/custom-dependency-1.3.2.jar</systemPath>
</dependency>

명시적으로 해당 JAR를 포함하는 것이 제공되어야 한다는 것을 제외하고 provided와 유사합니다. artifact는 항상 사용가능하며 레파지토리에서 검색하지 않습니다.

6. import (Maven 2.0.9 이후 버전에서만 적용됩니다)

<dependency>
<groupId>com.baeldung</groupId>
<artifactId>custom-project</artifactId>
<version>1.3.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>

이 영역은 <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 폴더 구성도 다음과 같이 바뀝니다.

 

 

참고: http://stackoverflow.com/questions/5597099/maven-add-jars-through-systempath-system-but-not-added-to-war-or-anywhere-else

 

source - https://okjsp.tistory.com/1165644118

 

 

 

 

 

 

 

Posted by linuxism
,