Maven có giống với npm không?


84

Như tôi đã làm việc với npm để tìm kiếm các phụ thuộc trong tệp package.json và tải xuống cho bạn. Tương tự, tôi thấy một tệp pom.xml trong dự án Java. Maven có tìm trong tệp này và tải về các phụ thuộc cho tôi không. Tôi có thể chuyển tệp pom.xml này như package.json, thay vì đưa các lọ phụ thuộc không? Các công cụ này có giống nhau không và chỉ xây dựng cho các nền tảng khác nhau?


Câu trả lời:


124

Cùng một công cụ, khác ngôn ngữ?

Maven là công cụ phân giải phụ thuộc và xây dựng phổ biến nhất cho Java, giống như NPM dành cho JS. Nhưng nó không chỉ là công cụ giống nhau cho một ngôn ngữ khác. Rõ ràng là có sự khác biệt rất lớn giữa các bản dựng Java và JS và những khác biệt này có thể nhìn thấy trực tiếp trong cách Maven hoạt động. Ví dụ: trong khi nhiều công cụ JS dựa vào Git để thực hiện một số công việc nặng nhọc, Maven hoạt động với kho lưu trữ Maven dựa trên hệ thống tệp tùy chỉnh, vì Maven có trước Git và cần xử lý các tạo tác nhị phân, điều mà trước đây Git không xử lý tốt. Trong Maven, có sự tách biệt rõ ràng giữa nguồn và mã nhị phân, trong khi chúng thường giống nhau trong thế giới JS.

Kiến thức cơ bản về Maven

Maven ở dạng thuần túy nhất tuân theo một mô hình khai báo, trong đó pom.xml(tương tự như package.json) xác định các thuộc tính khác nhau của bản dựng, nhưng không chứa tập lệnh. Điểm bất lợi là nó có thể là một thách thức để tinh chỉnh một số khía cạnh của bản dựng mà không sử dụng tập lệnh vì bạn phải dựa vào các plugin. Ưu điểm là có thể dễ dàng hiểu các bản dựng khác chỉ bằng cách nhìn vào pom.xml, vì chúng thường làm theo cùng một cách tiếp cận mà không cần tùy chỉnh quá nhiều. Gradle là một công cụ dựa trên Groovy phổ biến được xây dựng dựa trên các tiêu chuẩn và quy ước của Maven, đồng thời được thiết kế đặc biệt để đơn giản hóa pom.xmlvà phá vỡ rào cản "không có tập lệnh" này.

Tham chiếu đến sự phụ thuộc của bạn

Tương tự như vậy package.json, bạn không pom.xmltrực tiếp làm việc với sự phụ thuộc của mình mà thay vào đó xác định các tọa độ phụ thuộc và để công cụ xây dựng của bạn xử lý phần còn lại. Trong Maven, dạng cơ bản của các tọa độ này là GAV (groupId, tạo tác, phiên bản).

Cây phụ thuộc phẳng?

Dựa trên các nhận xét trong câu trả lời khác, Maven cung cấp "cây phụ thuộc phẳng", không phải "cây phụ thuộc lồng nhau" mà NPM cung cấp theo mặc định. Maven không cho phép nhiều phiên bản của cùng một phụ thuộc. Nếu xảy ra trường hợp yêu cầu các phiên bản khác nhau, Maven sẽ sử dụng độ phân giải phụ thuộc để chọn một phiên bản duy nhất. Điều này có nghĩa là đôi khi các phần phụ thuộc bắc cầu của bạn sẽ nhận được phiên bản khác với phiên bản mà họ yêu cầu, nhưng có nhiều cách để quản lý điều này. Tuy nhiên, hạn chế này đến từ Java, không phải Maven, vì (thông thường) trong Java, trình nạp lớp sẽ chỉ cung cấp quyền truy cập vào một định nghĩa lớp duy nhất ngay cả khi tìm thấy nhiều định nghĩa trên classpath. Vì Java không đặc biệt giỏi trong việc xử lý điều này, Maven cố gắng tránh trường hợp này ngay từ đầu.

Lưu ý: kể từ npm v3, các phụ thuộc được làm phẳng. Sợi quản lý gói thay thế cũng làm như vậy.

Trưởng thành

