Comment configurer Maven pour le développement hors ligne?

117

Maven a-t-il besoin d'une connexion Internet à un moment donné pour pouvoir l'utiliser? Cela signifie obtenir spécifiquement les plugins internes maven pour la compilation, le nettoyage, l'emballage, etc.?


la source
Avez-vous une machine avec accès Internet? Peut-être un serveur?
Marcelo
2
Nous le faisons, mais faire passer les choses de là à l'environnement de développement est bien, fastidieux.

Réponses:

163

Vous pouvez exécuter maven en mode hors ligne mvn -o install. Bien entendu, tous les artefacts non disponibles dans votre référentiel local échoueront. Maven n'est pas basé sur des référentiels distribués, mais ils rendent certainement les choses plus transparentes. C'est pour cette raison que de nombreux magasins utilisent des miroirs internes qui sont progressivement synchronisés avec les dépôts centraux.

En outre, le mvn dependency:go-offlinepeut être utilisé pour vous assurer que toutes vos dépendances sont installées localement avant de commencer à travailler hors ligne.

nsfyn55
la source
Inconjuntion avec cette réponse, j'ai découvert que mvn est livré avec ses plugins "core" (ie compilateur). Donc, avec mvn install, je peux obtenir ce dont j'ai besoin.
8
Considérez également que vous pouvez utiliser "mvn dependency: go-offline" pour vous assurer que toutes les dépendances référencées dans votre pom.xml sont présentes dans votre référentiel local.
Thorbjørn Ravn Andersen
10
Malheureusement, mvn dependency:go-offlinene saisit tout simplement pas tout. À l'intérieur d'une nouvelle machine virtuelle, par exemple, mon projet doit toujours télécharger des éléments même après avoir exécuté cet objectif. Voir aussi ce numéro .
phs
2
Mon expérience montre que l'option -o ne fonctionne pas correctement et que l'objectif de mise hors ligne est loin d'être suffisant pour permettre une construction complète hors ligne: voir la solution que j'ai trouvée ici: stackoverflow.com/q/43661755/1767316
user1767316
Si vous ajoutez le drapeau -llr en plus à -o, cela devrait fonctionner.
Udo
10

Si vous avez un PC avec accès Internet dans votre LAN, vous devez installer un référentiel Maven local.

Je recommande Artifactory Open Source . C'est ce que nous utilisons dans notre organisation, c'est vraiment facile à mettre en place.

Artifactory agit comme un proxy entre votre outil de construction (Maven, Ant, Ivy, Gradle, etc.) et le monde extérieur.

Il met en cache les artefacts distants afin que vous n'ayez pas à les télécharger encore et encore.

Il bloque les demandes externes indésirables (et parfois sensibles à la sécurité) d'artefacts internes et contrôle comment et où les artefacts sont déployés et par qui.

Après avoir configuré Artifactory, il vous suffit de changer les Maven settings.xmldans les machines de développement:

<?xml version="1.0" encoding="UTF-8"?>
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <mirrors>
    <mirror>
      <mirrorOf>*</mirrorOf>
      <name>repo</name>
      <url>http://maven.yourorganization.com:8081/artifactory/repo</url>
      <id>repo</id>
    </mirror>
  </mirrors>
  <profiles>
    <profile>
      <repositories>
        <repository>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <id>central</id>
          <name>libs-release</name>
          <url>http://maven.yourorganization.com:8081/artifactory/libs-release</url>
        </repository>
        <repository>
          <snapshots />
          <id>snapshots</id>
          <name>libs-snapshot</name>
          <url>http://maven.yourorganization.com:8081/artifactory/libs-snapshot</url>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <id>central</id>
          <name>plugins-release</name>
          <url>http://maven.yourorganization.com:8081/artifactory/plugins-release</url>
        </pluginRepository>
        <pluginRepository>
          <snapshots />
          <id>snapshots</id>
          <name>plugins-snapshot</name>
          <url>http://maven.yourorganization.com:8081/artifactory/plugins-snapshot</url>
        </pluginRepository>
      </pluginRepositories>
      <id>artifactory</id>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>artifactory</activeProfile>
  </activeProfiles>
</settings>

