98 votes

Maven est-il similaire à npm ?

Comme j'ai travaillé avec npm qui recherche les dépendances dans le fichier package.json et les télécharge pour vous. De même, je vois un fichier pom.xml dans un projet Java. Est-ce que maven regarde dans ce fichier et télécharge les dépendances pour moi. Puis-je faire circuler ce fichier pom.xml comme le fichier package.json, plutôt que de donner les bocaux de dépendance ? Ces outils sont-ils similaires et sont-ils simplement construits pour des plateformes différentes ?

0 votes

144voto

Anton Koscejev Points 2432

Même outil, langage différent ?

Maven est l'outil de construction et de résolution des dépendances le plus populaire pour Java, tout comme NPM l'est pour JS. Mais il ne s'agit pas simplement du même outil pour un langage différent. Il existe évidemment d'énormes différences entre les constructions Java et JS, et ces différences sont directement visibles dans le mode de fonctionnement de Maven. Par exemple, alors que de nombreux outils JS s'appuient sur Git pour faire le gros du travail, Maven fonctionne avec des dépôts Maven personnalisés basés sur le système de fichiers, car Maven est antérieur à Git et doit gérer des artefacts binaires, ce que Git n'a jamais su faire. Dans Maven, il y a une séparation claire entre les sources et les binaires, alors qu'ils sont souvent la même chose dans le monde JS.

Les bases de Maven

Maven, dans sa forme la plus pure, suit un modèle déclaratif, où pom.xml (similaire à package.json ) définit différentes propriétés de la construction, mais ne contient pas de scripts. L'inconvénient est qu'il peut être difficile d'affiner certains aspects de la compilation sans utiliser de scripts, car vous devez vous fier aux plugins. L'avantage est qu'il peut être plus facile de comprendre d'autres builds en regardant simplement pom.xml car ils suivent généralement la même approche sans trop de personnalisation. Gradle est un outil populaire basé sur Groovy et construit sur les normes et les conventions de Maven. pom.xml et briser cette barrière "pas de script".

Référencement de vos dépendances

De même que package.json vous ne travaillez pas avec pom.xml de votre dépendance directement, mais plutôt définir les coordonnées de la dépendance et laisser votre outil de construction gérer le reste. Dans Maven, la forme de base de ces coordonnées est GAV (groupId, artifactId, version).

Arbre de dépendance plat ?

D'après les commentaires de l'autre réponse, Maven fournit un "arbre de dépendance plat", et non un "arbre de dépendance imbriqué" que NPM fournit par défaut. Maven n'autorise pas les versions multiples d'une même dépendance. S'il arrive que des versions différentes soient demandées, Maven utilise l'option résolution des dépendances pour choisir une seule version. Cela signifie que parfois vos dépendances transitives obtiendront une version différente de celle dont elles ont besoin, mais il existe des moyens de gérer cela. Toutefois, cette limitation provient de Java, et non de Maven, car (normalement) en Java, un chargeur de classe ne donne accès qu'à une seule définition de classe, même si plusieurs définitions sont trouvées sur le classpath. Comme Java n'est pas particulièrement doué pour gérer cela, Maven essaie d'éviter ce scénario en premier lieu.

Note : depuis npm v3 les dépendances sont aplaties. Le gestionnaire de paquets alternatif fils fait également de même.

Maturité

En outre, Maven est considérablement plus ancien que NPM, a une plus grande base d'utilisateurs, un grand nombre de plugins personnalisés, et jusqu'à présent pourrait probablement être considéré comme plus mature dans l'ensemble. Maven est parfois utilisé pour des projets non-Java ou même polyglottes, car il existe des plugins pour gérer d'autres langages ou des environnements spécifiques, comme Android. Il existe des plugins qui font le lien entre Maven et d'autres outils de construction, tels que frontend-maven-plugin qui gère plusieurs outils de construction JS.

4 votes

En plus des informations ci-dessus, les éléments suivants Liste de lecture Youtube décrit très bien l'utilisation de Maven en tant que gestionnaire de paquets.

2 votes

Je me rends souvent sur npmjs.com pour rechercher un paquet qui pourrait m'être utile. Il m'a fallu beaucoup de recherches sur Google pour trouver un lien permettant de faire cela sur Maven ( recherche.maven.org ). Cependant, les recherches ne m'orientent pas vers les documents, ne me montrent pas les mesures de popularité, ne m'orientent pas vers github. Je ne trouve pas cela utile, ce qui suggère que c'est quelque chose que les gens attendent de NPM mais pas de Maven.

0 votes

Une comparaison statistique assez bonne entre NPM et Maven est ici : stackshare.io/stackups/npm-vs-gradle

37voto

Marinos An Points 98

Ci-dessous, j'utilise | pour séparer les termes maven | npm respectivement :

