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?
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é. .
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".
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).
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.
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.
Ci-dessous, j'utilise |
Pour séparer maven | termes npm respectivement:
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
maven a un autreréférentiel local(cache):
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.
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.
Oui, pareil avec gradle, mais ils ne sont pas conviviaux comme npm.