web-dev-qa-db-fra.com

Comment ajouter des fichiers JAR locaux à un projet Maven?

Comment ajouter des fichiers JAR locaux (ne faisant pas encore partie du référentiel Maven) directement dans les sources de la bibliothèque de mon projet?

989
Praneel PIDIKITI

Installez le fichier JAR dans votre référentiel Maven local comme suit:

mvn install:install-file \
   -Dfile=<path-to-file> \
   -DgroupId=<group-id> \
   -DartifactId=<artifact-id> \
   -Dversion=<version> \
   -Dpackaging=<packaging> \
   -DgeneratePom=true

Où chacun fait référence à:

<path-to-file>: le chemin du fichier à charger, par exemple → → c:\kaptcha-2.3.jar

<group-id>: le groupe dans lequel le fichier doit être enregistré, par exemple → → com.google.code

<artifact-id>: nom de l'artefact du fichier, par exemple → → kaptcha

<version>: la version du fichier, par exemple → 2.3

<packaging>: l'emballage du fichier, par exemple. → jar

Référence

562
user373455

Vous pouvez ajouter directement des dépendances locales (comme mentionné dans construire un projet maven avec les bibliothèques de la propriété incluses ) comme ceci:

<dependency>
    <groupId>com.sample</groupId>
    <artifactId>sample</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/yourJar.jar</systemPath>
</dependency>

Mettre à jour

Dans les nouvelles versions, cette fonctionnalité est marquée comme obsolète, mais elle fonctionne toujours et n’a pas encore été supprimée (vous voyez seulement un avertissement dans le journal lors du démarrage de maven). Un problème est soulevé à ce sujet par le groupe maven https://issues.Apache.org/jira/browse/MNG-652 (Vous pouvez participer et décrire pourquoi cette fonctionnalité est utile dans certains cas). J'espère que cette fonctionnalité reste là!

Si vous me demandez, tant que la fonctionnalité n'est pas supprimée, je l'utilise pour créer une dépendance à seulement one fichier jar méchant dans mon projet qui ne rentre pas dans le référentiel. Si cette fonctionnalité est supprimée, eh bien, il y a beaucoup de bonnes réponses ici que je peux choisir plus tard!

1280
Alireza Fattahi

Tout d'abord, j'aimerais attribuer cette réponse à un utilisateur anonyme de Stack Overflow (je suis presque sûr que j'ai déjà vu une réponse similaire ici auparavant), mais je ne parviens pas à la trouver.

La meilleure option pour avoir des fichiers JAR locaux en tant que dépendance consiste à créer un référentiel Maven local. Un tel référentiel n’est rien de plus qu’une structure de répertoires appropriée contenant des fichiers pom.

Pour mon exemple: j'ai mon projet principal sur ${master_project} location et le sous-projet1 est sur ${master_project}/${subproject1}.

Ensuite, je crée un référentiel Maven dans: ${master_project}/local-maven-repo.

Dans le fichier pom du sous-projet1 situé en ${master_project}/${subproject1}/pom.xml, vous devez spécifier le référentiel, qui prendrait le chemin du fichier sous forme de paramètre d'URL:

<repositories>
    <repository>
        <id>local-maven-repo</id>
        <url>file:///${project.parent.basedir}/local-maven-repo</url>
    </repository>
</repositories>

La dépendance peut être spécifiée comme pour tout autre référentiel. Cela rend votre référentiel pom indépendant. Par exemple, une fois que le fichier JAR souhaité est disponible dans Maven central, il vous suffit de le supprimer de votre référentiel local et il sera extrait du référentiel par défaut.

    <dependency>
        <groupId>org.Apache.felix</groupId>
        <artifactId>org.Apache.felix.servicebinder</artifactId>
        <version>0.9.0-SNAPSHOT</version>
    </dependency>

La dernière chose à faire est d'ajouter le fichier JAR au référentiel local à l'aide du commutateur -DlocalRepositoryPath, comme suit:

mvn org.Apache.maven.plugins:maven-install-plugin:2.5.2:install-file  \
    -Dfile=/some/path/on/my/local/filesystem/felix/servicebinder/target/org.Apache.felix.servicebinder-0.9.0-SNAPSHOT.jar \
    -DgroupId=org.Apache.felix -DartifactId=org.Apache.felix.servicebinder \
    -Dversion=0.9.0-SNAPSHOT -Dpackaging=jar \
    -DlocalRepositoryPath=${master_project}/local-maven-repo

Une fois le fichier JAR installé, votre référentiel Maven peut être validé dans un référentiel de code et l'ensemble de la configuration est indépendant du système. ( Exemple de travail dans GitHub ).

Je conviens qu'engager des JAR dans le référentiel de code source n'est pas une bonne pratique, mais dans la réalité, des solutions rapides et sales sont parfois meilleures qu'un référentiel Nexus complet pour héberger un JAR que vous ne pouvez pas publier.

115
JJ Roman

Créez un nouveau dossier, disons local-maven-repo à la racine de votre projet Maven.

Ajoutez simplement un dépôt local dans votre <project> de votre pom.xml:

<repositories>
    <repository>
        <id>local-maven-repo</id>
        <url>file:///${project.basedir}/local-maven-repo</url>
    </repository>
</repositories>

Ensuite, pour chaque fichier JAR externe que vous souhaitez installer, accédez à la racine de votre projet et exécutez:

mvn deploy:deploy-file -DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] -Durl=file:./local-maven-repo/ -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile=[FILE_PATH]
104
Anthony O.

