上篇介绍了开发平台与通用接口平台的关系,即开发平台作为公共基础支撑,在其基础上构建业务系统,如通用接口平台。
确定了二者关系后,那么,我们会将开发平台打成jar包,供通用接口平台使用。
上篇说了,因为初期为了简单高效,开发平台和业务系统在一块,是一个SpringBoot项目,首先就是进行了剥离,拆成两个独立的项目。
开发平台命名为platform-core,通用接口平台命名为cip(common-interface-platform)。
这原先是个springboot项目,使用如下插件打包是不行的,
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
这么打出来的包,会有BOOT-INF目录,其他项目引用这个包,无法使用这里面的类。
需要更换为如下插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
这样就产生了一个开发平台的jar包,platform-core.jar
因为我的jar包并未上传到maven中央仓库,通过常规依赖方式是无法拉取到的
<dependency>
<groupId>tech.popsoft.platform</groupId>
<artifactId>platform-core</artifactId>
<version>2.0.0</version>
</dependency>
既然不能直接使用,就只能采用本地依赖的方式,尝试了如下几种方式:
在cip项目的resources目录下创建lib目录,将platform-core.jar放进去,然后配置依赖如下
<dependency>
<groupId>tech.popsoft.platform</groupId>
<artifactId>platform-core</artifactId>
<version>2.0.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/platform-core.jar</systemPath>
</dependency>
……
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
这种方式理论上可行,实际测试,cip还是找不到开发平台中的类,分析原因,在于我的开发平台也不是一个单模块,会将一些父类、工具类等提取形成一个platform-common的模块,然后由platform-core引用,在我们第一步打出的platform-core包中,打开查看,实际并不包含位于platform-common的类。然后尝试了几种方式,一是改变platform的打包模式,把依赖包打进去,这样会形成一个100多M的包,并且部分包是跟cip中重复的,这种方式不怎么好;二是只包含pom文件,但测试cip还是找不到类。
既然依赖本地包的方式走不通了,那就考虑使用maven将jar包安装到本地库。
搞个批处理,如下:
E:\tool\apache-maven-3.5.3\bin\mvn install:install-file -Dfile=popsoft-platform-core-2.0.0.jar -DgroupId=tech.popsoft.platform -DartifactId=popsoft-platform-core -Dversion=2.0.0 -Dpackaging=jar
实际测试的时候,发现cip还是找不到类,而使用idea的maven控制面板,执行install命令,则cip可以正常编译,对比了下这两种方式,区别在于,使用mvn命令,maven本地库中生成的pom文件是这个样子:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>tech.popsoft.platform</groupId>
<artifactId>popsoft-platform-core</artifactId>
<version>2.0.0</version>
<description>POM was created from install:install-file</description>
</project>
只有这么多……
而使用idea的maven控制面板,执行install命令,maven本地库中生成的pom文件是这个样子:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>tech.popsoft.platform</groupId>
<artifactId>boot</artifactId>
<version>2.0.0</version>
</parent>
<artifactId>platform-core</artifactId>
<version>2.0.0</version>
<name>platform-core</name>
<description>平台内核</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!--版本依赖管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>tech.popsoft.platform</groupId>
<artifactId>platform-common</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
……以下省略
也就是完整的pom文件。
之后再查找mvn资料,发现没有更多的参数可以来控制生成完整pom文件了,这种方式也走不通了。
这种方式就简单粗暴了,就是先用idea的maven控制面板,执行install命令,让本地库里生成jar和pom,然后将整个目录拷贝出来,放到源码中resources里,一块发布出来,这样使用方在构建开发环境时,将该目录拷贝到对应的路径下即可。
该问题最终虽然解决了,但是解决方式比较粗暴,并不优雅,理论上,应该有更好地处理方式,推测是对于maven打包、编译了解有限,存在知识盲区。
如有更好的处理方式,欢迎留言交流,谢谢。