• 通用接口开放平台设计与实现——番外篇2 打包与引用遇到的问题及解决过程


    背景介绍

    上篇介绍了开发平台与通用接口平台的关系,即开发平台作为公共基础支撑,在其基础上构建业务系统,如通用接口平台。

    确定了二者关系后,那么,我们会将开发平台打成jar包,供通用接口平台使用。

    上篇说了,因为初期为了简单高效,开发平台和业务系统在一块,是一个SpringBoot项目,首先就是进行了剥离,拆成两个独立的项目。

    开发平台命名为platform-core,通用接口平台命名为cip(common-interface-platform)。

    问题及解决过程

    第一步,将platform-core打成jar包

    这原先是个springboot项目,使用如下插件打包是不行的,

    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    
    • 1
    • 2
    • 3
    • 4

    这么打出来的包,会有BOOT-INF目录,其他项目引用这个包,无法使用这里面的类。

    需要更换为如下插件:

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>           
                </plugin>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这样就产生了一个开发平台的jar包,platform-core.jar

    第二步,通用接口平台cip如何引用?

    因为我的jar包并未上传到maven中央仓库,通过常规依赖方式是无法拉取到的

      		<dependency>
                <groupId>tech.popsoft.platform</groupId>
                <artifactId>platform-core</artifactId>
                <version>2.0.0</version>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    既然不能直接使用,就只能采用本地依赖的方式,尝试了如下几种方式:

    1.依赖本地库的方式

    在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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这种方式理论上可行,实际测试,cip还是找不到开发平台中的类,分析原因,在于我的开发平台也不是一个单模块,会将一些父类、工具类等提取形成一个platform-common的模块,然后由platform-core引用,在我们第一步打出的platform-core包中,打开查看,实际并不包含位于platform-common的类。然后尝试了几种方式,一是改变platform的打包模式,把依赖包打进去,这样会形成一个100多M的包,并且部分包是跟cip中重复的,这种方式不怎么好;二是只包含pom文件,但测试cip还是找不到类。

    2.安装到本地库模式

    既然依赖本地包的方式走不通了,那就考虑使用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
    
    
    • 1
    • 2

    实际测试的时候,发现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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    只有这么多……

    而使用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>
    ……以下省略
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    也就是完整的pom文件。

    之后再查找mvn资料,发现没有更多的参数可以来控制生成完整pom文件了,这种方式也走不通了。

    3.复制到本地库模式

    这种方式就简单粗暴了,就是先用idea的maven控制面板,执行install命令,让本地库里生成jar和pom,然后将整个目录拷贝出来,放到源码中resources里,一块发布出来,这样使用方在构建开发环境时,将该目录拷贝到对应的路径下即可。

    结语

    该问题最终虽然解决了,但是解决方式比较粗暴,并不优雅,理论上,应该有更好地处理方式,推测是对于maven打包、编译了解有限,存在知识盲区。

    如有更好的处理方式,欢迎留言交流,谢谢。

  • 相关阅读:
    Lua中文语言编程源码-第五节,更改lcorolib.c协程库函数, 使Lua加载中文库关键词(与所有的基础库相关)
    openradar中最后跟踪的解释
    爱上开源之golang入门至实战第四章函数(Func)(五)
    基于Python的飞机票销售系统的设计和实现
    Spring Boot学习笔记
    docker入门加实战—Docker镜像和Dockerfile语法
    wps表格按分隔符拆分单元格
    【华为OD机试真题 JAVA】数字涂色
    JS数组中every, some, filter, map方法
    luffy-(7)
  • 原文地址:https://blog.csdn.net/seawaving/article/details/126384435