Sbt/Maven是否将完整依赖打入Jar?Rest API依赖打包疑问
关于Sbt/Maven依赖打包与旧项目引入的问题解答
1. Sbt/Maven是否会将完整的依赖内容打包进Jar文件中?
这个得分情况来看:
- 如果你用的是默认的打包任务(比如Maven的
maven-jar-plugin,Sbt的package命令),生成的Jar只会包含你自己项目的代码和资源,不会把依赖的内容打包进去。这时候你的项目Jar是“瘦Jar”,运行的时候需要把依赖的Jar放在类路径里。 - 如果你要打可执行的胖Jar(比如用Maven的
maven-shade-plugin,Sbt的sbt-assembly插件),默认配置下会把所有依赖的完整内容都打包进最终的Jar里。不过你也可以通过插件配置,排除某些不需要的依赖、或者对冲突的类做阴影处理,但默认是全量引入依赖的。
2. 引入旧项目作为依赖后,打包会包含全部功能还是仅调用的方法?
首先得明确:
- 如果你是用默认方式打包新Rest API项目的普通Jar,旧项目的代码不会被打入新Jar里,它会作为一个独立的依赖存在,运行时需要一起加载。
- 如果你是打胖Jar(比如用shade/assembly),默认情况下会把旧项目的完整181M Jar内容全部打包进去,不管你的新项目有没有调用其中的方法。因为Sbt和Maven的胖Jar插件默认不会做“代码裁剪”——它们不知道哪些代码是你实际用到的,只会把整个依赖Jar的内容合并进去。
如果不想把整个181M的旧项目都打包进去,你可以考虑这些方案:
- 使用代码裁剪工具,比如ProGuard或者R8,它们可以分析你的代码调用链,移除未被使用的类、方法和资源,从而大幅缩小Jar体积。不过配置这些工具需要花点功夫,尤其是旧项目可能有一些反射调用或者动态加载的代码,得注意保留这些部分。
- 不打胖Jar,采用依赖分离的部署方式:把新项目的瘦Jar和所有依赖(包括旧项目的Jar)放在一起,用启动脚本指定类路径来运行,这样也能避免把大体积的旧项目打包进新Jar里。
内容的提问来源于stack exchange,提问作者Laeeq
相关产品推荐
相关产品推荐

