Maven은 npm과 유사합니까?


84

나는 package.json 파일에서 종속성을 찾고 다운로드하는 npm으로 작업했습니다. 마찬가지로 Java 프로젝트에 pom.xml 파일이 있습니다. maven 이이 파일을 찾고 종속성을 다운로드합니까? 종속성 jar를 제공하는 대신 package.json과 같은 pom.xml 파일을 전달할 수 있습니까? 이러한 도구는 유사하고 다른 플랫폼 용으로 만 빌드됩니까?


답변:


124

같은 도구, 다른 언어?

Maven은 NPM이 JS 용인 것처럼 Java 용으로 가장 널리 사용되는 빌드 및 종속성 해결 도구입니다. 그러나 다른 언어를위한 동일한 도구가 아닙니다. 자바와 JS 빌드 사이에는 분명히 큰 차이가 있으며 이러한 차이는 Maven이 작동하는 방식에서 직접 볼 수 있습니다. 예를 들어, 많은 JS 도구가 Git에 의존하여 무거운 작업을 수행하는 반면 Maven은 Git보다 이전에 Git이 잘 처리하지 못했던 바이너리 아티팩트를 처리해야하므로 Maven은 사용자 지정 파일 시스템 기반 Maven 저장소와 함께 작동합니다. Maven에서는 소스와 바이너리 사이에 명확한 구분이 있지만 JS 세계에서는 종종 동일합니다.

Maven 기본 사항

가장 순수한 형태의 Maven은 선언적 모델을 따르며 pom.xml(와 유사 package.json) 빌드의 다른 속성을 정의하지만 스크립트는 포함하지 않습니다. 단점은 플러그인에 의존해야하므로 스크립트를 사용하지 않고 빌드의 일부 측면을 미세 조정하는 것이 어려울 수 있다는 것입니다. 장점은 pom.xml일반적으로 너무 많은 사용자 정의없이 동일한 접근 방식을 따르기 때문에 를 보는 것만으로도 다른 빌드를 더 쉽게 이해할 수 있다는 것 입니다. Gradle은 Maven 표준 및 규칙을 기반으로 구축 된 인기있는 Groovy 기반 도구이며, pom.xml이 "스크립트 없음"장벽 을 단순화 하고 파괴 하도록 특별히 설계되었습니다 .

종속성 참조

마찬가지로 package.json, pom.xml종속성을 직접 사용하지 않고 종속성 좌표를 정의하고 빌드 도구가 나머지를 처리하도록합니다. Maven에서 이러한 좌표의 기본 형식은 GAV (groupId, artifactId, version)입니다.

플랫 종속성 트리?

다른 답변의 주석을 기반으로 Maven은 NPM이 기본적으로 제공하는 "중첩 종속성 트리"가 아닌 "플랫 종속성 트리"를 제공합니다. Maven은 동일한 종속성의 여러 버전을 허용하지 않습니다. 다른 버전이 요청되는 경우 Maven은 종속성 확인 을 사용 하여 단일 버전을 선택합니다. 이는 때때로 전이 종속성이 필요한 것과 다른 버전을 가져 오지만이를 관리하는 방법이 있음을 의미합니다. 그러나이 제한은 Maven이 아닌 Java에서 비롯됩니다. 일반적으로 Java에서 클래스 로더는 클래스 경로에서 여러 정의가 발견 되더라도 단일 클래스 정의에 대한 액세스 만 제공하기 때문입니다. Java는이를 처리하는 데 특히 좋지 않기 때문에 Maven은 처음에이 시나리오를 피하려고합니다.

참고 : npm v3부터 종속성이 평평 해집니다. 대체 패키지 관리자 원사 도 동일합니다.

성숙

또한 Maven은 NPM보다 상당히 오래되었으며 사용자 기반이 더 많고 사용자 정의 플러그인이 많으며 지금까지 전체적으로 더 성숙한 것으로 간주 될 수 있습니다. 다른 언어 또는 Android와 같은 특정 환경을 처리하기위한 플러그인이 있기 때문에 가끔 Maven이 비 Java 또는 다중 언어 프로젝트에 사용됩니다. Maven과 실제로 여러 JS 빌드 도구를 처리하는 frontend-maven-plugin 과 같은 기타 빌드 도구를 연결하는 플러그인이 있습니다.


