pom xml의 종속성과 플러그인 태그의 Maven의 차이점은 무엇입니까?


118

나는 maven 도구를 처음 접했고 Spring과 Hibernate로 프로젝트를 만들었고 pom.xml에서 플러그인으로 구성되었지만 JUnit은 종속성 아래에 태그가 지정되었습니다. 내 질문은 플러그인과 종속성의 논리는 무엇입니까?

답변:


213

플러그인과 종속성은 모두 Jar 파일입니다.

그러나 차이점은 maven의 대부분의 작업은 플러그인을 사용하여 수행된다는 것입니다. 반면 종속성은 작업을 실행하는 동안 클래스 경로에 추가되는 Jar 파일입니다.

예를 들어, 컴파일러 플러그인을 사용하여 Java 파일을 컴파일합니다. 컴파일러 플러그인은 클래스 경로에 플러그인 만 추가하고 컴파일을 트리거하지 않기 때문에 종속성으로 사용할 수 없습니다. 파일을 컴파일하는 동안 클래스 경로에 추가 될 Jar 파일은 종속성으로 지정됩니다.

시나리오도 마찬가지입니다. 일부 스프링 실행 파일을 실행하려면 spring-plugin을 사용해야합니다. [spring-plugins가 어떤 용도로 사용되는지 잘 모르겠습니다. 나는 단지 여기에서 추측하고있다]. 그러나 이러한 실행 파일을 실행하려면 종속성이 필요합니다. 그리고 Junit은 단위 테스트를 실행하기 위해 surefire-plugin에서 사용되기 때문에 종속성 아래에 태그가 지정됩니다.

따라서 plugin은 태스크를 실행하는 Jar 파일이고, Dependency는 태스크를 실행하기위한 클래스 파일을 제공하는 Jar라고 할 수 있습니다.

귀하의 질문에 대한 답변이 되었기를 바랍니다.


누군가 실행 단계와 목표의 차이점을 말해 줄 수 있습니까 ?? 내가 알고 있듯이 단계는 maven의 수명주기에 대해 이야기하고 있지만 .. 왜 또 목표가? 힌트가 있습니까? 가끔 사람들이 목표에 라이프 사이클 키워드를 넣는 것을 봅니다 ... ??? (?.?)
taymedee

@taymedee이 SO 질문은 차이점을 설명합니다 : stackoverflow.com/questions/16205778/…
dev_feed

1
@ r981 귀하의 답변은 더 명확해야합니다. 이 답변이 더 낫습니다 : stackoverflow.com/questions/26292073/…
Digital Impermanence

이 답변의 놓친 요점은 최상위 종속성이 주로 플러그인 대신 아티팩트에서 사용된다는 것입니다.
lfree

3
@MichaelPacheco, 내가 의미 한 바는 spring-plugin이 '종속성'에 의해 지정되는 일부 라이브러리에 종속 될 수있는 코드 세트를 실행하는 특정 작업을 수행한다는 것입니다. 다른 예를 들어 보겠습니다. 코드를 실행하려면 컴파일러가 필요합니다. 여기에서 컴파일러는 플러그인이고 코드는 실행 파일입니다. 컴파일러만으로는 모든 코드를 실행할 수 있지만 코드는 라이브러리 (예 : 아파치 커먼즈)에 종속 될 수 있습니다. 컴파일러는 종속성이 클래스 경로에있을 때만 코드를 컴파일 할 수 있습니다. 이제 분명해 졌으면합니다.
r9891

37

Maven 자체는 다양한 작업을 수행하는 데 사용할 수있는 다양한 단위가있는 푸드 프로세서로 설명 할 수 있습니다. 이러한 단위를 플러그인이라고합니다. 예를 들어, 프로젝트를 컴파일하려면 maven을 사용 maven-compiler-plugin하여 테스트를 실행합니다 maven-surefire-plugin.

Maven 측면에서 종속성은 프로젝트가 의존하는 패키지 된 클래스 조각입니다. jar, war 등이 될 수 있습니다. 예를 들어 JUnit 테스트를 작성하려면 JUnit 주석과 클래스를 사용해야하므로 프로젝트가 JUnit에 종속됨을 선언해야합니다.


빠른 답장에 감사드립니다. 미안하지만 JUnit도 프레임 워크이고 (hibernate, spring)도 프레임 워크 아래에 제공된다는 것을 알기 때문에 여전히 혼란 스럽습니다. 따라서 경우에 따라 (hibernate, spring)을 종속성 태그로 구성 할 수도 있습니다. ? 제 질문을 받았으면 좋겠습니다.
Coral

예, 내가 아는 한 Spring maven 플러그인과 같은 것은 없습니다. 일반적으로 Spring libs (또는 Hibernate, JUnit 또는 TestNG 등)는 프로젝트에 대한 종속성으로 선언됩니다. 당신이 maven을 처음 접한다면 나는 아주 좋은 책 을 읽는 것이 좋습니다 .
Andrew Logvinov 2012-08-09