Je voudrais une telle solution - utilisez maven-install-plugin dans le fichier pom:

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.5.2</version>
            <executions>
                <execution>
                    <phase>initialize</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>lib/yourJar.jar</file>
                        <groupId>com.somegroup.id</groupId>
                        <artifactId>artefact-id</artifactId>
                        <version>x.y.z</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Dans ce cas, vous pouvez exécuter mvn initialize et jar sera installé dans le référentiel maven local. Maintenant, ce fichier est disponible à n’importe quelle étape maven sur cette machine (n’oubliez pas d’inclure cette dépendance comme toute autre dépendance maven dans pom avec la balise <dependency></dependency>). Il est également possible de lier l’installation de jar non pas à initialize step, mais à toute autre étape de votre choix.

30
sphinks
<dependency>
    <groupId>group id name</groupId>
    <artifactId>artifact name</artifactId>
    <version>version number</version>
    <scope>system</scope>
    <systemPath>jar location</systemPath>
</dependency>
26
Satish Karuturi

Oui, vous pouvez en avoir mais ce n’est pas une bonne idée.

Installez plutôt tous ces pots à maven repos

Voir aussi

14
Jigar Joshi

Une solution consiste à le télécharger sur votre propre gestionnaire de référentiel Maven (tel que Nexus). C'est une bonne pratique d'avoir de toute façon un gestionnaire de référentiel propre.

Une autre façon intéressante que j'ai récemment vue consiste à inclure le plug-in d'installation Maven dans votre cycle de vie de génération: vous déclarez dans le POM installer les fichiers dans le référentiel local. C'est un peu mais petit frais généraux et aucune étape manuelle impliquée.

http://maven.Apache.org/plugins/maven-install-plugin/install-file-mojo.html

9
Puce

Ajoutez votre propre fichier JAR local dans le fichier POM et utilisez-le dans maven build.

mvn install:install-file -Dfile=path-to-jar -DgroupId=owngroupid -DartifactId=ownartifactid -Dversion=ownversion -Dpackaging=jar

Par exemple:

mvn install:install-file -Dfile=path-to-jar -DgroupId=com.decompiler -DartifactId=jd-core-Java -Dversion=1.2 -Dpackaging=jar

Ajoutez-le ensuite au POM comme ceci:

enter image description here

8

La manière vraiment rapide et sale est de pointer sur un fichier local:

<dependency>
      <groupId>sample</groupId>  
       <artifactId>com.sample</artifactId>  
       <version>1.0</version> 
      <scope>system</scope>
      <systemPath>C:\DEV\myfunnylib\yourJar.jar</systemPath>
</dependency>

