如何将本地jar文件添加到Maven项目?

如何直接在我的项目的库源代码中添加本地jar文件(还不是Maven仓库的一部分)?

将JAR安装到您的本地Maven仓库中,如下所示:

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging> -DgeneratePom=true Where: <path-to-file> the path to the file to load <group-id> the group that the file should be registered under <artifact-id> the artifact name for the file <version> the version of the file <packaging> the packaging of the file eg jar 

参考

您可以直接添加本地依赖项(正如在包含propriatery库的build maven项目中所提到的),如下所示:

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

首先,我想把这个答案的功劳归功于匿名的stackoverflow用户 – 我很确定我以前见过类似的答案 – 但是现在我找不到它了。

将本地jar文件作为依赖项的最佳select是创build本地maven存储库。 这样的回购没有什么别的正确的目录结构与POM文件。

在我的例子中:我有${master_project}位置的主项目, ${master_project}/${subproject1}位于${master_project}/${subproject1}

那么我正在创buildmvn仓库: ${master_project}/local-maven-repo

在subproject1中的pom文件中需要指定${master_project}/${subproject1}/pom.xml库,它将文件path作为url参数:

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

依赖可以被指定为任何其他仓库。 这使得你的pom仓库是独立的。 例如一旦所需的jar在maven central中可用,你只需要从你的本地仓库中删除它,它将被从默认仓库中取出。

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

最后但并非最不重要的事情是使用-DlocalRepositoryPath开关将jar文件添加到本地存储库,如下所示:

 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 

Onece jar文件被安装,这样mvn repo可以被提交到代码库,整个设置是独立于系统的。 ( 在github中的工作示例 )

我同意让JAR承诺源代码回购并不是一个好的做法,但在现实生活中,快速和肮脏的解决scheme有时比完全吹嘘nexus回购托pipe一个你不能发布的jar。

创build一个新文件夹,让我们说你的Maven项目的根目录下的local-maven-repo

只需在您的pom.xml <project>中添加一个本地回购:

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

然后,对于要安装的每个外部jar,请在项目的根目录下执行:

 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> 

我想要这样的解决scheme – 在pom文件中使用maven-install-plugin

  <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>xyz</version> <packaging>jar</packaging> </configuration> </execution> </executions> </plugin> 

在这种情况下,您可以执行mvn initialize并将jar安装在本地maven仓库中。 现在这个jar在这个机器上的任何maven步骤中都可用(不要忘记把这个依赖关系包含在pom中的任何其他maven依赖项中, <dependency></dependency>标签)。 也可以绑定jar安装而不是initialize步骤,但是你喜欢的任何其他步骤。

是的,你可以有但不是好主意。

相反,安装所有这些jar子maven回购

另见

  • 包括propriatery图书馆如何build立maven项目

一种方法是将其上传到您自己的Maven仓库pipe理器(如Nexus)。 无论如何,拥有一个自己的仓库pipe理员是一个好习惯。

我最近看到的另一个好方法是在构build生命周期中包含Maven Install Plugin:在POM中声明将文件安装到本地存储库。 这是一个小的开销,不涉及手动步骤。

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

当然,您可以将jar添加到该文件夹​​。 但也许它不是你想要实现的…

如果你需要这些jar子进行编译,请检查这个相关的问题: 我可以将jar添加到maven 2生成classpath而不安装它们?

而且,在任何人build议之前,不要使用系统范围。

在POM文件中添加你自己的本地JAR,并在Maven构build中使用它。

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

例如:

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

然后像下面这样将它添加到POM中:

在这里输入图像描述

首选的方法是创build自己的远程存储库。

有关如何执行此操作的详情,请参阅此处 。 查看“ 上传到远程存储库 ”部分。

另外看看…

 <scope>compile</scope> 

Maven的依赖 。 这是默认的,但我发现在某些情况下明确设置该范围也Mavenfind本地库中的本地库。

我想分享一个代码,你可以上传一个文件夹装满了jar子。 如果提供者没有公共存储库,并且需要手动添加大量的库,那么这很有用。 我决定build立一个.bat而不是直接调用maven,因为它可能是内存不足的错误。 它是为Windows环境准备的,但很容易适应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(); } } 

从任何IDE运行这个main之后,运行update_repo_maven.bat。

另一个有趣的例子是当你想在你的项目私人mavenjar子里。 您可能想要保持Maven的function来解决传递依赖性。 解决scheme相当简单。

  1. 在你的项目中创build一个文件夹
  2. 在您的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. 打开.m2 / repository文件夹并将要导入的项目的目录结构复制到libs文件夹中。

例如,假设你想要导入依赖项

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

只要继续.m2 / repository ,你会看到下面的文件夹

COM / myCompany的/ myproject的/ 1.2.3

将所有内容复制到libs文件夹(再次包括.m2 / repository下的文件夹),然后完成。

请注意,使用本地回购并不是一个好主意。 如果这个项目是与其他人分享的,那么其他人都会遇到问题和问题,甚至在你的源代码pipe理系统中也不可用。

虽然共享回购是最好的答案,但如果因为某些原因无法这样做,那么embeddedjar比本地回购更好。 只有本地的回购内容会导致很多问题,特别是随着时间的推移。

这个答案只适用于ECLIPSE用户:

如果您使用的是Eclipse,请将jar放入lib /中,右键单击jar名称,然后单击“添加到构buildpath”。 Eclipse将创build一个“引用库”,并为您放置该jar

它解决了在我的程序立即import的jar子

这是较新版本的简短语法:

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

当JAR由Apache Maven构build时,这是最常见的情况。 然后它将在META-INF目录的子文件夹中包含一个pom.xml,默认情况下它将被读取。

资料来源: http : //maven.apache.org/guides/mini/guide-3rd-party-jars-local.html

在本地存储库上,您可以通过发出命令来安装您的jar

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

按照这个有用的链接从mkyoung的网站做同样的事情。 你也可以检查相同的Maven指南

要安装第三方jar,请调用下面的命令

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

在父pom或合成父pom中使用maven-install-plugin为我工作。 假设我们把jar文件放在父模块的lib目录下,我们只需要创build一个属性为lib-path:

  • lib-path:$ {project-basedir} / lib父pom
  • lib-path:{project.parent.basedir} / lib从任何子模块

接下来就是@sphinks使用maven-install-plugin来描述它。 将不会有手动步骤,并且可以将该工件添加为子模块的任何其他依赖项。

NB。 你也可以使用一些插件来修复lib文件夹。 一些build议使用Maven目录插件

出于某种原因,在我正在进行维护的Web应用程序中, Alireza Fattahi的解决scheme和JJ Roman的解决scheme都无法正常工作。 在这两种情况下,编译都没问题(它看到的是jar),但是包装没有将jar包含在战争中。

我设法使其工作的唯一方法是将jar放在/src/main/webapp/WEB-INF/lib/ ,然后将它与Fattahis或Roman的解决scheme结合使用。