如何将本地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相当简单。
- 在你的项目中创build一个文件夹库
-
在您的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>
-
打开.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结合使用。