在maven项目中,我们的项目依赖一般取自local的repository或者远程的repository,比如下面这个配置:
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.2</version>
</dependency>
一般而言,maven会先去本地的repository寻找,如果找不到,就会依据<repository>的定义,去远程的repository去找依赖。
不过有时候,我们依赖的jar并不在任何repository中,可能就是从同事那里拷贝来的一个孤独的jar文件。怎么办?
Maven有办法处理这种情况,它支持systemscope的定义方式,可以加载本地任意路径下的jar包,定义如下:
<dependency>
<groupId> commons-cli </groupId>
<artifactId> commons-cli </artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${basedir}/libs/commons-cli.jar</systemPath>
</dependency>
这样,把想要加载的jar包:commons-cli.jar放到工程的libs/目录下,在java code中就可以引用这个jar包中的class了。
往往在项目开发中,我们需要把整个项目加上依赖,打成一个jar包,这样放到任何地方都可以独立运行,不依赖于任何其他jar包,非常方便。
这个时候,我们会发现,对于<scope>system</scope>,maven不会把这个jar包的内容打包到最后的jar-with-dependencies.jar中,怎么办?
后来在网上找到一个有趣的办法:既然maven可以把repository中的依赖打到最后的jar包中,那么把这个外部的jar包放到repository中,也就可以让maven把这个外部的jar包打到最后的jar包中。
Maven支持安装jar包到本地的repository,所以这个方法是可行的,具体pom配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-external</id>
<phase>clean</phase>
<configuration>
<file>${basedir}/libs/commons-cli.jar</file>
<repositoryLayout>default</repositoryLayout>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
这样:Mvn clean就会安装这个jar包,然后在mvn package就可以打出带有这个jar包的big jar包。
安装jar包的过程之所以在clean phase阶段,是因为maven需要项目的所有依赖都得到解决,之后才开始执行。
我试了试,果然work,非常好使。
参考:
http://eureka.ykyuen.info/2014/06/10/maven-include-system-scope-dependency-in-maven-assembly-plugin/