在使用Maven作为项目构建工具的过程中,有时还是会不可避免的遇到依赖的第三方库在Maven中央库中没有,只能使用本地依赖,虽然这样的情况极少发生,但当真的遇到时,应该如何优雅的解决呢?
如果是简单粗暴的引入一个本地依赖的话,一般像下面这样配置就好了:
<project>
...
<dependencies>
...
<dependency>
<groupId>org.jhat</groupId>
<artifactId>third-party</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/third-party.jar</systemPath>
</dependency>
...
</dependencies>
...
</project>
这种方式使用起来最简单,但是并不建议这么做,因为Maven在打包的过程中会忽略system类型依赖,也就是说system类型的依赖信息不会写入MANIFEST.MF文件中,自然也不会将其拷贝到jar/war包的libs目录下,打成一个单独的jar包时也不会包含system类型依赖的任何内容。如果要解决上述问题,不同的Maven插件都需要单独配置对system类型依赖的处理,也就是说在不同的使用场景下,都需要用对应的Maven插件针对system类型依赖进行处理。
为了更优雅的解决本地依赖,应该是将其存入本地Maven仓库,再将其当做普通的第三方依赖使用。 一种方法是执行如下命令,先手动将其存入本地Maven仓库,然后再使用。
mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file -Dfile=path-to-your-artifact-jar \
-DgroupId=your.groupId \
-DartifactId=your-artifactId \
-Dversion=version \
-Dpackaging=jar \
-DlocalRepositoryPath=path-to-specific-local-repo
这样有一点不好的是可能会忘记,或者存入错误的路径,尤其是团队协作的时候。更好的解决方法是将其配置在pom.xml里面,使用maven-install-plugin自动处理:
<project>
...
<properties>
...
<third-party.version>1.0</third-party.version>
...
</properties>
...
<dependencies>
...
<dependency>
<groupId>org.jhat</groupId>
<artifactId>third-party</artifactId>
<version>${third-party.version}</version>
</dependency>
...
</dependencies>
...
<build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-third-party</id>
<phase>validate</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<!-- 此处的groupId, artifactId, version 需要和dependencies里面配置的完全一致 -->
<groupId>org.jhat</groupId>
<artifactId>third-party</artifactId>
<version>${third-party.version}</version>
<packaging>jar</packaging>
<file>${project.basedir}/libs/third-party.jar</file>
</configuration>
</execution>
...
</executions>
</plugin>
...
</plugins>
...
</build>
...
</project>
需要注意的是maven-install-plugin应该在所有其它插件之前。