Cependant, cela ne vivra que sur votre machine (évidemment), car le partage a généralement du sens d'utiliser une archive m2 appropriée (lien/artificiel) ou si vous n'en possédez pas ou si vous ne voulez pas en créer un. archive structurée et configurez un "référentiel" dans votre pom: local:

<repositories>
    <repository>
        <id>my-local-repo</id>
        <url>file://C:/DEV//mymvnrepo</url>
    </repository>
</repositories>

éloigné:

<repositories>
    <repository>
        <id>my-remote-repo</id>
        <url>http://192.168.0.1/whatever/mavenserver/youwant/repo</url>
    </repository>
</repositories>

pour cela, un chemin relatif est également possible en utilisant la variable basedir:

<url>file:${basedir}</url>
8
fl0w

Bien sûr, vous pouvez ajouter des bocaux à ce dossier. Mais peut-être que cela ne correspond pas à ce que vous voulez réaliser ...

Si vous avez besoin de ces fichiers jar pour la compilation, vérifiez cette question connexe: Puis-je ajouter des fichiers JAR à maven 2 build classpath sans les installer?

De plus, avant que quiconque ne le suggère, n'utilisez PAS l'étendue du système.

7
Cephalopod

ligne de commande :

mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code
-DartifactId=kaptcha -Dversion={version} -Dpackaging=jar
6
Hassani

Un autre cas intéressant est lorsque vous souhaitez inclure dans votre projet des bocaux privés maven. Vous souhaiterez peut-être conserver les capacités de Maven pour résoudre les dépendances transitives. La solution est assez facile.

  1. Créez un dossier libs dans votre projet
  2. Ajoutez les lignes suivantes dans votre fichier pom.xml

    <properties><local.repository.folder>${pom.basedir}/libs/</local.repository.folder>
    </properties>
    
    <repositories>
       <repository>
            <id>local-maven-repository</id>
            <url>file://${local.repository.folder}</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
       </repository>
    </repositories>
    
  3. Ouvrez le dossier . M2/repository et copiez la structure de répertoires du projet que vous souhaitez importer dans le dossier libs.

Par exemple. supposons que vous vouliez importer la dépendance

<dependency>
    <groupId>com.mycompany.myproject</groupId>
    <artifactId>myproject</artifactId>
    <version>1.2.3</version>
</dependency>

Allez simplement . M2/repository et vous verrez le dossier suivant

com/mycompany/myproject/1.2.

Copiez tout dans votre dossier libs (encore une fois, y compris les dossiers situés sous . M2/repository) et vous avez terminé.

5
JeanValjean

La méthode préférée serait de créer votre propre référentiel distant.

Voir ici pour plus de détails sur la façon de le faire. Consultez la section ' Chargement dans un référentiel distant '.

3
Simeon

Jetez également un coup d'œil à ...

<scope>compile</scope>

Dépendances Maven . Ceci est la valeur par défaut, mais dans certains cas, Maven a explicitement défini explicitement cette étendue pour rechercher des bibliothèques locales dans le référentiel local.

2
kervin

Ceci est une syntaxe courte pour les nouvelles versions:

mvn install:install-file -Dfile=<path-to-file>

Cela fonctionne lorsque le JAR a été construit par Apache Maven - le cas le plus courant. Ensuite, il contiendra un pom.xml dans un sous-dossier du répertoire META-INF, qui sera lu par défaut.

Source: http://maven.Apache.org/guides/mini/guide-3rd-party-jars-local.html

2
joro

Je veux partager un code où vous pouvez télécharger un dossier plein de bocaux. C'est utile lorsqu'un fournisseur ne dispose pas d'un référentiel public et que vous devez ajouter de nombreuses bibliothèques manuellement. J'ai décidé de créer un fichier .bat au lieu d'appeler directement maven car il pourrait s'agir d'erreurs de mémoire insuffisante. Il a été préparé pour un environnement Windows mais il est facile de l’adapter au système d’exploitation Linux:

import Java.io.File;
import Java.io.IOException;
import Java.io.PrintWriter;
import Java.util.Date;
import Java.util.jar.Attributes;
import Java.util.jar.JarFile;
import Java.util.jar.Manifest;

public class CreateMavenRepoApp {