Hơn nữa, Maven cũ hơn NPM đáng kể, có cơ sở người dùng lớn hơn, số lượng lớn các plugin tùy chỉnh và cho đến nay có thể được coi là đã trưởng thành hơn về tổng thể. Đôi khi Maven được sử dụng cho các dự án không phải Java hoặc thậm chí đa ngôn ngữ, vì có các plugin để xử lý các ngôn ngữ khác hoặc môi trường cụ thể, chẳng hạn như Android. Có những plugin làm cầu nối giữa Maven và các công cụ xây dựng khác, chẳng hạn như frontend-maven-plugin thực sự xử lý nhiều công cụ xây dựng JS.


4
Ngoài thông tin ở trên, Danh sách phát trên Youtube sau đây thực hiện một công việc tuyệt vời mô tả việc sử dụng Maven với tư cách là người quản lý gói
Tommy Thompson

1
Tôi thường truy cập npmjs.com để tìm kiếm một gói có thể hữu ích. Phải mất khá nhiều googling để tìm liên kết thực hiện việc này trên Maven ( search.maven.org ). Tuy nhiên, các tìm kiếm không hướng tôi đến tài liệu, không hiển thị cho tôi số liệu về mức độ phổ biến, không trỏ đến github. Tôi không thấy nó hữu ích, cho thấy rằng đây là điều mà mọi người mong đợi ở NPM nhưng không phải ở Maven.
Joe Lapp

Một so sánh thống kê khá tốt giữa NPM và Maven là ở đây: stackshare.io/stackups/npm-vs-gradle
cacoder

1
Cập nhật cho câu trả lời này: "Hơn nữa, Maven cũ hơn đáng kể so với NPM, có cơ sở người dùng lớn hơn ..." Điều này có lẽ đúng khi câu hỏi ban đầu được trả lời vào năm 2017, nhưng không còn chính xác. Theo liên kết được đăng bởi @cacoder, cơ sở người dùng của NPM hiện lớn hơn Maven khoảng 11 lần. Nguồn: stackshare.io/stackups/gradle-vs-maven-vs-npm
mnutsch

28

Dưới đây tôi sử dụng |để phân tách giữa maven | các điều khoản npm tương ứng:

