美文网首页IT@程序员猿媛SpringBoot精选Java架构技术进阶
基于maven,构建父子工程,都遇到了哪些坑?

基于maven,构建父子工程,都遇到了哪些坑?

作者: 程就人生 | 来源:发表于2019-07-26 20:03 被阅读5次

    基于maven构建一个父子工程,并没有多难,自己动手建了个demo,并总结成基于maven,构建父子项目一文,项目是建好了,也可以正常运行,事情还没有完,当把这个应用到实际的开发中,又遇到了很多问题,经过反反复复的思考琢磨,最终将这些问题解决。

    本文主要记录遇到的及解决的问题

    1. 架包如何引入,怎样防止冲突;
    2. 一个模块依赖另一个模块,另一个模块的架包找不到怎么办?
    3. 项目部署后,找不到主文件,咋回事?
    4. 打包时,正常clean,但是生成架包时,却报找不到怎么办?
    5. 打好包后,发布运行时,cmd窗口闪了一下,就关闭了,这是为何?

    在写遇到的问题前,有一个问题需要解决,什么是父子项目(工程),为什么建立父子项目?

    所谓父子项目(工程),就是建立一个文件夹(父文件夹),其他项目(每个项目都是一个独立的文件夹)都在这个文件夹下,这些放在父文件夹下的文件成为子项目。为什么要建立父子项目,主要原因是,项目越建越多,为了便于文件的管理,减少相同代码的冗余。也便于maven架包的管理,当多个项目需要引入同一个架包时,只需要在父项目的pom文件中引入即可,其他子项目继承了父项目,也就不需要再引入了。

    使用过Spring Boot的人都知道,为了给项目减压,把一个项目分成多个模块,每个模块又单独成一个服务。

    基于Maven建立父子项目,刚好就是把原本属于一个项目的各个模块又集结在一起。说白了,就是一个project下,有N个module,父子工程就是这样建成。

    第一个问题,架包如何引入,怎样防止冲突?
    架包的引入,本人采用第一引入原则,什么是第一引入原则,就是在需要引入架包的项目导入架包,除非是公共的架包,否则不在父项目中引入。把所有的架包都放在父项目的pom文件中,不是一个好IDEA,还有可能引起架包间的冲突。

    一个模块依赖另一个模块,另一个模块的架包找不到怎么办?
    第一,先检查所引用的架包,项目里面是否有报错信息,有报错信息就解决掉,一般都是这个问题。
    第二,防止缓存,有时删除添加架包,需要一点时间,点击菜单栏的Project->clean,把需要的项目一一clean一下。

    项目部署后,找不到主文件,咋回事?
    选中项目的主文件,右键点击Run As下的Java Application 或Spring boot App,却报错 主文件找不到,这是怎么回事呢?
    第一种解决办法,还是执行Project->clean,把需要的项目一一clean一下,就ok了。
    第二种解决办法,选中项目,右键 Run As-> maven clean,maven clean过后,再maven-> update project,把缓存清一清,把需要的架包下载下来。

    打包时,正常clean,但是生成架包时,却报找不到怎么办?
    项目建好了,也能正常运行,但是打包的时候出错了,这个好办,选中主项目,先对主项目进行maven clean,然后在maven install,这样就能顺利打包了,并且可以在每个子项目的target下面找到对应的jar包。

    打好包后,发布运行时,cmd窗口闪了一下,就关闭了,这是为何?
    查看pom文件,并和一起能够正常运行的项目进行对比,发现在pom文件中缺少了这样几行代码:

    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    

    spring-boot-maven-plugin的意思是,能够将Spring Boot应用打包为可执行的jar或war文件,然后以通常的方式运行Spring Boot应用。没有加上面的代码,就没有入口文件,没有入口文件,就运行不了,运行不了就报找不到主文件,好吧,这两天遇到的错误,都是找不到主文件。

    除了这个错误,还有一个错误,说是找不到配置文件,刚开始以为打包后,resources的资源无法识别,修改了很多配置,依旧找不到。但是在本地运行时,一切是正常的,配置文件是能够读取的,不应该打包后获取不到,又调查了半天,是因为所引用的架包,读取的配置文件在当前项目里没有。所引用的架包在自己的项目里有对应的配置文件,但是被引用后却获取不到了,父子工程后,还有这个区别。

    首次建立父子工程时,有些问题还是很纠结的。比如,项目如何分层,架包在哪个节点导入,也曾见过一个项目把所有的架包都在父项目中导入的,结果呢,从注释中可以看出来,曾经遇到了架包冲突,还要再加入额外的依赖架包来解决冲突。这些都是个事儿,而且不是小事。

    搭建项目做架构,只能自己在项目进行中,经常分析,实时进行调整,感觉不方便了,麻烦了,费劲了,都要调整,调整到舒适为止。当然,有时不仅仅是怕麻烦,还担心调整架构后,项目会不会出现什么新的问题,如果怕,就先写demo,把会发生的情况都在demo里面预演一遍,这样才是万全之策,小白心态吧。

    父子工程,还有一个事情特别重要,谨防循环依赖,千万不能循环依赖。一个架包导入一次就够了,不要重复导入。有些在项目启动时候就自动运行的架包,要不要加入到父项目,这个也是需要值得注意的,根据实际需要吧,根据子项目是如何拆分的来做决定吧。

    遇到问题的心态,这个很重要。遇到问题的心态,决定能够多长时间解决问题。遇到问题,应该沉着泠静,先把报错信息的含义弄明白,不要动不动就百度。报错信息,是解决问题的方向,报错信息搞明白了,离解决问题也就不远了。如果不对报错信息思考,只是一味的百度,有些复杂的问题,还真是百度不出来,特别是环境差异引起的报错。

    遇到问题,还是那句话,把错误信息读懂了,多读几遍,再去解决问题,千万不要慌里慌张的,十万火急的样子。另外,看资料,尽量看官网,一手资料。

    微信扫一扫,关注程就人生

    相关文章

      网友评论

        本文标题:基于maven,构建父子工程,都遇到了哪些坑?

        本文链接:https://www.haomeiwen.com/subject/legkrctx.html