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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

你把 dao 拆到另外一个单独的项目里就可以了
这样版本库里有 3 个项目 三个之间相互依赖
三个项目分别建版本库
然后再建一个主项目库 用 git submodule 把三个子项目都导入进来就可以了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/235506

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX