目录
问题描述
解决方案
依赖本地包
打包工具包
参考文献
问题描述
最近做一个项目,打包发布的时候需要在客户提供的云桌面环境进行开发和打包,而客户的云桌面环境不能连外网,这样就不能使用我们的maven私服,不过开发的时候又想使用我们自己的私服上的一些plugin工具,最直观的办法就是把我们自己私服上的jar拷贝到云桌面上的客户的私服上,但是不幸的是,我们无法对云桌面上的maven私服进行管理,因此只能尝试将相关jar以本地包的方式引入进来。
解决方案
依赖本地包
(1)将对应的plugin-cache包down到本地,然后放到工程的lib目录下,然后修改工程的pom,添加如下依赖:
<dependency>
<groupId>com.ohaotian.plugin</groupId>
<artifactId>plugin-cache</artifactId>
<version>2.0.1-multi-8</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/plugin-cache-2.0.1-multi-8.jar</systemPath><!--路径-->
</dependency>
(2)修改打包时候的配置,添加iincludeSystemScope的配置项,以SpringBoot打包为例,如下:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--这里写上main方法所在类的路径-->
<configuration>
<mainClass>com.jingu.Application</mainClass>
<includeSystemScope>true</includeSystemScope><!--外部进行打包-->
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
按照如上方式可以正常将本地包依赖进来,并打包成功。但是,但是运行的时候,会出现ClassNotFound的错误,说找不到对应的类,仔细看的话会发现,找不到的都是这个jar里面再依赖的jar。 因为这个plug-cache工具类本身也是一个mavne工程,它内部还依赖了其他的依赖。但是通过这种本地方式依赖进来的包,依赖传递失效了。或者说,pom里配置本地jar的这种方式常规都是依赖的完整的工具jar,也就是所有的依赖都打到这个jar中才对。
打包工具包
如何将一个maven工具包打包,将所有的依赖都打包进去?这要使用maven-assemble-plugin这个插件。修改plugin-cache工程对应的pom,如下所示:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
然后点击Plugins--->assembly--->assembly:assembly进行打包
打包后效果如下:
参考文献
【2】Maven构建可执行的jar包(包含依赖jar包)