如何使用Java 9 Module创建内置依赖的Java库避免版本冲突
模块化JAR打包操作步骤(Maven + Eclipse环境)
你已经完成的模块化Maven项目创建,不需要额外复杂配置就能完成打包:
- 确认项目根目录下的
pom.xml中已正确识别src/main/java下的module-info.java(Eclipse自动生成的模块化Maven项目默认已配置正确,不需要手动修改) - 在Eclipse中右键点击项目名称,依次选择「Run As」→「Maven build...」,在弹出窗口的Goals输入框中填写
package,点击「Run」执行打包 - 执行完成后,打包好的Modular Jar会生成在项目根目录的
target文件夹下,Jar包内会自动包含编译后的module-info.class文件,符合Java模块系统规范
Modular Jar之外的依赖冲突规避替代方案
针对你要内置全部依赖、避免和用户环境版本冲突的需求,还有几个更常用、兼容性更好的方案可选:
1. Shaded Jar(重命名类路径的胖Jar)
这是目前Java生态中解决依赖冲突最通用的方案:
- 实现逻辑是把你的库需要的所有依赖的类文件全部打进同一个Jar中,同时把这些依赖的包名前缀批量修改为你自定义的专属前缀,和用户环境中的同依赖完全隔离,彻底避免版本冲突
- Maven中使用
maven-shade-plugin插件即可实现,只需要在pom.xml的build/plugins节点中添加插件配置,配置<relocation>规则,把需要内置的第三方依赖包全部重定位到你的库专属的包路径下即可,比如你依赖的com.google.gson可以重定位为your.library.basepath.shaded.com.google.gson - 优势:兼容Java 8及以上所有版本,不管用户的项目有没有使用Java模块系统都可以正常引入使用,兼容性远高于Modular Jar
- 注意事项:如果你的依赖中包含SPI配置文件、本地类库资源,需要额外在shade插件中配置对应的资源合并规则,避免功能异常
2. 可选依赖+范围声明
如果你的库功能轻量,依赖的都是业界通用的公共组件,也可以选择不内置依赖:
- 在
pom.xml中将第三方依赖的<scope>设置为provided,同时在库的使用文档中明确标注你适配的依赖版本范围,让使用方自行引入对应版本的依赖即可 - 优势:可以大幅减小你的Jar包体积,适合开源的通用工具类库
3. 独立服务封装
如果你的库功能非常重、依赖极多,也可以把对应的功能封装为独立的RPC/HTTP服务,使用方只需要调用接口不需要引入你的任何Jar依赖,从根源上消除依赖冲突问题,不过这个方案部署成本较高,只适合特定的重型功能场景。
内容的提问来源于stack exchange,提问作者Shalini
相关产品推荐
相关产品推荐

