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

如何在项目的库源代码中直接添加本地 jar 文件(尚未成为 Maven 存储库的一部分)?

答案

您可以像这样直接添加本地依赖项(如在包含专有库的 build maven 项目中提到的那样):

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

更新资料

在新版本中,此功能被标记为已弃用,但仍在工作并且尚未删除(您仅在 maven 启动期间在日志中看到警告)。在 Maven 小组中,有关此https://issues.apache.org/jira/browse/MNG-6523 的问题 (您可以参与并描述此功能在某些情况下有帮助的原因)。我希望此功能仍然存在!

如果您要的是我,只要不删除该功能,就可以使用它来仅依赖项目中一个调皮的 jar 文件 ,该文件不适合存储库。如果此功能被删除,那么,这里有很多好的答案,我以后可以选择!

如下所示将 JAR 安装到本地 Maven 存储库中:

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

其中每个都指:

<path-to-file> :要加载的文件的路径,例如→ c:\kaptcha-2.3.jar

<group-id> :文件应注册的组,例如→ com.google.code

<artifact-id> :文件的工件名称,例如→ kaptcha

<version> :文件的版本,例如→ 2.3

<packaging> :文件的包装,例如→ jar

参考

首先,我想把这个答案归功于一个匿名的 Stack Overflow 用户 - 我很确定我以前在这里看到过类似的答案 - 但现在找不到了。

将本地 JAR 文件作为依赖项的最佳选择是创建本地 Maven 存储库。这样的存储库只不过是带有 pom 文件的适当目录结构。

例如,我的主项目位于${master_project}位置,subproject1 位于${master_project}/${subproject1}

然后,我在${master_project}/local-maven-repo创建一个 Maven 存储库。

在位于${master_project}/${subproject1}/pom.xml subproject1 中的 pom 文件中,需要指定存储库,该存储库将文件路径作为 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

安装 JAR 文件后,即可将您的 Maven 存储库提交到代码存储库,并且整个设置与系统无关。 ( GitHub 中的工作示例 )。

我同意让 JAR 致力于源代码仓库不是一个好习惯,但是在现实生活中,快速而又肮脏的解决方案有时比功能强大的 Nexus Repo 托管一个无法发布的 JAR 更好。

在您的 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]

我想要这样的解决方案 - 在 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>x.y.z</version>
                <packaging>jar</packaging>
            </configuration>
        </execution>
    </executions>
</plugin>

在这种情况下,您可以执行mvn initialize并且 jar 将安装在本地 maven 存储库中。现在,此 jar 在该计算机上的任何 Maven 步骤中都可用(不要忘记将此依赖项与其他任何 Maven 依赖项一起包含在带有<dependency></dependency>标记的 pom 中)。也可以绑定 jar install 而不是initialize步骤,而是绑定您喜欢的任何其他步骤。

<dependency>
    <groupId>group id name</groupId>
    <artifactId>artifact name</artifactId>
    <version>version number</version>
    <scope>system</scope>
    <systemPath>jar location</systemPath>
</dependency>

是的,您可以拥有,但不是个好主意。

而是将所有这些 jar 安装到 Maven 仓库中

另请参阅

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

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:

在此处输入图片说明

真正快捷而肮脏的方法是指向本地文件:

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

但是,这只能在您的机器上运行(很明显),因为共享它通常是有意义的,可以使用适当的 m2 存档(关系 / 人工工厂),或者如果您没有这些文件或者不想在本地建立 Maven 结构化归档文件,并在 pom 中配置 “存储库”:本地:

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

远程:

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

为此,使用 basedir 变量也可以使用相对路径:

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

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

我最近看到的另一种不错的方法是在构建生命周期中包括 Maven 安装插件:您在 POM 中声明将文件安装到本地存储库。这只是一点点但很小的开销,并且不需要手动步骤。

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