    private static final String OCB_PLUGIN_FOLDER = "C://your_folder_with_jars";

    public static void main(String[] args) throws IOException {

    File directory = new File();
    //get all the files from a directory
    PrintWriter writer = new PrintWriter("update_repo_maven.bat", "UTF-8");
    writer.println("rem "+ new Date());  
    File[] fList = directory.listFiles();
    for (File file : fList){
        if (file.isFile()){               
        String absolutePath = file.getAbsolutePath() ;
        Manifest  m = new JarFile(absolutePath).getManifest();
        Attributes attributes = m.getMainAttributes();
        String symbolicName = attributes.getValue("Bundle-SymbolicName");

        if(symbolicName!=null &&symbolicName.contains("com.yourCompany.yourProject")) {
            String[] parts =symbolicName.split("\\.");
            String artifactId = parts[parts.length-1];
            String groupId = symbolicName.substring(0,symbolicName.length()-artifactId.length()-1);
            String version = attributes.getValue("Bundle-Version");
            String mavenLine= "call mvn org.Apache.maven.plugins:maven-install-plugin:2.5.1:install-file -Dfile="+ absolutePath+" -DgroupId="+ groupId+" -DartifactId="+ artifactId+" -Dversion="+ version+" -Dpackaging=jar ";
            writer.println(mavenLine);          
        }

        }
    }
    writer.close();
    }

}

Après avoir exécuté ce principal à partir de n’importe quel IDE, exécutez le fichier update_repo_maven.bat.

2
Luis Muzikant

Notez qu’il n’est PAS nécessairement une bonne idée d’utiliser un dépôt local. Si ce projet est partagé avec d'autres personnes, tout le monde aura des problèmes et des questions s'il ne fonctionne pas et le fichier jar ne sera pas disponible, même dans votre système de contrôle de source!

Bien que le référentiel partagé soit la meilleure solution, si vous ne pouvez pas le faire pour une raison quelconque, alors l’intégration du fichier jar est préférable à un référentiel local. Le contenu des référentiels uniquement locaux peut causer de nombreux problèmes, en particulier dans le temps.

1
Frank

Sur votre référentiel local, vous pouvez installer votre jar en lançant les commandes

 mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

Suivez cet utile lien pour faire la même chose sur le site Web de mkyoung. Vous pouvez également vérifier guide maven pour la même chose

1
bpjoshi

Pour une raison quelconque, dans l'application Web à laquelle je confie la maintenance, ni la solution d'Alireza Fattahi ni la solution de JJ Roman ne fonctionnait pas correctement. Dans les deux cas, la compilation se passe bien (elle voit la jarre), mais l'emballage n'intègre pas la jarre dans la guerre.

La seule façon dont j'ai réussi à le faire fonctionner était de placer le pot sur /src/main/webapp/WEB-INF/lib/ et de le combiner ensuite avec la solution de Fattahis ou de Roman.

1
Haroldo_OK

Je pense qu'une meilleure solution à ce problème est d'utiliser maven-install-plugin pour installer automatiquement les fichiers au moment de l'installation. C'est comme ça que je l'ai mis en place pour mon projet.

Tout d’abord, ajoutez le chemin d’accès (où vous stockez les fichiers .jars locaux) en tant que propriété.

<properties>
    <local.sdk>/path/to/jar</local.sdk>
</properties>

Ensuite, sous plugins ajoutez un plugin pour installer les fichiers jar lors de la compilation.

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.5.2</version>
    <executions>
        <execution>
            <id>1</id>
            <phase>initialize</phase>
            <goals>
                <goal>install-file</goal>
            </goals>
            <configuration>
                <groupId>com.local.jar</groupId> 
                <artifactId>appengine-api</artifactId>
                <version>1.0</version>
                <packaging>jar</packaging>
                <file>${local.sdk}/lib/impl/appengine-api.jar</file>
            </configuration>
        </execution>
        <execution>
            <id>appengine-api-stubs</id>
            <phase>initialize</phase>
            <goals>
                <goal>install-file</goal>
            </goals>
            <configuration>
                <groupId>com.local.jar</groupId>
                <artifactId>appengine-api-stubs</artifactId>
                <version>1.0</version>
                <packaging>jar</packaging>
                <file>${local.sdk}/lib/impl/appengine-api-stubs.jar</file>
            </configuration>
        </execution>
    </executions>
