使用Maven安装本地Jar包
1. 问题与选择
Maven 是一个非常通用的工具,其可用的公共存储库是首屈一指的。然而,总会有一个工件没有托管在任何地方,或者依赖托管它的存储库存在风险,因为它可能不会在您需要时启动。
当发生这种情况时,有几个选择:
- 硬着头皮安装一个成熟的存储库管理解决方案,例如 Nexus
- 尝试将工件上传到更有信誉的公共存储库之一
- 使用 Maven 插件在本地安装工件
Nexus当然是更成熟的解决方案,但它也更复杂。提供一个实例来运行 Nexus,设置 Nexus 本身,配置和维护它对于像使用单个 jar 这样简单的问题来说可能是多余的。如果这种情况——托管自定义工件——很常见,那么存储库管理器就很有意义。
将工件直接上传到公共存储库或 Maven 中心也是一个很好的解决方案,但通常很冗长 。此外,该库可能根本没有启用 Maven,这使得该过程变得更加困难,因此这不是现在能够使用该工件的现实解决方案。
剩下第三个选项——在源代码控制中添加工件并使用 maven 插件——在这种情况下,maven-install-plugin 在构建过程需要它之前在本地安装它。这是迄今为止最简单和最可靠的选择。
2. 使用 maven-install-plugin 安装本地 Jar
让我们从将工件安装到本地存储库所需的完整配置开始:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<groupId>org.somegroup</groupId>
<artifactId>someartifact</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<file>${basedir}/dependencies/someartifact-1.0.jar</file>
<generatePom>true</generatePom>
</configuration>
<executions>
<execution>
<id>install-jar-lib</id>
<goals>
<goal>install-file</goal>
</goals>
<phase>validate</phase>
</execution>
</executions>
</plugin>
现在,让我们分解分析一下这个配置的细节。
2.1. 配置信息
工件信息被定义为<configuration>元素的一部分。实际语法与声明依赖关系非常相似——一个groupId、artifactId和version元素。
配置的下一部分需要定义工件的包装——这被指定为jar。
接下来,我们需要提供要安装的实际 jar 文件的位置——这可以是绝对文件路径,也可以是相对的,使用Maven 中可用的属性 。在这种情况下,${basedir}属性表示项目的根目录,即pom.xml文件所在的位置。这意味着someartifact-1.0.jar文件需要放在根目录下的*/dependencies/*目录中。
最后,还有其他几个可选的细节 也可以配置。
2.2. 执行
install-file目标的执行绑定到标准 Maven构建生命周期的 **validate 阶段。因此,在尝试编译之前——您需要明确地运行验证阶段:
mvn validate
这一步之后,标准编译就可以工作了:
mvn clean install
一旦编译阶段确实执行,我们的someartifact-1.0.jar就会正确安装在我们的本地存储库中,就像可能已经从 Maven 中心本身检索到的任何其他工件一样。
2.3. 生成POM与提供POM
我们是否需要为工件提供pom.xml文件的问题主要取决于工件本身的运行时依赖性。简而言之,如果工件对其他 jar 具有运行时依赖性,则这些 jar 也需要在运行时出现在类路径中。使用一个简单的工件应该不是问题,因为它在运行时可能没有依赖关系(依赖关系图中的叶子)。
install-file目标中的generatePom选项应该足以满足这些类型的工件:
<generatePom>true</generatePom>
但是,如果工件更复杂并且确实具有重要的依赖项,那么,如果这些依赖项不在类路径中,则必须添加它们。一种方法是在项目的 pom 文件中手动定义这些新的依赖项。更好的解决方案是提供自定义pom.xml文件以及已安装的工件:
<generatePom>false</generatePom>
<pomFile>${basedir}/dependencies/someartifact-1.0.pom</pomFile>
这将允许 Maven 解析此自定义pom.xml中定义的工件的所有依赖项,而无需在项目的主 pom 文件中手动定义它们。