@AndrewLogvinov-API 자동화 테스트를위한 다중 pom 프로젝트가 있습니다. Maven 프로젝트 중 하나에는 자동화 테스트가 있습니다. 프로젝트 pom의 빌드 섹션에는 스위트를 참조하는 maven surefire 플러그인이 하나뿐이었습니다. 전체 빌드 태그가 제거되었습니다. 이것이 의미하는 바를 말씀해 주시겠습니까? 감사.
MasterJoe

15

플러그인과 종속성은 매우 다르며 상호 보완 적입니다.

플러그인은 무엇입니까?

플러그인은 Maven 빌드를위한 작업을 수행합니다. 이들은 응용 프로그램에 패키지되어 있지 않습니다.

이것들이 Maven의 핵심입니다.
Maven이 실행하는 모든 작업은 플러그인에 의해 수행됩니다 .
두 개의 플러그인의 범주가 있습니다 플러그인 :buildreporting

  • 빌드 플러그인은 빌드 중에 실행 <build/>되며 POM 의 요소에서 구성되어야합니다 .
  • 보고 플러그인은 사이트 생성 중에 실행 <reporting/되며 POM 의 > 요소에서 구성해야합니다 .

명령 줄에 지정된 maven 목표 (예 mvn clean: mvn clean package또는 mvn site)에 따라 특정 수명주기 가 사용되며 특정 플러그인 목표 집합이 실행됩니다.
기본 제공 빌드 수명주기에는 default, cleansite. default수명주기는 프로젝트 배포를 처리 clean라이프 사이클 핸들, 청소 프로젝트 그동안 site라이프 사이클 핸들 프로젝트의 사이트 문서의 생성.

플러그인 목표는 특정 라이프 사이클의 특정 단계에 바인딩 될 수 있습니다.
예를 들어 maven-compiler-plugin기본적으로 compile목표를 수명주기 단계에 바인딩합니다 compile.
대부분의 maven 플러그인 (핵심 플러그인 및 타사 플러그인 모두)은 구성보다 규칙을 선호합니다. 따라서 일반적으로 플러그인 목표를 특정 단계에 묶어 사용을 단순화합니다.

더 깔끔하고 오류가 덜 발생합니다.

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.7.0</version>
</plugin>

보다 :

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.7.0</version>
  <executions>
    <execution>
        <phase>compile</phase>
        <goals>
            <goal>compile</goal>
        </goals>
    </execution>
  </executions>
</plugin>

종속성은 무엇입니까?

종속성은 Maven 빌드 중에 클래스 경로에 필요한 Maven 아티팩트 / 구성 요소입니다.
이들은 애플리케이션에 패키징 될 수 있지만 반드시 그런 것은 아닙니다 ( scope아래 참조).

대부분의 종속성은 jar이지만 다른 종류의 아카이브 일 수도 있습니다 : war, ear, test-jar, ejb-client ... 또는 여전히 POM 또는 BOM.
하십시오의 pom.xml에 의존성은 여러 장소에서 지정할 수 있습니다 <build><dependencies>일부는 dependencies management여전히 일부 또는 선언 ! 실제로 일부 플러그인은 실행 중에 클래스 경로에 일부 종속성이 필요할 수 있습니다. 그것은 흔하지는 않지만 일어날 수 있습니다. 여기에서 예이다 문서 쇼가 있다는 것을 와 함께 작동 할 수는 : plugin
plugindependency

예를 들어 Maven Antrun Plugin 버전 1.2는 Ant 버전 1.6.5를 사용하며,이 플러그인을 실행할 때 최신 Ant 버전을 사용 <dependencies>하려면 다음과 같은 요소 를 추가해야합니다 .

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.2</version>
        ...
        <dependencies>
          <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.7.1</version>
          </dependency>
          <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant-launcher</artifactId>
            <version>1.7.1</version>
          </dependency>
         </dependencies>
      </plugin>
    </plugins>
  </build>
  ...
</project>

Maven에서 종속성은 특정 형식으로 참조됩니다
groupId:artifactId:packaging:classifier:version.
분류 자 (선택 사항)와 패키징 ( JAR기본적으로)은 일반적으로 지정되지 않습니다. 따라서 dependency선언 의 일반적인 형식 은 오히려 다음과 같습니다 groupId:artifactId:version.
다음은 <build><dependencies>파트 에서 선언 된 종속성의 예입니다 .

<build>
   <dependencies>
      <dependency>
         <groupId>org.hibernate</groupId>
         <artifactId>hibernate-core</artifactId>
         <version>5.2.14.Final</version>
      </dependency>
   <dependencies>
</build>

플러그인과 달리 종속성에는 범위가 있습니다.
기본 범위는 compile입니다. 이것이 가장 일반적으로 필요한 범위입니다 (다시 구성보다 관례). 범위는 종속성이 프로젝트의 모든 클래스 경로에서 사용할 수 있음을 의미한다.
compile

범위는 종속성을 추가해야하는 클래스 경로를 정의합니다. 예를 들어 컴파일과 런타임에 필요합니까, 아니면 테스트 컴파일과 실행에만 필요합니까?