</plugin>

Enfin, dans les dépendances, vous pouvez ajouter les pots

<dependency>
    <groupId>com.local.jar</groupId>
    <artifactId>appengine-api</artifactId>
    <version>1.0</version>
</dependency>

<dependency>
    <groupId>com.local.jar</groupId>
    <artifactId>appengine-api-stubs</artifactId>
    <version>1.0</version>
    <scope>test</scope>
</dependency>

En configurant votre projet de cette manière, le projet continuera à se générer même lorsque vous le dirigerez sur un autre ordinateur (étant donné qu'il contient tous les fichiers jar dans le chemin spécifié par la propriété local.sdk).

Pour groupId, utilisez un nom unique pour vous assurer qu'il n'y a pas de conflit.

Maintenant, lorsque vous mvn install ou mvn test, les fichiers JAR locaux seront automatiquement ajoutés.

1
Sudara

Pour installer un fichier tiers, appelez la commande comme ci-dessous

mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path

Dans Apache Maven 3.5.4, je devais ajouter une double citation. Sans double citation, ça n'a pas marché pour moi.

exemple: mvn install: fichier-installation "-Dfile = emplacement dans le fichier jar" "-DgroupId = id du groupe" "-DartifactId = id de l'artefact" "-Dversion = version" "-Dpackaging = type de paquet"

0
Kavindu Gayan
  1. mVN installer

Vous pouvez écrire du code ci-dessous en ligne de commande ou, si vous utilisez Eclipse intégré, cliquez avec le bouton droit de la souris sur projet -> Exécuter en tant que -> exécuter les configurations ... -> dans le panneau de gauche, cliquez avec le bouton droit de la souris sur Maven Build -> nouvelle configuration -> écrire le code dans le répertoire de base et objectifs: $ {project_loc: NameOfYourProject} -> Run

mvn install:install-file
   -Dfile=<path-to-file>
   -DgroupId=<group-id>
   -DartifactId=<artifact-id>
   -Dversion=<version>
   -Dpackaging=<packaging>
   -DgeneratePom=true

où chacun se réfère à:

<chemin d'accès au fichier>: le chemin d'accès au fichier à charger, par exemple -> c:\kaptcha-2.3.jar

<group-id>: le groupe dans lequel le fichier doit être enregistré, par exemple -> com.google.code

<artefact-id>: nom de l'artefact pour le fichier, par exemple -> kaptcha

<version>: la version du fichier, par exemple -> 2.3

<packaging>: le packaging du fichier par exemple -> pot

2.Une fois installé, il suffit de déclarer jar dans pom.xml.

 <dependency>
      <groupId>com.google.code</groupId>
      <artifactId>kaptcha</artifactId>
      <version>2.3</version>
 </dependency>
0
Mazen Embaby

CETTE REPONSE IS UNIQUEMENT POUR LES UTILISATEURS Eclipse:

Si vous utilisez Eclipse, placez le fichier jar dans lib /, cliquez avec le bouton droit sur le nom du fichier, puis cliquez sur "Ajouter au chemin de construction". Eclipse va créer une "bibliothèque référencée" et placer le pot pour vous

Cela a résolu l'importation du pot tout de suite dans le programme pour moi

0
Anandkumar

J'ai eu la même erreur pour un ensemble de dépendances dans mon fichier pom.xml. Les versions des dépendances n'étaient pas spécifiées dans le fichier pom.xml et étaient mentionnées dans le référentiel parent. Pour une raison quelconque, les détails de la version ne se synchronisaient pas avec ce dépôt. Par conséquent, j’ai entré manuellement les versions à l’aide de la balise et cela a fonctionné comme un charme. Il a fallu un peu de temps pour rechercher les versions dans le parent et spécifier ici. Mais cela peut être fait uniquement pour les bocaux qui montrent l'erreur d'artefact et cela fonctionne. J'espère que ça aide quelqu'un.

0
Ranjan Rozario