4
위의 정보 외에 다음 유튜브 재생 목록은 패키지 관리자로 Maven의 사용을 설명하는 좋은 직장 않습니다
토미 톰슨

1
도움이 될만한 패키지를 찾기 위해 npmjs.com을 자주 방문합니다. Maven ( search.maven.org ) 에서이 작업을 수행하기위한 링크를 찾는 데 꽤 많은 인터넷 검색이 필요했습니다 . 그러나 검색은 나를 문서로 가리 키지 않고 인기 메트릭을 표시하지 않으며 github를 가리 키지 않습니다. 나는 그것이 도움이되지 않는다고 생각하며 이것이 사람들이 NPM에 대해 기대하지만 Maven에는 기대하지 않는다고 제안합니다.
Joe Lapp

NPM과 Maven 간의 꽤 좋은 통계 비교는 다음과 같습니다. stackshare.io/stackups/npm-vs-gradle
cacoder

1
이 답변에 대한 업데이트 : "게다가 Maven은 NPM보다 상당히 오래되었고 사용자 기반이 더 넓습니다 ..."이것은 질문이 원래 2017 년에 답변되었을 때 사실 일 수 있지만 더 이상 정확하지 않습니다. @cacoder가 게시 한 링크에 따르면 NPM의 사용자 기반은 이제 Maven보다 약 11 배 더 큽니다. 출처 : stackshare.io/stackups/gradle-vs-maven-vs-npm
mnutsch

28

아래에서 나는 |maven을 분리 하는 데 사용 | npm 용어 각각 :

