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

zbsbpyhn  于 2021-07-15  发布在  Hadoop
关注(0)|答案(22)|浏览(585)

如何将本地jar文件(还不是maven存储库的一部分)直接添加到项目的库源中?

cidc1ykv

cidc1ykv16#

依赖关系中的重要部分是:${pom.basedir}(而不仅仅是${basedir})

<dependency>
    <groupId>org.example</groupId>
    <artifactId>example</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${pom.basedir}/src/lib/example.jar</systemPath>
</dependency>
ifmq2ha2

ifmq2ha217#

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

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

但是,这只会存在于您的计算机上(显然),对于共享,使用适当的m2存档(nexus/artifactory)通常是有意义的,或者如果您没有这些存档或不想设置本地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>
y4ekin9u

y4ekin9u18#

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

bttbmeg019#

我想要这样的解决方案-使用 maven-install-plugin 在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>

在这种情况下,您可以执行 mvn initialize jar将安装在本地maven repo中。现在,这个jar在这台机器上的任何maven步骤中都是可用的(不要忘记在pom中包含这个依赖项,就像其他maven依赖项一样) <dependency></dependency> 标签)。也可以将jar install绑定到not initialize 一步,但任何你喜欢的步骤。

vohkndzv

vohkndzv20#

比如说,创建一个新文件夹 local-maven-repo 在maven项目的基础上。
只需在您的账户中添加本地回购即可 <project> 你的 pom.xml :

<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]
c2e8gylq

c2e8gylq21#

首先,我想把这个答案归功于一个匿名堆栈溢出用户——我很肯定我以前在这里看到过类似的答案——但现在我找不到了。
将本地jar文件作为依赖项的最佳选择是创建本地maven存储库。这样的存储库只不过是一个包含pom文件的适当目录结构。
举个例子:我的主项目 ${master_project} 位置和子项目1已打开 ${master_project}/${subproject1} .
然后在以下位置创建maven存储库: ${master_project}/local-maven-repo .
在子项目1的pom文件中,位于 ${master_project}/${subproject1}/pom.xml ,需要指定将文件路径作为url参数的存储库:

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

可以将依赖项指定为任何其他存储库的依赖项。这使得pom存储库独立。例如,一旦所需的jar在maven central中可用,您只需从本地repo中删除它,它就会从默认repo中提取出来。

<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 repo就可以提交到一个代码存储库,整个设置是独立于系统的(github中的工作示例)。
我同意让jar致力于源代码repo并不是一个好的实践,但在现实生活中,快速而肮脏的解决方案有时比一个完整的nexus repo更好,因为它承载了一个您无法发布的jar。

t98cgbkg

t98cgbkg22#

您可以直接添加本地依赖项(如build maven project中所述,包括适当的库),如下所示:

<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 group对此提出了一个问题https://issues.apache.org/jira/browse/mng-6523 (您可以参与并描述为什么此功能在某些情况下有用)。我希望这个功能仍然存在!
如果你问我,只要这个特性没有被删除,我就用它来依赖我的项目中一个不适合存储库的调皮jar文件。如果这个功能被删除,那么,这里有很多好的答案,我可以选择从稍后!

相关问题