나는 package.json 파일에서 종속성을 찾고 다운로드하는 npm으로 작업했습니다. 마찬가지로 Java 프로젝트에 pom.xml 파일이 있습니다. maven 이이 파일을 찾고 종속성을 다운로드합니까? 종속성 jar를 제공하는 대신 package.json과 같은 pom.xml 파일을 전달할 수 있습니까? 이러한 도구는 유사하고 다른 플랫폼 용으로 만 빌드됩니까?
나는 package.json 파일에서 종속성을 찾고 다운로드하는 npm으로 작업했습니다. 마찬가지로 Java 프로젝트에 pom.xml 파일이 있습니다. maven 이이 파일을 찾고 종속성을 다운로드합니까? 종속성 jar를 제공하는 대신 package.json과 같은 pom.xml 파일을 전달할 수 있습니까? 이러한 도구는 유사하고 다른 플랫폼 용으로 만 빌드됩니까?
답변:
Maven은 NPM이 JS 용인 것처럼 Java 용으로 가장 널리 사용되는 빌드 및 종속성 해결 도구입니다. 그러나 다른 언어를위한 동일한 도구가 아닙니다. 자바와 JS 빌드 사이에는 분명히 큰 차이가 있으며 이러한 차이는 Maven이 작동하는 방식에서 직접 볼 수 있습니다. 예를 들어, 많은 JS 도구가 Git에 의존하여 무거운 작업을 수행하는 반면 Maven은 Git보다 이전에 Git이 잘 처리하지 못했던 바이너리 아티팩트를 처리해야하므로 Maven은 사용자 지정 파일 시스템 기반 Maven 저장소와 함께 작동합니다. Maven에서는 소스와 바이너리 사이에 명확한 구분이 있지만 JS 세계에서는 종종 동일합니다.
가장 순수한 형태의 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 과 같은 기타 빌드 도구를 연결하는 플러그인이 있습니다.
아래에서 나는 |
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에서는 코드 작성 또는 , 등과 같은 보완 빌드 도구 구성 이 포함됩니다.gulp
webpack
어떤 이유로 npm 모듈에서 사용자가 정의한 버전 범위 는 maven보다 훨씬 느슨 합니다. 이로 인해 전이 종속성 문제가 발생할 수 있으므로 최근에 추가 파일이 추가되었습니다.package-lock.json
npm을 사용하면 새 프로젝트 를 시작 하는 것이 훨씬 더 간단합니다 : npm init
. maven을 사용하면 minimal을 작성 pom.xml
하거나 아키 타입에 대해 읽는 방법을 알아야합니다 .
일반적으로 편집하는 pom.xml
것이 package.json
. 예 받는다는 종속성을 첨가가 완료 수동 (또는 IDE를 통해)에있는 동안 명령 라인을 통해 NPM .
모든 빌드 도구와 마찬가지로 다른 도구 내부에서 하나의 도구를 호출 할 수 있지만 그 반대보다 maven 내부에서 npm 을 호출하는 것이 훨씬 더 일반적이라고 생각합니다 .
npm은 dev, production 빌드를 지원 합니다 . maven에서는 프로필을 통해 정의해야합니다 .
예. 자바 용과 유사한 패키징 도구입니다. 를 사용 하여 gradle
더 많은 자유를 제공 하는 것도 찾으십시오 groovy language
. 그러나 우선 maven
종속성을 구성 하는 데 사용할 수 있습니다 . 거기에 태그로 포함하고 maven이 작업을 수행합니다.
종속성 트리를 탐색하고 적절한 모든 jar를 다운로드합니다.
gradle
입니다 maven + ant
함께의 말을 보자. Maven이하는 일을하지만 실제로하는 모든 작업과는 별도로 코드와 스크립트를 작성할 수있는 자유도 제공합니다. 내가 한 번 봐 가지고 gulp
지금을. 내가 읽은 것과 같을 수도 있습니다. maven 대 gradle 사용을 시작하려면 maven
더 명확하고 이해하기 쉬운 것으로 시작한 다음 엉망 으로 만드는 것이 좋습니다 gradle
!