일반적인 특징:

  • 두 도구 지원 동적 종속성 가져 오기 ( | 패키지 유물 설명자 파일을 기반으로) pom.xml| package.json, 또한 배포 할 수 있습니다 | 자신의 유물을 게시 | 패키지 .

  • 둘 다 기본 공용 저장소가 있습니다. | 레지스트리 ( http://repo.maven.apache.org/maven2/ | https://registry.npmjs.org ), 타사도 사용할 수 있습니다 ( settings.xml|.npmrc 를 통해 ).

  • 둘 다 빌드 수준 종속성 (플러그인 | 스크립트에 사용되는 devDependencies) 개념을 지원합니다 . * Maven은 provided종속성도 지원 하지만 javascript는 컨테이너에 거의 배포되지 않기 때문에 npm에는 적용되지 않는 것 같습니다.

  • 둘 다 종속성 네임 스페이스를 지원합니다. groupId|scope

차이점 :

  • maven에는 추가 로컬 저장소 (캐시)가 있습니다.

    • 다른 프로젝트에 대해 동일한 종속성을 다시 가져올 필요가 없습니다.
    • 로컬에 설치된 아티팩트는 다른 로컬 프로젝트에서 자동으로 액세스 할 수 있습니다.
  • Maven에서 프로젝트 빌드의 종속성은 <homedir>/.m2. npm을 사용하면 <projectdir>/node_modules.

  • maven 에서 빌드하는 것은 일반적으로 1 단계 프로세스입니다 : mvn package(fetch deps, build). npm에서는 2 단계 프로세스입니다 : npm install(fetch deps), npm build(build)

  • Maven은 정의 빌드 라이프 사이클을 (, 테스트, 구축 배포) , 단계로 구성되는 기본 작업 (플러그인 목표)에 연결 differrent 패키징 옵션 (을 기반으로, .jar, .war, .ear등). 그런 다음 이러한 작업을 덮어 쓰거나 플러그인 시스템을 통해 새 작업을 삽입 할 수 있습니다. 이것은 빌드, docgen, 테스트, 배포 등을위한 즉시 사용 가능한 솔루션을 제공합니다.
    npm 접근 방식은 더 간단합니다 ( 스크립트 참조 ).

  • 위의 이유로 npm은 자바 스크립트 용 패키지 관리 도구로 레이블이 지정되고 maven은 java 용 빌드 자동화 및 종속성 관리 도구 로 레이블이 지정됩니다 .

  • 받는다는에서 설정 - 최대 빌드 프로세스를 더 많이 포함 편집pom.xml .
    npm에서는 코드 작성 또는 , 등과 같은 보완 빌드 도구 구성 이 포함됩니다.gulpwebpack

  • 어떤 이유로 npm 모듈에서 사용자가 정의한 버전 범위 는 maven보다 훨씬 느슨 합니다. 이로 인해 전이 종속성 문제가 발생할 수 있으므로 최근에 추가 파일이 추가되었습니다.package-lock.json

  • npm을 사용하면 새 프로젝트 를 시작 하는 것이 훨씬 더 간단합니다 : npm init. maven을 사용하면 minimal을 작성 pom.xml하거나 아키 타입에 대해 읽는 방법을 알아야합니다 .

  • 일반적으로 편집하는 pom.xml것이 package.json. 예 받는다는 종속성을 첨가가 완료 수동 (또는 IDE를 통해)에있는 동안 명령 라인을 통해 NPM .

  • 모든 빌드 도구와 마찬가지로 다른 도구 내부에서 하나의 도구를 호출 할 수 있지만 그 반대보다 maven 내부에서 npm 을 호출하는 것이 훨씬 더 일반적이라고 생각합니다 .

  • npm은 dev, production 빌드를 지원 합니다 . maven에서는 프로필을 통해 정의해야합니다 .


5

예. 자바 용과 유사한 패키징 도구입니다. 를 사용 하여 gradle더 많은 자유를 제공 하는 것도 찾으십시오 groovy language. 그러나 우선 maven종속성을 구성 하는 데 사용할 수 있습니다 . 거기에 태그로 포함하고 maven이 작업을 수행합니다.

종속성 트리를 탐색하고 적절한 모든 jar를 다운로드합니다.


1
이 모든 js 도구에 익숙하지 않기 때문에 확실하지 않습니다. gradle입니다 maven + ant함께의 말을 보자. Maven이하는 일을하지만 실제로하는 모든 작업과는 별도로 코드와 스크립트를 작성할 수있는 자유도 제공합니다. 내가 한 번 봐 가지고 gulp지금을. 내가 읽은 것과 같을 수도 있습니다. maven 대 gradle 사용을 시작하려면 maven더 명확하고 이해하기 쉬운 것으로 시작한 다음 엉망 으로 만드는 것이 좋습니다 gradle!
Apostolos

감사. Maven에 플랫 종속성 트리 또는 중첩 종속성 트리가 있습니까?
하기 Shubham 자이나교

1
예를 들어 여기 mvnrepository.com/artifact/org.hibernate/hibernate-core/…를 참조하십시오 . 최대 절전 모드는 다양한 다른 라이브러리에 의존하지만 이러한 jar는 최대 절전 모드 라이브러리 내부의 로컬 maven 저장소에 저장되지 않고 자체 패키지에 저장됩니다.
Apostolos jul.

1
중첩 된 (전 이적) 종속성 처리에 차이가 있다고 생각합니다. 모든 노드 모듈은 고유 한 버전의 종속성을 포함 할 수 있지만 여러 종속성이 동일한 세 번째 종속성을 필요로하지만 다른 버전에있는 경우 maven은 단일 공통 종속성으로 해결하려고 시도합니다. 나는 또한 grunt가 작업 기반 이후 gradle과 일치한다고 말할 것입니다. gradle은 ant + ivy에 더 가깝고 maven은 강하게 관습을 주도합니다. 웹팩에 더 가깝지만 너무 비슷한 것은 없습니다.
wemu jul.

1
죄송합니다. 맞습니다. 내가 가끔 사용하고 버전을 정의하는 프로필 작성 절차와 혼동했습니다.
Apostolos

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