协慌网

登录 贡献 社区

我可以在不安装 jar 的情况下将 jar 添加到 maven 2 build classpath 吗?

在试验 / 快速而肮脏的开发阶段中,Maven2 使我发疯。

我有一个pom.xml文件,该文件定义了要使用的 Web 应用程序框架的依赖关系,并且可以从该文件快速生成启动程序项目。但是,有时我想链接到尚未pom.xml文件的第三方库,因此,不是pom.xml文件并进行安装,然后将依赖项添加到我的pom.xml ,我想告诉 Maven:“除了定义的依赖项之外,还包括/lib所有 jar。”

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

任何有关如何执行此操作的指针将不胜感激。简而言之,如果有一种简单的方法将 maven 指向/lib目录并轻松创建pom.xml并将所有封闭的 jar 映射到单个依赖项,然后我可以命名 / 安装并链接到一个依赖项中,也足够了。

答案

流行方法的问题

您将在 Internet 上找到的大多数答案都建议您将依赖项安装到本地存储库,或者在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>

对于每个组 ID 为xyz形式的工件,Maven 在搜索工件时将在项目目录中包含以下位置:

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 从lib文件夹安装到项目存储库,同时自动解析所有元数据(groupId,artifactId 等)。来自文件名。该脚本还打印出依赖项 xml,供您复制粘贴到pom

在目标包中包含依赖项

创建项目内存储库后,将解决分配项目依赖项及其源的问题,但是从那时起,项目的目标工件将依赖于未发布的 jar,因此在安装时它到一个存储库中,它将具有无法解决的依赖关系。

为了解决这个问题,我建议在您的目标软件包中包括这些依赖项。您可以使用Assembly 插件,也可以使用OneJar 插件更好地做到这一点。 OneJar 上的官方文档很容易掌握。

仅适用于丢弃代码

设置 scope == system 并仅组成一个 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 构建的战争中包括系统依赖项

您可以在项目上创建本地存储库

例如,如果项目结构中libs

  • libs文件夹中,您应该创建目录结构,例如: /groupId/artifactId/version/artifactId-version.jar

  • 在 pom.xml 中,您应该注册存储库

    <repository>
        <id>ProjectRepo</id>
        <name>ProjectRepo</name>
        <url>file://${project.basedir}/libs</url>
    </repository>
  • 并像往常一样添加依赖项

    <dependency>
        <groupId>groupId</groupId>
        <artifactId>artifactId</artifactId>
        <version>version</version>
    </dependency>

就这些。

有关详细信息:如何在 Maven 中添加外部库