Comment ajouter des fichiers jar locaux à un projet Maven?
27 réponses
installez le bocal dans votre dépôt 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 se réfère à:
< chemin-vers-fichier >: le chemin vers le fichier à charger.e.g -> c:\kaptcha-2.3.jar
< group-id >: le groupe dans lequel le fichier doit être enregistré sous E. g - > com.Google.code
< artifact-id >: le nom d'artefact pour le fichier E. g - > kaptcha
< version >: la version du fichier E. g - > 2,3
< emballage >: l'emballage du fichier, p.ex. - > jar
vous pouvez ajouter des dépendances locales directement (comme mentionné dans projet build maven avec les bibliothèques de propriété inclus ) 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>
tout d'abord je voudrais donner crédit à cette réponse à l'utilisateur anonyme de stackoverflow - je suis presque sûr que j'ai déjà vu une réponse similaire ici - mais maintenant je ne peux pas la trouver.
la meilleure option pour avoir des fichiers jar locaux comme dépendance est de créer un dépôt maven local. Un tel repo n'est rien d'autre qu'une structure de répertoire avec des fichiers pom.
sur mon exemple:
J'ai le projet principal sur ${master_project}
emplacement et le sous-Projet1 est sur ${master_project}/${subproject1}
alors je crée le dépôt mvn dans:
${master_project}/local-maven-repo
Dans le pom de fichier dans subproject1 situé ${master_project}/${subproject1}/pom.xml
référentiel doit être spécifié qui permettrait de prendre le chemin du fichier comme un paramètre de l'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 dépôt. Cela rend votre dépôt pom indépendant. Par exemple, une fois que le pot désiré est disponible dans maven central vous avez juste besoin de le supprimer de votre local repo et il sera tiré à partir de défaut des pensions.
<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 dépôt local en utilisant le commutateur-DlocalRepositoryPath comme ici:
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
le fichier JAR de L'Onece est installé de sorte que mvn repo peut être engagé dans un dépôt de code et que l'ensemble de la configuration est indépendant du système. ( exemple de travail dans github )
je suis d'accord que le fait d'avoir des Pots commis à la source code repo n'est pas une bonne pratique, mais dans la vraie vie solution rapide et sale parfois est mieux que nexus repo complet pour accueillir un pot que vous ne pouvez pas publier.
créez un nouveau dossier, disons local-maven-repo
à la racine de votre projet Maven.
il suffit d'ajouter une déclaration locale à l'intérieur de 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 pot externe que vous voulez installer, allez à 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]
<dependency>
<groupId>group id name</groupId>
<artifactId>artifact name</artifactId>
<version>version number</version>
<scope>system</scope>
<systemPath>jar location</systemPath>
</dependency>
j'aimerais une telle solution - utiliser 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 effectuer mvn initialize
et jar sera installé dans Maven repo locale. Maintenant ce jar est disponible pendant 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 <dependency></dependency>
tag). Il est également possible de lier jar install non pas à initialize
étape, mais toute autre étape que vous aimez.
Oui , vous pouvez avoir mais ce n'est pas une bonne idée.
install Instead all these jars to maven reposs
Voir Aussi
une façon est de le télécharger dans votre propre gestionnaire de dépôt Maven (tel que Nexus). C'est une bonne pratique d'avoir son propre gestionnaire de dépôt de toute façon.
une autre façon agréable que j'ai vu récemment est d'inclure le Plugin Maven Install dans votre cycle de vie de construction: vous déclarez dans le POM pour installer les fichiers dans le dépôt local. C'est un petit mais petit plafond et pas de marche manuelle.
http://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html
ajoutez votre propre pot 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
puis l'ajouter au POM comme ceci:
bien sûr, vous pouvez ajouter des pots à ce dossier. Mais peut-être que ce n'est pas ce que vous voulez atteindre...
si vous avez besoin de ces pots pour la compilation, cochez cette question connexe: puis-je ajouter des pots à maven 2 build classpath sans les installer?
aussi, avant que quelqu'un le suggère, ne pas utiliser la portée du système.
ligne de commande:
mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code
-DartifactId=kaptcha -Dversion={version} -Dpackaging=jar
un autre cas intéressant est quand vous voulez avoir dans votre projet des jarres privées maven. Vous pouvez vouloir garder les capacités de Maven pour résoudre les dépendances transitives. La solution est assez simple.
- créer un dossier libs dans votre projet
-
Ajouter les lignes suivantes dans votre pom.fichier 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>
-
ouvrir le .m2 / dépôt dossier et copier la structure du répertoire du projet que vous souhaitez importer dans le dossier libs .
E. G. supposons que vous voulez importer la dépendance
<dependency>
<groupId>com.mycompany.myproject</groupId>
<artifactId>myproject</artifactId>
<version>1.2.3</version>
</dependency>
continue .m2 / dépôt et vous verrez le dossier suivant
com/my company/myproject / 1.2.3
Copy tout dans votre dossier libs (encore une fois, y compris les dossiers sous ).m2 / dépôt ) et vous êtes fait.
la manière vraiment rapide et sale est de pointer vers 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 sera en direct sur votre machine (évidemment), pour le partage habituellement, il est logique d'utiliser un bon m2 d'archives (nexus/artifactory) ou si vous n'avez pas ou ne voulez pas installer un local maven structurés et configurer un "référentiel" dans votre pom: local:
<repositories>
<repository>
<id>my-local-repo</id>
<url>file://C:/DEV//mymvnrepo</url>
</repository>
</repositories>
distance:
<repositories>
<repository>
<id>my-remote-repo</id>
<url>http://192.168.0.1/whatever/mavenserver/youwant/repo</url>
</repository>
</repositories>
regardez aussi...
<scope>compile</scope>
Les Dépendances Maven . C'est la valeur par défaut, mais j'ai trouvé que dans certains cas, définir explicitement que scope permet aussi de trouver des bibliothèques locales dans le dépôt local.
je veux partager un code où vous pouvez télécharger un dossier plein de bocaux. C'est utile quand un fournisseur n'a pas de dépôt public et que vous avez besoin d'ajouter beaucoup de bibliothèques manuellement. J'ai décidé d'en construire un .bat au lieu d'appeler directement à maven parce qu'il pourrait être hors des erreurs de mémoire. Il a été préparé pour un environnement windows mais est facile à adapter à linux OS:
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 lancé cette main à partir de n'importe quel IDE, lancez la commande update_repo_maven.chauve.
c'est une syntaxe courte pour les nouvelles versions:
mvn install:install-file -Dfile=<path-to-file>
il fonctionne lorsque le pot a été construit par Apache Maven - le cas le plus commun. Puis il va contenir 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
notez que ce n'est pas nécessairement une bonne idée d'utiliser un repo local. Si ce projet est partagé avec d'autres, alors tout le monde aura des problèmes et des questions quand il ne fonctionne pas, et le bocal ne sera pas disponible même dans votre système de contrôle source!
bien que le repo partagé soit la meilleure réponse, si vous ne pouvez pas le faire pour une raison quelconque, alors l'intégration du bocal est mieux qu'un repo local. Le contenu des pensions locales seulement peut causer beaucoup de problèmes, surtout au fil du temps.
sur votre dépôt local vous pouvez installer votre jar en émettant les commandes
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
suivez ce lien pour faire la même chose depuis le site de mkyoung. Vous pouvez également vérifier Maven guide pour le même
pour une raison quelconque, dans l'application web que je donne la maintenance, ni solution D'Alireza Fattahi ni solution de JJ Roman a fonctionné correctement. Dans les deux cas, la compilation se passe bien (il voit le pot), mais l'emballage ne parvient pas à inclure le pot dans la guerre.
la seule façon dont j'ai réussi à la faire fonctionner était en mettant le bocal sur /src/main/webapp/WEB-INF/lib/
et puis en le combinant avec soit Fattahis ou Roman solution.
CETTE RÉPONSE EST SEULEMENT POUR LES UTILISATEURS D'ECLIPSE:
si vous utilisez Eclipse, placez le bocal dans lib/, faites un clic droit sur le nom du bocal et cliquez sur"Ajouter pour construire le chemin". Eclipse va créer une "bibliothèque référencée" et placer le bocal pour vous
il a résolu l'importation du pot tout de suite dans le programme pour moi
pour installer un jar tiers, veuillez appeler la commande comme ci-dessous
mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path
j'ai eu la même erreur pour un ensemble de dépendances dans mon pompon.il s'avère que les versions des dépendances n'étaient pas spécifiées dans le pom.xml et a été mentionné dans le référentiel parent. Pour une raison quelconque, les détails de la version n'étaient pas synchronisés avec ce rapport. C'est pourquoi j'ai entré manuellement les versions en utilisant la balise et ça a fonctionné comme un charme. Un peu de temps nécessaire pour rechercher les versions dans le parent et spécifier ici. Mais cela peut être fait juste pour les pots qui sont montrant l'artifactid erreur et il fonctionne. Espérons que cela aide quelqu'un.
je pense qu'une meilleure solution pour ce problème est d'utiliser maven-install-plugin pour installer automatiquement les fichiers au moment de l'installation. C'est la façon dont je l'ai installé pour mon projet.
d'abord, ajoutez le chemin (où vous stockez le local .pots) en tant que propriété.
<properties>
<local.sdk>/path/to/jar</local.sdk>
</properties>
puis, sous plugins
ajouter un plugin pour installer les bocaux 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 peut 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 mettant en place votre projet comme ceci, le projet va continuer à construire même si vous le prenez à un autre ordinateur (étant donné qu'il a tous les fichiers jar dans le chemin spécifié par la propriété local.sdk
).
Pour groupId
utiliser un nom unique juste pour s'assurer qu'il n'y a pas de conflits.
maintenant quand vous mvn install
ou mvn test
les pots locaux seront ajoutés automatiquement.
- mvn install
vous pouvez écrire le code ci-dessous en ligne de commande ou si vous utilisez eclipse builtin maven clic droit sur project - > Run As - > run configurations... - >dans le panneau de gauche, faites un clic droit sur Maven Build - > nouvelle configuration - > écrivez le code dans Goals & in base directory: $ {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-vers-fichier >: le chemin vers le fichier à charger.e.g -> c:\kaptcha-2.3.jar
< group-id >: le groupe dans lequel le fichier doit être enregistré sous E. g - > com.Google.code
< artifact-id >: le nom d'artefact pour le fichier E. g - > kaptcha
< version>: la version du fichier E. g - > 2.3
< emballage >: l'emballage du fichier e.g. - > jar
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>
Apache Maven 3.5.4, j'ai dû ajouter du double du devis. Sans guillemets, il n'a pas fonctionné pour moi.
exemple: mvn install:install-fichier "-Dfile=emplacement pour le fichier jar" "-DgroupId=id de groupe" "-DartifactId=artefact" id "-Dversion=" version "-Dpackaging=type de package"
j'ai eu le même problème avec ojdbc6. J'ai vu ce lien mais il ne marche pas. La commande était correcte mais j'avais besoin d'un paramètre de plus,
C'est le lien: http://roufid.com/3-ways-to-add-local-jar-to-maven-project /
Voici l'exemple:
install:install-file -Dfile=C:\driversDB\ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpackaging=jar