답변:
플러그인과 종속성은 모두 Jar 파일입니다.
그러나 차이점은 maven의 대부분의 작업은 플러그인을 사용하여 수행된다는 것입니다. 반면 종속성은 작업을 실행하는 동안 클래스 경로에 추가되는 Jar 파일입니다.
예를 들어, 컴파일러 플러그인을 사용하여 Java 파일을 컴파일합니다. 컴파일러 플러그인은 클래스 경로에 플러그인 만 추가하고 컴파일을 트리거하지 않기 때문에 종속성으로 사용할 수 없습니다. 파일을 컴파일하는 동안 클래스 경로에 추가 될 Jar 파일은 종속성으로 지정됩니다.
시나리오도 마찬가지입니다. 일부 스프링 실행 파일을 실행하려면 spring-plugin을 사용해야합니다. [spring-plugins가 어떤 용도로 사용되는지 잘 모르겠습니다. 나는 단지 여기에서 추측하고있다]. 그러나 이러한 실행 파일을 실행하려면 종속성이 필요합니다. 그리고 Junit은 단위 테스트를 실행하기 위해 surefire-plugin에서 사용되기 때문에 종속성 아래에 태그가 지정됩니다.
따라서 plugin은 태스크를 실행하는 Jar 파일이고, Dependency는 태스크를 실행하기위한 클래스 파일을 제공하는 Jar라고 할 수 있습니다.
귀하의 질문에 대한 답변이 되었기를 바랍니다.
Maven 자체는 다양한 작업을 수행하는 데 사용할 수있는 다양한 단위가있는 푸드 프로세서로 설명 할 수 있습니다. 이러한 단위를 플러그인이라고합니다. 예를 들어, 프로젝트를 컴파일하려면 maven을 사용 maven-compiler-plugin
하여 테스트를 실행합니다 maven-surefire-plugin
.
Maven 측면에서 종속성은 프로젝트가 의존하는 패키지 된 클래스 조각입니다. jar, war 등이 될 수 있습니다. 예를 들어 JUnit 테스트를 작성하려면 JUnit 주석과 클래스를 사용해야하므로 프로젝트가 JUnit에 종속됨을 선언해야합니다.
플러그인과 종속성은 매우 다르며 상호 보완 적입니다.
플러그인은 Maven 빌드를위한 작업을 수행합니다. 이들은 응용 프로그램에 패키지되어 있지 않습니다.
이것들이 Maven의 핵심입니다.
Maven이 실행하는 모든 작업은 플러그인에 의해 수행됩니다 .
두 개의 플러그인의 범주가 있습니다 와 플러그인 :build
reporting
<build/>
되며 POM 의 요소에서 구성되어야합니다 .<reporting/
되며 POM 의 > 요소에서 구성해야합니다 . 명령 줄에 지정된 maven 목표 (예 mvn clean
: mvn clean package
또는 mvn site
)에 따라 특정 수명주기 가 사용되며 특정 플러그인 목표 집합이 실행됩니다.
기본 제공 빌드 수명주기에는 default
, clean
및 site
. 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
plugin
dependency
예를 들어 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>
webdriver-ie
두 가지 옵션이 있습니다. plugins
또는 dependency
, 둘 다 비교할 포함, 모두 정확히 같은이 관찰 groupId
유일한 차이점은이이었다 plugins
특정 버전을 함께하지 않았지만 dependency
함께 제공됩니다 0.6.685
. 당신은 그것을 평신도 (이 예와 관련하여) 용어로 설명 할 수 있습니까? 차이가 무엇인지, 언제 사용할 것인지. 어떠한 제안?
pom.xml
. 그러나 관심을 가져야 할 점은 Maven 3 이후 (아마도 기능으로 좋지 않은 아이디어) Maven 버전에서 종속성 버전을 지정하는 것이 필수입니다 (현재 pom 또는 상속 된 종속성 인 경우 부모 pom에서). 플러그인 버전 지정은 선택 사항입니다. Maven은 Maven이 찾은 릴리스 저장소에서 사용 가능한 마지막 버전을 사용합니다. (1/2)
나와 같은 프론트 엔드 배경에서 왔고 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>
.
물론 이것은 정확한 비유는 아니지만 머리를 감싸는 데 도움이 될 정도로 가깝습니다.
플러그인은 Maven
자체에 기능을 추가하는 데 사용 됩니다 (예 : eclipse
지원 또는 SpringBoot
지원 추가 Maven
등). 종속성이 어떤 메이븐 위상을 전달하는 소스 코드에 필요한 ( compile
또는 test
예를 들어). 의 경우 JUnit
테스트 코드는 기본적으로 코드 기반의 일부이며 당신이 전화 때문에 JUnit
테스트 스위트의 내부에 특정 명령을 그 명령에 의해 제공되지 않는 Java SDK
때문에 JUnit
시간에 있어야합니다 Maven
테스트 단계에 있으며이는 언급에 의해 처리됩니다 JUnit
종속성으로 당신의 pom.xml
파일.
Maven의 핵심은 공식 및 표준 컴팩트 정의에 따른 플러그인 실행 프레임 워크입니다. 더 명확하게하기 위해 maven-install/clean/compile/build etc
, 우리가 때때로 수동으로 실행하는 jar를 생성 / 실행하기 위해 사용하는 명령을 사용 합니다. 따라서 실행 (또는 구성 또는 실행)하려는 항목은 기본적으로 mavens pom의 종속성 태그에 넣고 이러한 종속성 (환경 설정에 필요)을 실행할 사람에 대한 대답은 플러그인입니다.
javac (compiler) dependency.java (dependency)