Các tính năng chung:

  • Cả hai công cụ đều hỗ trợ tìm nạp động các phụ thuộc ( tạo tác | gói ) dựa trên tệp mô tả pom.xml| package.json, và cũng cho phép bạn triển khai | xuất bản hiện vật của riêng bạn | các gói .

  • Cả hai đều có một kho lưu trữ công khai mặc định | registry ( http://repo.maven.apache.org/maven2/ | https://registry.npmjs.org ), nhưng bên thứ 3 cũng có thể được sử dụng (thông qua settings.xml|.npmrc ).

  • Cả hai đều hỗ trợ khái niệm về sự phụ thuộc ở cấp độ xây dựng (plugin | devDependencies được sử dụng trong script) . * Maven cũng hỗ trợ các providedphụ thuộc nhưng điều này dường như không áp dụng cho npm, vì javascript hiếm khi được triển khai vào các vùng chứa.

  • Cả hai đều hỗ trợ không gian tên phụ thuộc: groupId|scope

Sự khác biệt:

  • maven có một kho lưu trữ cục bộ bổ sung (bộ nhớ cache):

    • Không cần tìm nạp lại cùng một phụ thuộc cho các dự án khác nhau.
    • Các phần mềm được cài đặt cục bộ, có thể tự động truy cập bởi các dự án cục bộ khác.
  • các phụ thuộc từ một bản dựng dự án trong maven được tải xuống trong <homedir>/.m2. Với npm, chúng được tải xuống <projectdir>/node_modules.

  • Xây dựng trong maven thường là một quy trình một bước : mvn package(tìm nạp thẻ, xây dựng). Trong npm, nó là một quy trình gồm 2 bước: npm install(tìm nạp deps), npm build(xây dựng)

  • maven định nghĩa xây dựng vòng đời (đối với xây dựng, thử nghiệm, triển khai) bao gồm các giai đoạn, mà hoạt động mặc định (cắm bàn) đính kèm , dựa trên các tùy chọn bao bì differrent ( .jar, .war, .earvv). Sau đó, bạn có thể ghi đè các thao tác này hoặc chèn các thao tác mới (thông qua hệ thống plugin). Điều này cung cấp một loại giải pháp ngoại vi cho xây dựng, docgen, thử nghiệm, triển khai, v.v.
    phương pháp npm đơn giản hơn (xem: script )

  • Do đó, npm được gắn nhãn là công cụ quản lý gói cho javascript trong khi maven được gắn nhãn là công cụ quản lý phụ thuộc và tự động hóa xây dựng cho java .

  • Trong thiết lập maven, quá trình xây dựng thường liên quan đến việc chỉnh sửapom.xml .
    Trong npm, nó liên quan đến việc viết mã hoặc định cấu hình các công cụ xây dựng bổ sung như gulp, webpackv.v.

  • Vì lý do nào đó, phạm vi phiên bản do người dùng xác định trong mô-đun npm lỏng lẻo hơn nhiều so với trong maven. Điều này có thể gây ra sự cố với các phụ thuộc bắc cầu, đó là lý do tại sao một tệp bổ sung đã được thêm gần đây:package-lock.json

  • Với NPM nó là nhiều hơn nữa đơn giản để bắt đầu một dự án mới: npm init. Với maven, bạn cần biết cách viết tối thiểu pom.xml, hoặc đọc về các nguyên mẫu.

  • Nói chung, nó là phổ biến hơn nhiều để chỉnh sửa pom.xmlhơn package.json. Ví dụ: thêm các phụ thuộc trong maven được thực hiện thủ công (hoặc thông qua IDE) trong khi trong npm thông qua dòng lệnh .

  • Như với tất cả các công cụ xây dựng, bạn có thể gọi một công cụ này từ bên trong công cụ kia, nhưng tôi nghĩ việc gọi npm từ bên trong maven phổ biến hơn nhiều so với điều ngược lại.

  • npm hỗ trợ dev, production build . Trong maven, điều này cần được xác định thông qua các cấu hình .


5

Đúng. nó là một công cụ đóng gói tương tự cho java. cũng tìm kiếm gradlethứ mang lại cho bạn nhiều tự do hơn groovy language, nhưng ngay từ đầu, bạn có thể sử dụng mavenđể sắp xếp các phần phụ thuộc của mình. bạn bao gồm chúng dưới dạng thẻ ở đó và maven thực hiện công việc cho bạn.

nó đi qua cây phụ thuộc và tải xuống tất cả các lọ thích hợp.


1
không chắc vì tôi không quen thuộc với tất cả các công cụ js này. gradlemaven + antcùng nhau chúng ta hãy nói. nó thực hiện những gì maven làm nhưng nó cũng cho bạn quyền tự do viết mã và tập lệnh ngoài tất cả các công việc thực tế mà nó làm. tôi vừa mới xem qua gulp. có lẽ nó giống nhau, từ những gì tôi đọc. nếu bạn muốn bắt đầu sử dụng maven vs gradle, tôi khuyên bạn nên bắt đầu với mavencái nào rõ ràng hơn và dễ hiểu hơn, sau đó làm rối tung lên gradle!
Apostolos

Cảm ơn. Maven có cây phụ thuộc phẳng hay cây phụ thuộc lồng nhau?
Shubham Jain

1
ví dụ: xem tại đây mvnrepository.com/artifact/org.hibernate/hibernate-core/… . hibernate phụ thuộc vào nhiều thư viện khác, nhưng các lọ này sẽ không được lưu trữ trong kho lưu trữ maven cục bộ bên trong thư viện ngủ đông mà trong các gói riêng của chúng.
Apostolos

1
Tôi nghĩ rằng có một sự khác biệt trong việc xử lý các phụ thuộc lồng nhau (bắc cầu). mọi mô-đun nút có thể chứa phiên bản phụ thuộc của riêng nó trong khi maven sẽ cố gắng giải quyết thành một phụ thuộc chung duy nhất nếu một số phụ thuộc yêu cầu cùng một phụ thuộc thứ ba nhưng ở một phiên bản khác. Tôi cũng sẽ nói grunt phù hợp với gradle vì nhiệm vụ của nó dựa trên. gradle thiên về kiến ​​+ thường xuân trong khi maven được định hướng mạnh mẽ. có thể gần với webpack nhưng không có gì quá giống nhau.
wemu

1
xin lỗi, bạn đúng. nhầm lẫn nó với thủ tục xây dựng hồ sơ mà đôi khi tôi sử dụng và xác định các phiên bản.
Apostolos

0

Có, tương tự với gradle, nhưng chúng không thân thiện với người dùng như npm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.