首页   >   代码编程

DAO模块打包公用,避免项目中多处重复代码

Maven问世之后,创建工程的时候,都喜欢整成多包的项目,似乎多包已经成了大型项目标配,此时就会出现一个问题,实体Bean的代码可能要写多套,在一整个工程中就显得很冗余了,当数据库有改动时,需要修改多份重复的代码。

可能大家不太明白,我来举个例子:

拿我自己的博客项目来说,有一个用户访问的网站,有一个后台管理系统,此时对于博客中的文章来说,都是操作的article表的数据,对应javabean也就是Article.java,那么我就需要在项目中写两份一模一样的Article.java文件

DAO模块打包公用,避免项目中多处重复代码

如上图,admin和jwcz两个工程中都需要相同的javabean,如果是单包的项目,那我就需要两个工程都写一套,那也无可厚非了,但是在多包的工程中,如果我还这么设计,那就显得比较累赘了,和数据库交互的代码,我只需要写一份即可,因为这部分的代码,相对于业务来说,是比较独立的。

为了解决这个问题,可以单独将javaben和dao模块抽离出来当作一个单独的module,然后admin和jwcz两个工程再依赖这个module

DAO模块打包公用,避免项目中多处重复代码

在admin和jwcz工程中引入dao的依赖:

<dependency>
    <groupId>com.wolffy</groupId>
    <artifactId>dao</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

再次使用install打包之后,运行项目,一切正常,而且编写代码也跟我们上面想要的一样,数据库article表增加了一个字段,只需要改动dao模块中的Article.java即可。

至此,问题得到解决,但是好奇心驱使之下,我点开了war包,发现相关的资源文件并没有copy过来

DAO模块打包公用,避免项目中多处重复代码

上图中可以很清楚的看到,且不说javaben有没有被拷贝过来,就连dao中配置的jdbc的相关配置都没有拷贝,但是项目依旧可以运行,因为资源文件都在dao.war中,而启动项目的时候,会去加载dao.war中的资源文件

DAO模块打包公用,避免项目中多处重复代码

上图是我解压了dao.war之后的文件,基本上就是我dao模块中的所有配置文件,包含jdbc和mapper配置文件。

此时,我有了这样一个非正常的疑问:如果我想看一下改了mapper没生效,定位问题的时候,岂不是还需要将线上的dao.war拖出来排查?

我之所以说是非正常的疑问,就是因为排查问题时,确实应该这样,而且经过测试过的代码才会上线,那么这问题就不能变通一下吗?可以。

查阅资料后,发现有前辈们提出过这种疑问,甚至还找到了解决方案:利用maven-war-plugin的Overlay机制

在DAO模块的build中增加如下配置(此配置可有可无默认classesClassifier是class字符):

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <!--在打包时相关的类会被独立打成jar-->
                <attachClasses>true</attachClasses>
                <!--指定名字:dao-class.jar-->
                <!--为什么非要使用class才行呢?-->
                <classesClassifier>class</classesClassifier>
            </configuration>
        </plugin>
    </plugins>
</build>

在需要使用DAO模块的工程中,配置如下依赖:

<!-- 为了copy资源文件 -->
<dependency>
    <groupId>com.wolffy</groupId>
    <artifactId>dao</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 指定为war包 -->
    <type>war</type>
</dependency>
<!-- 为了正常的import -->
<dependency>
    <groupId>com.wolffy</groupId>
    <artifactId>dao</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 指定为jar包 -->
    <type>jar</type>
    <!-- 与DAO模块的classesClassifier保持一致 -->
    <!-- 经过多次测试,发现只能使用class才行 -->
    <classifier>class</classifier>
</dependency>

注意最后一行注释,看前辈们的配置,可指定任意字符串,只需要与dao中配置的字符串保持一致即可,但是我这里竟然只能使用class字符串,不知道是否我哪里配置有误,只要我写了其他字符串,就算二者保持一致,也依旧会导致打包失败。

配置完毕之后,再次install,打开包中文件查看,已经copy了资源文件

DAO模块打包公用,避免项目中多处重复代码

好了,不管是正常的还是非正常疑问,现在都已经有了答案和解决方法了!

QQ群Ⅰ: 686430774 (已满)

QQ群Ⅱ: 718410762 (已满)

QQ群Ⅲ: 638620451 (已满)

QQ群Ⅳ: 474195684

如果文章有帮到你,可以考虑请博主喝杯咖啡!

分享到:

欢迎分享本文,转载请注明出处!

作者:不忘初心

发布时间:2019-04-08

永久地址:https://www.jiweichengzhu.com/article/95737db17e0541c0b59e73a7d0e6d011

评论