Caractéristiques communes :

  • Les deux outils prennent en charge récupération dynamique des dépendances ( artefacts | paquets ) sur la base d'un fichier de descripteurs pom.xml | package.json et vous permettent également de déployer | publier votre propre artefacts | paquets .

  • Ils ont tous deux un public par défaut dépôt | registre ( http://repo.maven.apache.org/maven2/ | https://registry.npmjs.org ), mais il est également possible d'utiliser la troisième partie (par le biais de settings.xml | .npmrc ).

  • Ils soutiennent tous deux le concept de dépendances au niveau de la construction (plugins | devDependencies utilisés dans les scripts) . *Maven prend en charge provided mais cela ne semble pas s'appliquer à npm, puisque javascript est rarement déployé dans des conteneurs.

  • Ils prennent tous deux en charge l'espacement des noms des dépendances : groupId | scope

Différences :

  • maven a une fonction supplémentaire dépôt local (cache) :

    • Il n'est pas nécessaire de récupérer la même dépendance pour différents projets.
    • Les artefacts qui sont installés localement, sont automatiquement accessibles par d'autres projets locaux.
  • les dépendances d'un projet construit dans maven sont téléchargées dans <homedir>/.m2 . Avec npm, ils sont téléchargés dans <projectdir>/node_modules .

  • Bâtiment en maven est généralement un processus en une étape : mvn package (fetch deps , build). Dans npm, c'est un processus en deux étapes : npm install (récupérer les deps) , npm build (construire)

  • maven définit les cycles de vie de la construction (pour construire, tester, déployer) se compose de phases, auxquelles se rattachent des opérations par défaut (objectifs des plugins). sur la base de différentes options d'emballage( .jar , .war , .ear e.t.c). Vous pouvez ensuite écraser ces opérations, ou en injecter de nouvelles (via le système de plugins). Cela fournit une sorte de solution prête à l'emploi pour build,docgen,test,deploy e.t.c.
    L'approche de npm est plus simpliste ( voir : scripts )

  • En raison de ce qui précède, npm est étiquetée comme une outil de gestion des paquets pour javascript tandis que maven est étiqueté comme un outil d'automatisation de la construction et de gestion des dépendances pour java .

  • Dans maven, la mise en place du processus de construction implique plus généralement l'édition du pom.xml .
    Dans npm, il s'agit de écrire le code ou de configurer outils de construction complémentaires comme gulp , webpack e.t.c

  • Pour une raison quelconque gammes de versions définis par les utilisateurs dans les modules npm, sont beaucoup plus en vrac que dans maven. Cela peut causer des problèmes avec les dépendances transitives, c'est pourquoi un fichier supplémentaire a été récemment ajouté : package-lock.json

  • Avec npm, c'est beaucoup plus simple à démarrer un nouveau projet : npm init . Avec maven, vous devez savoir comment écrire une version minimale de . pom.xml ou lire sur les archétypes.

  • En général, il est beaucoup plus courant d'éditer pom.xml que package.json . Par exemple ajout de dépendances dans maven est fait manuellement (ou via l'IDE) alors que vous êtes dans npm via la ligne de commande .

  • Comme avec tous les outils de construction, vous pouvez appeler un outil à partir de l'intérieur de l'autre, mais je pense qu'il est beaucoup plus courant d'appeler npm à partir de maven plutôt que l'inverse.

  • npm prend en charge Constructions de développement et de production . Dans maven, cela doit être défini par profils .

4voto

Apostolos Points 721

Oui. Il s'agit d'un outil de conditionnement similaire pour Java. gradle également ce qui vous donne plus de liberté avec groovy language mais pour commencer, vous pouvez utiliser maven pour organiser vos dépendances. Vous les incluez comme des balises et maven fait le travail pour vous.

il parcourt l'arbre des dépendances et télécharge toutes les jarres appropriées.

1 votes

Je ne suis pas sûr car je ne suis pas très familier avec tous ces outils js. gradle es maven + ant Il fait ce que maven fait, mais il vous donne aussi la liberté d'écrire du code et des scripts en plus de toutes les tâches qu'il accomplit de facto. j'ai jeté un coup d'œil à gulp Si vous voulez commencer à utiliser maven plutôt que gradle, je vous suggère de commencer avec maven ce qui est plus clair et plus facile à comprendre et ensuite semer le désordre avec gradle !

0 votes

Merci. Maven a-t-il un arbre de dépendance plat ou un arbre de dépendance imbriqué ?

0 votes

Je ne comprends pas ce que vous voulez dire. Vous voulez parler du problème que npm avait avec les dépendances stockées dans des répertoires sub-node_modules et ayant des problèmes de chemin de fichier avec plus de 256 caractères, qui a été corrigé dans npm 3 ? maven stocke tous les jars dans un repo et chaque jar est stocké dans son package.

-1voto

Lemuel Adane Points 799

Oui, même chose avec gradle, mais ils ne sont pas aussi conviviaux que npm.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X