我可以在不安装的情况下将 jar 添加到 Maven 2 构建类路径吗?流行方法的问题静态项目内存储库解决方案

2022-08-31 04:06:43

Maven 2在开发的实验/快速和肮脏的模型阶段让我发疯。

我有一个文件,它定义了要使用的Web应用程序框架的依赖项,我可以从该文件快速生成初学者项目。但是,有时我想链接到尚未定义文件的第三方库,因此与其手动为第三方库创建文件并安装它,然后将依赖项添加到我的,我只想告诉Maven:“除了我定义的依赖项之外,还包括任何jars。pom.xmlpom.xmlpom.xmlpom.xml/lib

看起来这应该很简单,但如果是这样,我就错过了一些东西。

任何关于如何做到这一点的指示都非常感谢。除此之外,如果有一种简单的方法可以将maven指向一个目录,并轻松地创建一个将所有封闭的jar映射到单个依赖项的jar,那么我可以一举命名/安装和链接到该数据库也足够了。/libpom.xml


答案 1

流行方法的问题

您在互联网上找到的大多数答案都建议您要么将依赖项安装到本地存储库中,要么在中指定“系统”范围,并将依赖项与项目源一起分发。但这两种解决方案实际上都是有缺陷的。pom

为什么不应应用“安装到本地存储库”方法

当您将依赖项安装到本地存储库时,它将保留在那里。只要您的分发工件有权访问此存储库,它就会运行良好。问题是,在大多数情况下,此存储库将驻留在本地计算机上,因此无法解决任何其他计算机上的此依赖关系。显然,让你的工件依赖于特定的机器并不是处理事情的一种方式。否则,这种依赖关系将不得不本地安装在使用该项目的每台计算机上,这并没有更好。

为什么不应应用“系统范围”方法

使用“系统范围”方法所依赖的 jar 既不会安装到任何存储库中,也不会附加到目标包中。这就是为什么您的分发程序包在使用时无法解析该依赖项的原因。我相信这就是系统范围的使用甚至被弃用的原因。无论如何,您不想依赖已弃用的功能。

静态项目内存储库解决方案

将此放入您的:pom

<repository>
    <id>repo</id>
    <releases>
        <enabled>true</enabled>
        <checksumPolicy>ignore</checksumPolicy>
    </releases>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <url>file://${project.basedir}/repo</url>
</repository>

对于每个具有表单 Maven 组 ID 的项目,在搜索项目时,将在项目目录中包含以下位置:x.y.z

repo/
| - x/
|   | - y/
|   |   | - z/
|   |   |   | - ${artifactId}/
|   |   |   |   | - ${version}/
|   |   |   |   |   | - ${artifactId}-${version}.jar

要对此进行更多阐述,您可以阅读此博客文章

使用 Maven 安装到项目存储库

我建议不要手动创建此结构,而是使用Maven插件将jar安装为工件。因此,要将工件安装到文件夹下的项目内存储库,请执行:repo

mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]

如果您选择此方法,您将能够将存储库声明简化为:pom

<repository>
    <id>repo</id>
    <url>file://${project.basedir}/repo</url>
</repository>

帮助程序脚本

由于为每个库执行安装命令有点烦人并且绝对容易出错,因此我创建了一个实用程序脚本,该脚本自动将所有jar从文件夹安装到项目存储库,同时自动解析文件名中的所有元数据(groupId,artifactId等)。该脚本还会打印出依赖项 xml,以便您复制粘贴到 .libpom

在目标包中包含依赖项

当您创建项目内存储库时,您将解决将项目的依赖项与其源一起分发的问题,但从那时起,项目的目标工件将依赖于未发布的jar,因此当您将其安装到存储库时,它将具有无法解析的依赖项。

为了解决这个问题,我建议将这些依赖项包含在目标包中。您可以使用汇编插件或更好的OneJar插件执行此操作。OneJar上的官方文件很容易掌握。


答案 2

仅用于丢弃代码

设置范围 == 系统,只需组成 groupId、artifactId 和版本

<dependency>
    <groupId>org.swinglabs</groupId>
    <artifactId>swingx</artifactId>
    <version>0.9.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/swingx-0.9.3.jar</systemPath>
</dependency>

注意:系统依赖项不会复制到生成的 jar/war
中(请参阅如何在使用 maven 构建的战争中包含系统依赖项)


推荐