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.
0 votes
Voir devops.stackexchange.com/questions/1432/