为何Maven package生成jar包后需用java命令运行对应Java类?
为什么要用Maven打包运行,而不是直接运行源码文件
你现在拿无任何依赖的单文件Demo做测试,会觉得直接跑源码很方便,但这种方式只适合写几十行的玩具代码,一旦进入真实项目开发,直接跑源码的方式完全不可行,打包+Maven构建的价值主要在这几个方面:
- 解决依赖管理的噩梦
你现在看到的App是没有引入任何第三方库的最简示例,所以直接在源码路径执行命令能跑通。只要你在代码里用到第三方工具(比如JSON解析包、数据库驱动、工具类库),直接跑源码就需要手动把所有依赖的jar包路径全部拼到执行命令的classpath参数里,少一个就会报ClassNotFoundException。真实项目动辄几十上百个第三方依赖,依赖之间还有嵌套依赖关系,手动管理根本不可能完成。
Maven会自动根据pom.xml里的配置拉取所有依赖,在编译、测试、运行阶段自动维护正确的classpath,不需要你手动处理任何依赖路径问题。 - 标准化全流程构建,减少人为错误
mvn package不是简单把编译好的文件塞进压缩包,它会按约定的流程自动完成整套构建动作:- 清理之前的旧构建产物
- 编译src/main/java下的所有业务源码
- 自动执行src/test/java下的所有单元测试,只要有测试用例不通过就直接终止构建,避免把有问题的代码打包出去
- 把编译好的class文件、资源文件按Java标准规范的结构组装成jar包
整个流程不需要人工干预,不会出现漏编译、漏跑测试、文件放错路径这类低级错误。
- jar是Java生态通用的交付标准
你写代码不可能永远只在自己本地开发环境运行:要把程序部署到服务器、分享给其他用户使用、或者把自己写的工具给其他项目当依赖引用,总不能把一堆零散的.java源文件拷来拷去。
jar包是Java生态约定的通用交付格式,一个符合规范的jar包可以在任何装了对应版本JRE的设备上运行,不需要对方安装Maven、不需要对方和你有一样的目录结构,甚至不需要对方拿到你的源码。等你后续学会打包含所有依赖的fat jar(比如SpringBoot项目的可执行jar),只需要一行java -jar xxx.jar就能启动服务,部署和分发的效率极高。 - 统一项目结构降低协作成本
Maven约定的目录结构是全行业通用的,不管你进什么公司、参与什么开源Java项目,源码放哪、测试代码放哪、配置文件放哪的规则全是统一的,不需要每个项目都花时间熟悉自定义的目录结构,团队协作的时候沟通成本极低。
你可以做个小测试:在App.java里加一行用到Gson的代码,试试直接跑源码要花多少步骤才能跑通,再对比下在pom里加Gson依赖后直接执行mvn package的体验,就能立刻感受到差异。
内容的提问来源于stack exchange,提问作者ItDepends
相关产品推荐
相关产品推荐

