How to add local jar files to a Maven project?
如何将本地JAR文件(还不是Maven存储库的一部分)直接添加到项目的库源中?
您可以直接添加本地依赖项(如build maven项目中所述,包含属性库),如下所示:
1 2 3 4 5 6 7 | <dependency> <groupId>com.sample</groupId> sample</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/yourJar.jar</systemPath> </dependency> |
更新
在新版本中,此功能被标记为已弃用,但仍在工作,尚未删除(您只会在maven启动期间在日志中看到警告)。Maven Group就这个https://issues.apache.org/jira/browse/mng-6523提出了一个问题(您可以参与并描述为什么这个功能在某些情况下有用)。我希望这个功能仍然存在!
如果你问我,只要这个特性没有被删除,我就用它来依赖我的项目中一个不适合存储库的淘气jar文件。如果删除了这个功能,那么,这里有很多好的答案,我可以稍后选择!
将jar安装到本地maven存储库中,如下所示:
1 2 3 4 5 6 7 | mvn install:install-file \ -Dfile=<path-to-file> \ -DgroupId=<group-id> \ -DartifactId= \ -Dversion=<version> \ -Dpackaging=<packaging> \ -DgeneratePom=true |
其中每一个都指:
参考文献
- Maven常见问题解答:我有一个jar,我想放在本地存储库中。我怎样才能把它复制进去?
- maven安装插件用法:
install:install-file 目标
首先,我想把这个答案归功于一个匿名堆栈溢出用户——我很肯定我以前在这里看到过类似的答案——但现在我找不到了。
将本地JAR文件作为依赖项的最佳选择是创建本地Maven存储库。这样的存储库只不过是一个包含pom文件的适当目录结构。
以我为例:我有一个关于
然后我在以下位置创建了一个Maven存储库:
在位于
1 2 3 4 5 6 | <repositories> <repository> <id>local-maven-repo</id> <url>file:///${project.parent.basedir}/local-maven-repo</url> </repository> </repositories> |
可以为任何其他存储库指定依赖项。这使您的POM存储库独立。例如,一旦Maven Central中提供了所需的JAR,您只需从本地回购中删除它,它就会从默认回购中提取出来。
1 2 3 4 5 | <dependency> <groupId>org.apache.felix</groupId> org.apache.felix.servicebinder</artifactId> <version>0.9.0-SNAPSHOT</version> </dependency> |
最后但不是最不重要的事情是使用-dlocalrepositorypath开关将JAR文件添加到本地存储库,如下所示:
1 2 3 4 5 | 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 |
一旦安装了JAR文件,您的maven repo就可以提交到代码存储库,并且整个设置是独立于系统的。(Github中的工作示例)。
我同意让jar致力于源代码回购并不是一个好的实践,但在现实生活中,快速而肮脏的解决方案有时比全面的nexus回购更好,它可以承载一个jar,而您不能发布它。
在Maven项目的根目录下创建一个新的文件夹,比如
只需在您的
1 2 3 4 5 6 | <repositories> <repository> <id>local-maven-repo</id> <url>file:///${project.basedir}/local-maven-repo</url> </repository> </repositories> |
然后,对于要安装的每个外部JAR,转到项目的根目录并执行:
1 | mvn deploy:deploy-file -DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] -Durl=file:./local-maven-repo/ -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile=[FILE_PATH] |
1 2 3 4 5 6 7 | <dependency> <groupId>group id name</groupId> artifact name</artifactId> <version>version number</version> <scope>system</scope> <systemPath>jar location</systemPath> </dependency> |
我想要这样的解决方案-在POM文件中使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <plugin> <groupId>org.apache.maven.plugins</groupId> 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> artefact-id</artifactId> <version>x.y.z</version> <packaging>jar</packaging> </configuration> </execution> </executions> </plugin> |
在这种情况下,您可以执行
是的,你可以,但这不是个好主意。
相反,把所有这些罐子安装到maven repos
也看到
- 如何建立包含专有图书馆的Maven项目
在pom文件中添加您自己的本地jar,并在maven build中使用它。
1 | mvn install:install-file -Dfile=path-to-jar -DgroupId=owngroupid -DartifactId=ownartifactid -Dversion=ownversion -Dpackaging=jar |
例如:
1 | mvn install:install-file -Dfile=path-to-jar -DgroupId=com.decompiler -DartifactId=jd-core-java -Dversion=1.2 -Dpackaging=jar |
然后将其添加到POM中,如下所示:
一种方法是将其上载到您自己的Maven存储库管理器(如Nexus)。无论如何,拥有自己的存储库管理器是一个好的实践。
我最近看到的另一个好方法是在构建生命周期中包含maven安装插件:在pom中声明以将文件安装到本地存储库。这是一个有点,但很小的开销和没有涉及到手动步骤。
http://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html
真正快速而肮脏的方法是指向本地文件:
1 2 3 4 5 6 7 | <dependency> <groupId>sample</groupId> com.sample</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>C:\DEV\myfunnylib\yourJar.jar</systemPath> </dependency> |
但是,这只会存在于您的机器上(很明显),因为共享它通常是有意义的,使用适当的M2存档(nexus/artifactory),或者如果您没有这些文件或不想设置一个本地Maven结构化存档并在POM中配置一个"存储库":当地的:
1 2 3 4 5 6 | <repositories> <repository> <id>my-local-repo</id> <url>file://C:/DEV//mymvnrepo</url> </repository> </repositories> |
远程:
1 2 3 4 5 6 | <repositories> <repository> <id>my-remote-repo</id> <url>http://192.168.0.1/whatever/mavenserver/youwant/repo</url> </repository> </repositories> |
为此,也可以使用basedir变量来创建相对路径:
10当然,您可以将jar添加到该文件夹中。但也许这不是你想要实现的…
如果需要这些jar进行编译,请检查相关问题:我可以不安装jar就将它们添加到maven 2 build类路径吗?
另外,在任何人提出建议之前,不要使用系统范围。
命令行:
1 2 | mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code -DartifactId=kaptcha -Dversion={version} -Dpackaging=jar |
另一个有趣的例子是当你想在你的项目中有私人MavenJars。您可能希望保留Maven解决可传递依赖项的功能。解决方案相当简单。
在pom.xml文件中添加以下行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <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文件夹中。
例如,假设您要导入依赖项
10只需继续.m2/存储库,您将看到以下文件夹
com/mycompany/myproject/1.2.3公司
复制libs文件夹中的所有内容(同样,包括.m2/repository下的文件夹),就完成了。
首选的方法是创建自己的远程存储库。
有关如何操作的详细信息,请参阅此处。查看"上载到远程存储库"部分。
还可以看看……
1 | <scope>compile</scope> |
Maven依赖项。这是默认值,但在某些情况下,我发现显式设置该范围也可以在本地存储库中找到本地库。
我想分享一个代码,你可以上传一个装满jar的文件夹。当提供者没有公共存储库,并且您需要手动添加大量库时,这非常有用。我决定构建一个.bat,而不是直接调用Maven,因为它可能是内存不足错误。它是为Windows环境准备的,但很容易适应Linux操作系统:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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运行完这个主文件之后,运行更新的repo maven.bat。
这是较新版本的简短语法:
1 | mvn install:install-file -Dfile=<path-to-file> |
当jar由ApacheMaven构建时,它就工作了——这是最常见的情况。然后它将在META-INF目录的子文件夹中包含pom.xml,默认情况下将读取该子文件夹。
来源:http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
请注意,使用本地回购并不一定是一个好主意。如果这个项目是与其他人共享的,那么当它不工作时,其他人都会有问题和疑问,即使在源代码控制系统中,JAR也不可用!
尽管共享回购是最好的答案,但是如果您出于某种原因不能这样做,那么嵌入JAR比本地回购更好。仅本地回购内容会导致许多问题,特别是随着时间的推移。
在本地存储库中,您可以通过发出命令来安装JAR。
1 2 | mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \ -DartifactId= -Dversion=<version> -Dpackaging=<packaging> |
在mkyoung的网站上,按照这个有用的链接做同样的事情。你也可以查看Maven指南
出于某种原因,在我要维护的Web应用程序中,alireza fattahi的解决方案和jj roman的解决方案都不能正常工作。在这两种情况下,编译都是正常的(它看到了JAR),但是包装在战争中没有包含JAR。
唯一能让它工作的方法是把罐子放在
我认为解决这个问题的更好的方法是使用maven安装插件在安装时自动安装文件。这就是我为我的项目设置的方法。
首先,添加路径(在其中存储local.jars)作为属性。
1 2 3 | <properties> <local.sdk>/path/to/jar</local.sdk> </properties> |
然后,在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <plugin> <groupId>org.apache.maven.plugins</groupId> 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> 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> 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> |
最后,在依赖项中,可以添加jar
1 2 3 4 5 6 7 8 9 10 11 12 | <dependency> <groupId>com.local.jar</groupId> appengine-api</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>com.local.jar</groupId> appengine-api-stubs</artifactId> <version>1.0</version> <scope>test</scope> </dependency> |
通过这样设置您的项目,即使您将它带到另一台计算机上(假定它具有属性
对于
现在,当您使用
在ApacheMaven 3.5.4中,我不得不添加双引号。如果没有双报价,我就没用。
例子:mvn install:install file"-dfile=location to the jar file""-dgroupid=group id""-dartifactid=artifact id""-dversion=version""-dpacking=package type"
要安装第三方JAR,请如下调用命令
1 | mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path |
我在pom.xml中的一组依赖项也有同样的错误,结果发现这些依赖项的版本没有在pom.xml中指定,并且在父存储库中提到。出于某种原因,版本详细信息没有与此回购同步。因此,我使用标签手动输入了版本,它工作得很有魅力。在父级中查找版本并在此处指定需要一点时间。但这可以只针对显示工件ID错误的JAR,并且它可以工作。希望这能帮助别人。
mvn install
您可以在命令行中编写下面的代码,或者如果您使用的是EclipseBuiltinMaven,右键单击project->run-as->run-configurations…->在左侧面板中,右键单击maven build->new configuration->write the code in goals&in base directory:$project loc:name of yourproject->run
1 2 3 4 5 6 7 | mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId= -Dversion=<version> -Dpackaging=<packaging> -DgeneratePom=true |
其中每一个都指:
2.After installed, just declares jar in pom.xml.
1 2 3 4 5 | <dependency> <groupId>com.google.code</groupId> kaptcha</artifactId> <version>2.3</version> </dependency> |
此答案仅适用于Eclipse用户:
如果您使用Eclipse,请将jar放在lib/中,右键单击jar名称,然后单击"添加到构建路径"。Eclipse将创建一个"引用库",并为您放置JAR。
它立刻为我解决了程序中jar的导入问题。
我对OJDC6也有同样的问题。我看到了这个链接,但没用。命令是正确的,但我还需要一个参数,
链接如下:http://roufid.com/3-ways-to-add-local-jar-to-maven-project/
示例如下:
1 | install:install-file -Dfile=C:\driversDB\ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpackaging=jar |