Nous avons utilisé cette solution parce que nous avions des problèmes d'accès à Internet dans nos machines de développement et que certains artefacts téléchargeaient des fichiers corrompus ou ne se téléchargeaient pas du tout. Nous n'avons pas eu de problèmes depuis.

Marcelo
la source
Il n'y a pas de machine avec accès qui soit connectée au LAN.
2
Avec artifactory, vous pouvez sauvegarder l'ensemble de votre référentiel, puis le restaurer sur l'un des PC qui se trouve sur le réseau local.
Marcelo
7

Vous avez deux options pour cela:

1.) faites des changements dans le settings.xml ajoutez ceci dans la première balise

<localRepository>C:/Users/admin/.m2/repository</localRepository>

2.) utilisez la balise -o pour la commande hors ligne.

mvn -o clean install -DskipTests=true
mvn -o jetty:run
Jyoti Prakash
la source
6

Maven a besoin des dépendances dans votre référentiel local. Le moyen le plus simple de les obtenir est d'accéder à Internet (ou plus difficile d'utiliser d'autres solutions fournies ici).

Donc, en supposant que vous puissiez accéder temporairement à Internet, vous pouvez vous préparer à vous déconnecter en utilisant le plugin maven-dependency-plugin avec sa dépendance: l' objectif de passer hors ligne . Cela téléchargera toutes les dépendances de votre projet dans votre référentiel local (bien sûr, les changements dans les dépendances / plugins nécessiteront un nouvel accès Internet / au référentiel central).

FrVaBe
la source
4

Malheureusement, cela dependency:go-offlinen'a pas fonctionné pour moi car il n'a pas tout mis en cache, c'est-à-dire. Les fichiers POM et autres mentionnent implicitement des dépendances.

La solution de contournement a été de spécifier un emplacement de référentiel local , soit dans le settings.xmlfichier avec, <localRepository>...</localRepository>soit en s'exécutant mvnavec un -Dmaven.repo.local=...paramètre. Après la génération initiale du projet, tous les artefacts nécessaires doivent être mis en cache, puis vous pouvez référencer l'emplacement du référentiel de la même manière, tout en exécutant la génération Maven en mode hors connexion ( mvn -o ...).

luka5z
la source
3

Avant de vous déconnecter, vous devez vous assurer que tout se trouve dans votre dépôt local, ce qui est nécessaire lorsque vous travaillez hors ligne. Lancer "mvn dependency: go-offline" pour le (s) projet (s) / pom (s) sur lequel (s) vous comptez travailler réduira les efforts pour y parvenir.