예를 들어 compile, 소스 컴파일, 테스트 컴파일, 런타임 등 모든 곳에서 필요하기 때문에 이전에 Hibernate를 종속성으로 정의 했습니다.
그러나 테스트 라이브러리가 애플리케이션에 패키지되거나 소스 코드에서 참조되는 것을 원하지 않습니다. . 따라서 test범위를 지정 합니다.

<build>
   <dependencies>
     <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.1.0</version>
        <scope>test</scope>
     </dependency>
   <dependencies>
</build>

훌륭한 설명!, Java에서 종속성을 설정하는 데 익숙하지 않기 때문에 여전히 의심이 있습니다. 현재 IntelliJ에서 작업하고 있으며 maven 프로젝트를 만들었습니다. 포함하려고 할 때 webdriver-ie두 가지 옵션이 있습니다. plugins또는 dependency, 둘 다 비교할 포함, 모두 정확히 같은이 관찰 groupId유일한 차이점은이이었다 plugins특정 버전을 함께하지 않았지만 dependency함께 제공됩니다 0.6.685. 당신은 그것을 평신도 (이 예와 관련하여) 용어로 설명 할 수 있습니까? 차이가 무엇인지, 언제 사용할 것인지. 어떠한 제안?
Anu

1
을 (를) 보지 않고 가장 정확한 답변을 제공하기 어렵습니다 pom.xml. 그러나 관심을 가져야 할 점은 Maven 3 이후 (아마도 기능으로 좋지 않은 아이디어) Maven 버전에서 종속성 버전을 지정하는 것이 필수입니다 (현재 pom 또는 상속 된 종속성 인 경우 부모 pom에서). 플러그인 버전 지정은 선택 사항입니다. Maven은 Maven이 찾은 릴리스 저장소에서 사용 가능한 마지막 버전을 사용합니다. (1/2)
davidxxx

1
플러그인을 지정하는 것은 잘못된 방법입니다. 시간이 지남에 따라 빌드를 재현 할 수는 없습니다 ( cwiki.apache.org/confluence/display/MAVEN/… ). 빌드에 경고가 표시되어야합니다. 그래서 "차이는 무엇입니까?". 플러그인은 Maven 빌드에 대한 작업을 수행하는 반면 종속성은 빌드 중에 클래스 경로에 필요한 라이브러리 (jar 또는 기타)입니다. 프로젝트 빌드가 어떤 경우
에든

6

나와 같은 프론트 엔드 배경에서 왔고 Grunt 및 npm에 익숙하다면 다음과 같이 생각하십시오.

먼저 실행 npm install grunt-contrib-copy --save-dev합니다. 이것은 maven의 <dependency></dependency>. 빌드 작업을 실행하는 데 필요한 파일을 다운로드합니다.

그런 다음 Gruntfile.js에서 작업을 구성합니다.

copy: {
  main: {
    src: 'src/*',
    dest: 'dest/',
  },
}

이것은 maven의 <plugin>/<plugin>. npm /에서 다운로드 한 코드로 수행 할 작업을 빌드 도구에 알려줍니다 <dependency></dependency>.

물론 이것은 정확한 비유는 아니지만 머리를 감싸는 데 도움이 될 정도로 가깝습니다.


4

플러그인은 Maven자체에 기능을 추가하는 데 사용 됩니다 (예 : eclipse지원 또는 SpringBoot지원 추가 Maven등). 종속성이 어떤 메이븐 위상을 전달하는 소스 코드에 필요한 ( compile또는 test예를 들어). 의 경우 JUnit테스트 코드는 기본적으로 코드 기반의 일부이며 당신이 전화 때문에 JUnit테스트 스위트의 내부에 특정 명령을 그 명령에 의해 제공되지 않는 Java SDK때문에 JUnit시간에 있어야합니다 Maven테스트 단계에 있으며이는 언급에 의해 처리됩니다 JUnit종속성으로 당신의 pom.xml파일.


1

Maven의 핵심은 공식 및 표준 컴팩트 정의에 따른 플러그인 실행 프레임 워크입니다. 더 명확하게하기 위해 maven-install/clean/compile/build etc, 우리가 때때로 수동으로 실행하는 jar를 생성 / 실행하기 위해 사용하는 명령을 사용 합니다. 따라서 실행 (또는 구성 또는 실행)하려는 항목은 기본적으로 mavens pom의 종속성 태그에 넣고 이러한 종속성 (환경 설정에 필요)을 실행할 사람에 대한 대답은 플러그인입니다.

        javac (compiler) dependency.java (dependency) 

1

한 줄 답변-기본 이해

플러그인 은 Maven 빌드를 실행할 때 사용하는 도구입니다.

종속성 은 코드에서 사용할 라이브러리의 종류를 의미합니다.


0

플러그인은 Maven의 확장으로, 아티팩트를 생성하는 데 사용됩니다 (예를 들어 maven-jar-plugin은 컴파일 된 클래스 및 리소스에서 jar를 만드는 데 사용됩니다).

종속성은 컴파일 및 / 또는 테스트 및 / 또는 런타임 시간에 빌드중인 애플리케이션에 필요한 라이브러리입니다.

플러그인 및 의존성

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.