有时候maven仓库没有的jar包,我们需要从本地址指定文件路径并且指定scope为system来引入依赖。默认的,assemble插件是不会把本地依赖的jar包打包进去的。
<dependency>
<groupId>com.alibaba.csb.sdk</groupId>
<artifactId>http-client</artifactId>
<version>1.1.5.7</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/http-client-1.1.5.7.jar</systemPath>
</dependency>
assemble插件的配置中,可以指定打包结果输出的根目录和jar包存放目录。
<!-- 根目录 -->
<assembleDirectory>demo</assembleDirectory>
<!-- 打包的jar,以及maven依赖的jar放到这个目录里面 -->
<repositoryName>lib</repositoryName>
可以通过在pom文件中的build节点中单独指定本地依赖jar包的存放路径作为资源,输出目录targetPath指定到我们打包后存放jar包的地址,这样本地依赖的jar包就可以变相打进去了。这里的地址是相对于本地依赖jar包里面作为目录起点的相对位置。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>target/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<includeScope>compile</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/demo/lib</outputDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources/lib</directory>
<filtering>false</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
可能还有个问题,如果打包后生成启动脚本,脚本里面有指定JVM启动参数,里面的CLASSPATH默认是指向所有依赖的jar包的,但不包括本地依赖的jar包,虽然我们打进去了,但是依赖不到,依然无法启动。
CLASSPATH="$BASEDIR"/conf:"$REPO"/spring-boot-starter-2.1.5.RELEASE.jar:$REPO"/hamcrest-core-1.3.jar:.....(省略很多,就是所有jar包一个个列出来)
通过设置classpath通配符,可以让上面的配置清爽很多,同时所有打包后的jar目录的包都可以设置到classpath了。另外jvm启动参数也简短了很多,在linux服务器上查看进程也清晰了。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
<executions>
<execution><!-- 配置执行器 -->
<id>make-assembly</id>
<phase>package</phase><!-- 绑定到package生命周期阶段上 -->
<goals>
<goal>assemble</goal><!-- 只运行一次 -->
</goals>
</execution>
</executions>
<configuration>
<!--设置classpath通配符,可以让上面的配置清爽很多,同时所有打包后的jar目录的包都可以设置到classpath了-->
<useWildcardClassPath>true</useWildcardClassPath>
<!--lib下直接存放jar,没有路径文件夹(如com/apache),如果没有这个选项则放在lib下的jar包会被com/apache类似的多层文件夹包裹起来 -->
<repositoryLayout>flat</repositoryLayout>
<configurationDirectory>conf</configurationDirectory>
<configurationSourceDirectory>src/main/resources</configurationSourceDirectory>
<copyConfigurationDirectory>true</copyConfigurationDirectory>
<includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath>
<!--生成的项目的目录位置,这里的client是项目的名称,你可以根据你的需要自己随便命名 -->
<assembleDirectory>${project.build.directory}/demo</assembleDirectory>
<!--java启动参数 -->
<extraJvmArguments>-Xms4G -Xmx4G -Djava.util.Arrays.useLegacyMergeSort=true -Dsnowflake.worker.center=1 -Dsnowflake.data.center=0</extraJvmArguments>
<binFileExtensions>
<unix>.sh</unix>
</binFileExtensions>
<platforms>
<platform>windows</platform>
<platform>unix</platform>
</platforms>
<repositoryName>lib</repositoryName>
<programs>
<program>
<!--指定主类,脚本名。会生成shell/bat两种类型,也可用platforms指定运行平台 -->
<mainClass>com.ygo.GoffApplication</mainClass>
<!-- 生成的脚本文件的名称,比如start.sh,你也可以根据你的需要命名成其他名字 -->
<name>start</name>
</program>
</programs>
</configuration>
</plugin>
设置以后的classpath如下:
CLASSPATH="$REPO"/*
以下是部分参数介绍:
configurationDirectory:生成配置文件路径 configurationSourceDirectory:配置文件原路径,默认为src/main/config assembleDirectory:整体包目录 extraJvmArguments:jvm参数 binFileExtensions:生成脚本的后缀 platforms:生成哪几种平台 repositoryName:依赖包目录,默认repo programs:这个必须参数,启动的主class
文章参考:
https://blog.csdn.net/u013041642/article/details/100088939/
https://www.cnblogs.com/shawWey/p/8571608.html