V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
odirus
V2EX  ›  Java

两个 Java 项目复用组件的问题,该如何选择方案

  •  
  •   odirus · 2015-11-12 08:12:24 +08:00 · 3249 次点击
    这是一个创建于 3095 天前的主题,其中的信息可能已经有所发展或是发生改变。

    手上两个 Java 项目,一个是为客户提供非 HTTP 服务(假设为项目 A ,使用 Netty 框架),另外一个是为客户提供 HTTP 服务(假设为项目 B ,由 spring mvc 框架搭建),共同使用了 MyBatis 作为数据库操作层组件。

    两个项目有各自的 MyBatis 配置文件,各自的 dao 层、 service 层,但。。。其实两个项目里面的这些部分是重复的,操作的表都是同样的,如果继续这样的话,会导致项目非常难以管理,方式不科学。

    我一些想法:
    * 统一由 B 来提供数据库层的操作,并为 A 提供 HTTP 调用接口。但是项目 A 才是写入数据库最频繁的地方,所以感觉更加不好。

    • 想把两个项目放在一起,但臣妾做不到啊,一个打包的时候需要打包成 jar (就是最原始的方式运行),另外一个打包的时候需要打包成 tomcat 使用的 war 。其实别说打包,光是开发的时候如何在同一个项目里面分别运行 webapp 、 jar 我都不太清楚。

    • 把数据库层操作封装成一个包,在项目 A 、 B 中以 lib 的形式引入。

    欢迎提出不当之处,或者提供更好的建议。

    谢谢、谢谢。

    20 条回复    2015-11-12 12:58:41 +08:00
    RagingSweet
        1
    RagingSweet  
       2015-11-12 08:33:26 +08:00   ❤️ 1
    通过 MAVEN 进行包管理,将数据库访问层独立出来以 snapshot dependency 的方式供 A 、 B 使用
    domty
        2
    domty  
       2015-11-12 09:02:37 +08:00   ❤️ 1
    简单点的做法就是像你说的 把数据库层打包组织成 lib,然后维护这个 lib 给两个项目

    或者可以试试吧数据库层和服务层的代码打包做成服务器内置服务,提供被调用的接口给两个项目用.
    其余两个项目主要做 接收请求->解析请求->转发给内置服务->获取内置服务结果->回复请求
    你看这个办法行不?
    coolcfan
        3
    coolcfan  
       2015-11-12 09:14:37 +08:00   ❤️ 1
    把数据库层操作封装成一个包,在项目 A 、 B 中以 lib 的形式引入。+1
    odirus
        4
    odirus  
    OP
       2015-11-12 09:26:45 +08:00
    @RagingSweet
    @domty
    @coolcfan
    感谢上面三位的建议,而且还这么早,我试一下,谢谢哈。
    skywalkboy
        5
    skywalkboy  
       2015-11-12 09:35:05 +08:00   ❤️ 1
    A,B 项目统一有 A 提供给外部 HTTP 接口,把 B 做成 A 的底层服务,这样比较好管理,而且 HTTP api 接口只需要浏览器,对语言没有要求
    SoloCompany
        6
    SoloCompany  
       2015-11-12 09:43:51 +08:00   ❤️ 1
    这居然都是问题?你能共享源代码不就完了,怎么打包和源代码能否共享有关系吗?
    funky
        7
    funky  
       2015-11-12 09:48:44 +08:00   ❤️ 1
    数据库那层的代码抽出来打成 jar 或者 maven dependcy ,供其他项目使用就好
    hcymk2
        8
    hcymk2  
       2015-11-12 09:52:12 +08:00
    直接都改成用 netty 吧 netty 可以支持多协议。如果那个为客户提供 HTTP 服务没有 jsp 页面或者要依赖 web 容器的功能。可以试下 port unification
    odirus
        9
    odirus  
    OP
       2015-11-12 10:02:15 +08:00
    @hcymk2 Netty 确实厉害,但是都是我一手操办啊,没人写路由,没人写 cookie 管理。。。所以用 spring 吧。
    odirus
        10
    odirus  
    OP
       2015-11-12 10:02:30 +08:00
    @funky 正在尝试中哈,谢谢建议
    odirus
        11
    odirus  
    OP
       2015-11-12 10:04:30 +08:00
    顺便说一句,我以前只是把 Java 当成玩具(我主要的开发工具也不是 Java )。。。真正的核心知识都是这一两个月每天加班加点看书、实验得来的。所以有不妥之处,还望指点啊。
    hcymk2
        12
    hcymk2  
       2015-11-12 10:09:15 +08:00
    @odirus
    现在有 embedded tomcat 或者用 spring boot 直接 jar 运行。

    传统的 war 也可以 你只要将 netty 的 ServerBootstrap 的启动 放在 servlet init() 里面。

    当然把数据访问层单独立出来是最通用的方法。
    zacard
        13
    zacard  
       2015-11-12 10:10:02 +08:00
    没有用 maven 的后果。。。
    odirus
        14
    odirus  
    OP
       2015-11-12 10:10:12 +08:00
    @coolcfan
    @RagingSweet
    @domty
    @funky

    再请教一下,因为我使用的是 MyBatis 来操作数据库,但都是把 MyBatis 中的映射文件等资源放到项目的 resource 下面的,打包成 lib 的时候,如何把 resource 也打包进去呢?谢谢。
    odirus
        15
    odirus  
    OP
       2015-11-12 10:34:42 +08:00
    我尝试了用 maven 手动打包项目,看来效果还不错,而且资源的问题也得到了解决(应该是我对 IDE 不熟悉,没用对他的插件),谢谢上面各位。再次感谢。
    caixiexin
        16
    caixiexin  
       2015-11-12 10:57:27 +08:00   ❤️ 1
    项目的规模如何呢,重新打包重新发布影响大吗
    把数据库操作抽出来单独做一个底层服务供其他两个使用思路应该没错,不过实现方式也有多种:
    1. 打成 jar 包给其他项目引用最简单,但是如果这个服务经常变动,就要经常重新发布 jar 包,生产上引用它的项目也要重新打包重新发布。
    2. 做成基于接口的 RPC 调用服务,也是提供 jar 包给其他两个用。接口不变只改动内部逻辑的话,只要重新发布这个数据库操作服务就好了,调用方不用再重新引用 jar 。
    目前公司用的是后者,仅供参考=。=
    otakustay
        17
    otakustay  
       2015-11-12 11:09:25 +08:00   ❤️ 1
    把数据库操作独立为一个服务,同时为 A 和 B 提供调用接口,但是不使用 HTTP 这种低效的,这么多 RPC 框架任君选择
    BaratSemet
        18
    BaratSemet  
       2015-11-12 11:18:00 +08:00   ❤️ 1
    Service 、 Dao 、 Model 可以统一起来做一个 maven 的依赖包管理
    在两个不同的 web 分别依赖

    如果还嫌不够,可以考虑在两个 web 项目中,通过 RMI 方式调用 Service ,这样分离更彻底。
    odirus
        19
    odirus  
    OP
       2015-11-12 11:20:05 +08:00
    @caixiexin 恩恩,谢谢,第二种方式确实不错

    @otakustay 恩恩,谢谢哈,听君一席话,胜码一月 Java

    @BaratSemet 正有通过这种方式的想法,谢谢
    ljbha007
        20
    ljbha007  
       2015-11-12 12:58:41 +08:00
    intelliJ 和 eclipse 都可以项目之间互相依赖

    你把 dao 拆到另外一个单独的项目里就可以了
    这样版本库里有 3 个项目 三个之间相互依赖
    三个项目分别建版本库
    然后再建一个主项目库 用 git submodule 把三个子项目都导入进来就可以了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   891 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 23:05 · PVG 07:05 · LAX 16:05 · JFK 19:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.