在使用 maven 编译项目时,我们有时候会需要引入本地的 jar 包作为依赖(不部署到本地仓库),一般会使用 scope 为 system 的标签来引入,如下所示:
<dependency>
<groupId>com.example</groupId>
<artifactId>system-dependency</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/system-dependency.jar</systemPath>
</dependency>
此时,pom 中往往还有其他的依赖,是从远端的 maven 仓库下载。如果我们需要同时将本地 jar 和远端下载的 jar 同时注册到 classpath 中,我们可以这么配置插件。
一、配置maven-dependency-plugin
首先利用maven-dependency-plugin插件,将 runtime 和 system 的依赖都拷贝到指定路径,这里是选择的路径是target/lib:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.4.0</version>
<executions>
<execution>
<id>copy-runtime-dependency</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<excludeTransitive>false</excludeTransitive>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<includeScope>runtime</includeScope>
</configuration>
</execution>
<execution>
<id>copy-system-dependency</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<excludeTransitive>false</excludeTransitive>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<includeScope>system</includeScope>
</configuration>
</execution>
</executions>
</plugin>
二、配置maven-jar-plugin
然后利用maven-jar-plugin插件将这些所有依赖的 jar 都注册到 classpath中,如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.xx.YourMain</mainClass>
</manifest>
<manifestEntries>
<Class-Path>lib/system-dependency.jar</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
这里的lib/system-dependency.jar对应的就是我们通过maven-dependency-plugin插件拷贝之后的新 jar,而不是最初的 systemPath 路径。
三、编译 & 执行
最终通过mvn clean package命令编译之后,就可以在我们自己的 jar的MANIFEST.MF文件中查看,所有的 jar 都被写到classpath,包括本地 jar。然后我们就可以通过 java -jar xxx.jar直接执行我们自己的程序。