web-dev-qa-db-fra.com

Maven est-il similaire à npm?

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

57
Shubham Jain

Même outil, langage différent?

Maven est l'outil de résolution de génération et de dépendance le plus populaire pour Java, tout comme NPM pour JS. Mais ce n'est pas juste le même outil pour une langue différente. Il existe évidemment d’énormes différences entre les versions Java et JS, et ces différences sont directement visibles dans le fonctionnement de Maven. Par exemple, alors que de nombreux outils JS font appel à Git pour effectuer des tâches lourdes, Maven fonctionne avec des référentiels Maven personnalisés basés sur des systèmes de fichiers, car Maven est un prédécesseur de Git et doit gérer des artefacts binaires, ce que Git ne gérait pas bien par le passé. .

Bases de maven

Maven dans sa forme la plus pure suit un modèle déclaratif, où pom.xml (Semblable à package.json) Définit différentes propriétés de la construction, mais ne contient aucun script. L'inconvénient est qu'il peut être difficile de peaufiner certains aspects de la construction sans utiliser de scripts, car vous devez vous appuyer sur des plugins. L'avantage est qu'il peut être plus facile de comprendre d'autres versions simplement en regardant pom.xml, Car elles suivent généralement la même approche sans trop de personnalisation. Gradle est un outil populaire basé sur Groovy, construit sur les normes et conventions Maven. Il est spécialement conçu pour simplifier pom.xml Et briser cette barrière "sans script".

Référencer vos dépendances

De la même manière que package.json, Vous ne travaillez pas directement avec pom.xml De votre dépendance, mais définissez plutôt les coordonnées de dépendance et laissez votre outil de génération gérer le reste. Dans Maven, la forme de base de ces coordonnées est GAV (groupId, artifactId, version).

Arbre de dépendance plat?

Sur la base des commentaires de l'autre réponse, Maven fournit "l'arbre de dépendance plat", et non "l'arbre de dépendance imbriqué" fourni par NPM par défaut. Maven n'autorise pas plusieurs versions de la même dépendance. Si plusieurs versions sont demandées, Maven utilise résolution de dépendance pour choisir une version unique. Cela signifie que parfois vos dépendances transitives auront une version différente de celle requise, mais il existe des moyens de le gérer. Cependant, cette limitation provient de Java et non de Maven, car (normalement) dans Java), un chargeur de classes ne fournira l’accès qu’à une seule définition de classe, même si plusieurs définitions se trouvent dans le chemin de classe. Since = Java n’est pas particulièrement efficace, Maven tente d’éviter ce scénario.

Remarque: depuis npm v3, les dépendances sont aplaties. Le gestionnaire de paquets alternatif fil fait également la même chose.

Maturité

En outre, Maven est considérablement plus âgé que NPM, dispose d’une base d’utilisateurs plus importante et d’un nombre considérable de plug-ins personnalisés et pourrait jusqu’à présent être considéré comme plus mature. Parfois, Maven est utilisé pour des projets non-Java ou même polyglottes, car il existe des plug-ins permettant de gérer d'autres langages ou des environnements spécifiques, tels qu'Android. Il existe des plugins qui relient Maven et d'autres outils de construction, tels que frontend-maven-plugin , qui gère en réalité plusieurs outils de construction JS.

95
Anton Koscejev

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

Caractéristiques communes:

  • Les deux outils prennent en chargeextraction dynamique des dépendances(artefacts | packages) basés sur un fichier descripteurpom.xml | package.json, et vous permet également dedeploy | publiervotre propreartefacts | paquets.

  • Ils ont tous les deux un public par défautrepository | registry( http://repo.maven.Apache.org/maven2/ | https://registry.npmjs.org ), mais une tierce partie peut également être utilisée (viasettings.xml | .npmrc).

  • Ils supportent tous deux le concept dedépendances au niveau de la compilation (plugins | devDependencies utilisées dans les scripts). * Maven supporte également provided dépendances, mais cela ne semble pas s'appliquer à npm, car javascript est rarement déployé dans des conteneurs.

  • Ils supportent tous les deux l'espacement de noms de dépendance: groupId | scope

Différences:

  • maven a un autreréférentiel local(cache):

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

  • Construire dansmavenest généralement unprocessus en une étape: mvn package (Fetch deps, build ) En npm, il s’agit d’un processus en deux étapes: npm install (Fetch deps), npm build (Build)

  • maven définitconstruire les cycles de vie(pour construire, tester, déployer)est composé de phases, auxquelles les opérations par défaut (objectifs de plugin) attachent, basé sur différentes options d'empaquetage (.jar, .war, .ear etc.). Vous pouvez ensuite écraser ces opérations ou en injecter de nouvelles (via le système de plug-in). Ceci fournit une sorte de solution prête à l'emploi pour construire, docgen, tester, déployer e.t.c. L’approche npm est plus simpliste (voir: scripts )

  • Dans maven, le processus de construction est plus souvent associé àéditer le pom.xml. En npm, cela impliqueécriture du code.

  • Pour une raison quelconque,version plagesdéfinies par les utilisateurs dans les modules npm, sont beaucoup plus nombreuses quelooseque dans maven. Cela peut causer des problèmes avec les dépendances transitives, c’est pourquoi un fichier supplémentaire a été ajouté récemment:package-lock.json

  • Avec npm c'est beaucoup plussimple pour démarrerun nouveau projet: npm init. Avec maven, vous devez savoir écrire un minimum de pom.xml Ou lire sur les archétypes.

  • En général, il est beaucoup plus courant de modifier pom.xml Que package.json. Par exemple.ajout de dépendances dans mavenest faitmanuellement(ou via IDE) ennpm via la ligne de commande.

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

  • npm prend en chargedev, les versions de production. Dans maven, cela doit être défini viaprofiles.

14
Marinos An

oui. c'est un outil de packaging similaire pour Java. cherchez 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 sous forme de balises et maven fait le travail pour vous.

il parcourt l'arbre de dépendance et télécharge tous les fichiers JAR appropriés.

3
Apostolos

Oui, pareil avec gradle, mais ils ne sont pas conviviaux comme npm.

0
LEMUEL ADANE