Mais ce n'est généralement pas toute l'histoire, parce que dependency: go-offline ne téléchargera que les plugins "bare build" ( go-offline / resolution-plugins ne résout pas toutes les dépendances de plugin ). Vous devez donc trouver un moyen de télécharger les plugins de déploiement / test / site (et peut-être d'autres) et leurs dépendances dans votre dépôt.

De plus, la dépendance: go-offline ne télécharge pas l'artefact de pom lui-même, donc vous devez la dépendance: copiez-le si nécessaire.

Parfois - comme l'a écrit MaDa - vous ne savez pas ce dont vous aurez besoin, tout en étant hors ligne, ce qui rend pratiquement impossible d'avoir un dépôt «suffisant».

Quoi qu'il en soit, ayant un dépôt correctement rempli, il vous suffit d'ajouter "<offline> true </offline>" au settings.xml de Maven pour vous déconnecter.

Ne modifiez pas le profil Maven (id) que vous avez utilisé pour remplir votre dépôt, tout en étant hors ligne. Maven reconnaît les artefacts téléchargés dans ses métadonnées avec une "identité", qui est liée à l'ID de profil.

Eike Pögel
la source
3

Si vous utilisez IntelliJ, vous pouvez simplement aller dans Préférences -> Build, Execution, Deployment -> Build Tools -> Maven et cocher / décocher Travailler hors ligne .

heez
la source
1
De même - Eclipse est Window -> Préférences -> Maven et cochez "Offline"
Stuart Brock
2

Est-ce que ça marche pour toi?

http://jojovedder.blogspot.com/2009/04/running-maven-offline-using-local.html

N'oubliez pas de l'ajouter à votre référentiel de plugins et pointez l'URL vers où se trouve votre référentiel.

<repositories>
    <repository>
        <id>local</id>
        <url>file://D:\mavenrepo</url>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>local</id>
        <url>file://D:\mavenrepo</url>
    </pluginRepository>
</pluginRepositories>

Sinon, vous devrez peut-être exécuter un serveur local, par exemple apache, sur vos machines.

gigadot
la source
Cela semble être plus pour les dépendances et les plugins comme les plugins jetty, tomcat, etc. Je suis plus préoccupé par les plugins internes maven comme maven-compiler-plugin
1
@predhme: Cette approche fonctionnera pour tous les plugins, car tous vont dans le référentiel maven sur votre machine locale
JoseK
2


(source: jfrog.com )

ou

Utilisez simplement des serveurs de référentiel Maven comme Sonatype Nexus http://www.sonatype.org/nexus/ ou JFrog Artifactory https://www.jfrog.com/artifactory/ .

Une fois qu'un développeur a créé un projet, celui des prochains développeurs ou Jenkins CI ne nécessitera pas d'accès Internet.

Le serveur de référentiel Maven peut également avoir des proxys configurés pour accéder à Maven Central (ou à des référentiels publics plus nécessaires), et ils peuvent avoir une liste d'artefacts cynchée dans des référentiels distants.

Paul Verest
la source
1

Mon expérience montre que l'option -o ne fonctionne pas correctement et que l'objectif de mise hors ligne est loin d'être suffisant pour permettre une compilation complète hors ligne:

La solution que j'ai pu valider comprend l'utilisation de l' --legacy-local-repositoryoption maven plutôt que celle -o(hors ligne) et l'utilisation du référentiel local à la place du référentiel de distribution

De plus, j'ai dû copier tous les maven-metadata-maven2_central.xmlfichiers du local-repo sous la maven-metadata.xmlforme attendue par maven.

Voir la solution que j'ai trouvée ici .

user1767316
la source
0

Répondre directement à votre question: cela ne nécessite pas de connexion Internet, mais l'accès à un référentiel, sur LAN ou disque local (utilisez les indices d'autres personnes qui ont posté ici).

Si votre projet n'est pas dans une phase de maturité, cela signifie que lorsque les POM sont modifiés assez souvent, le mode hors ligne sera très peu pratique, car vous devrez également mettre à jour votre référentiel assez souvent. À moins que vous ne puissiez obtenir une copie d'un référentiel contenant tout ce dont vous avez besoin, mais comment le sauriez-vous? Habituellement, vous démarrez un référentiel à partir de zéro et il est cloné progressivement au cours du développement (sur un ordinateur connecté à un autre référentiel). Une copie du référentiel public repo1.maven.org pèse des centaines de gigaoctets, donc je ne recommanderais pas non plus la force brute.

MaDa
la source
C'est, mais pas comme un projet maven (fourmi). J'ai donc toutes les bibliothèques dont j'ai besoin, mais je m'interrogeais spécifiquement sur les bibliothèques internes de maven. Tels que maven-plugin-compiler.
Si vous avez toutes les dépendances gérées par Ant, vous manquez probablement de métadonnées Maven de toute façon, donc Maven ne les récupérera pas. Quant aux "bibliothèques internes Maven", la seule façon de les télécharger est de construire votre structure pom et de l'exécuter sur un ordinateur connecté à Internet. Par "l'exécuter", je veux dire exécuter toutes les cibles que vous pensez utiliser, pas nécessairement seulement "mvn clean install".
MaDa
0

En préparation avant de travailler hors ligne, exécutez simplement mvn dependency:go-offline

msangel
la source
0

Un nouveau plugin est apparu pour corriger les lacunes de mvn dependency:go-offline:

https://github.com/qaware/go-offline-maven-plugin

Ajoutez-le dans votre pom, puis exécutez mvn -T1C de.qaware.maven:go-offline-maven-plugin:resolve-dependencies. Une fois que vous avez configuré toutes les dépendances dynamiques, maven n'essaiera plus de télécharger quoi que ce soit (jusqu'à ce que vous mettiez à jour les versions).

Jiehong
la source
-2
<offline> false </offline>

<localRepository>${user.home}/.m2/repository</localRepository>

à

<offline> true <offline>

<localRepository>${user.home}/.m2/repository</localRepository>

Modifiez la balise hors ligne de false à true.

va télécharger à partir du repo en ligne

dhanaraj k
la source