Maven库
方便我们搜索Jar包
https://developer.aliyun.com/mvn/search
Maven仓库
1 | <repositories> |
Maven打包流程
构建项目的几个环节
- 清理(clean):删除以前的编译结果,为重新编译做好准备。
- 编译(compile):将Java 源程序编译为字节码文件。
- 测试(test):针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
- 打包(package):将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web工程对应 war 包。
- 安装(install):在 Maven 环境下特指将打包的结果(jar包或war包)安装到本地仓库中。
- 部署(deploy):将打包的结果部署到远程仓库或将 war 包部署到服务器上运行。
打包区别
mvn package
:打包到本项目,一般在项目target目录下。mvn install
:打包到本地仓库,如果没设置Maven本地仓库,一般在用户/.m2
目录下。mvn deploy
:打包上传到远程仓库,如:私服nexus等,需要配置pom文件。
打包过程
清理并打包
1 | mvn clean package |
依次执行:clean、resources、compile、testResources、testCompile、test、jar(打包)。
清理、打包并安装到本地Maven中
1 | mvn clean install |
依次执行:clean、resources、compile、testResources、testCompile、test、jar(打包)、install。
清理、打包并安装到本地和远程Maven中
1 | mvn clean deploy |
依次执行:clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy。
由上面分析主要区别如下:
- package命令:完成项目编译、单元测试、打包功能,但打包文件未部署到本地Maven仓库和远程Maven仓库。
- install命令:完成项目编译、单元测试、打包功能,同时把打包文件部署到本地Maven仓库,但未部署到远程Maven仓库。
- deploy命令:完成项目编译、单元测试、打包功能,同时把打包文件部署到本地Maven仓库和远程Maven仓库。
Maven常用命令
导出依赖jar
https://maven.apache.org/plugins/maven-dependency-plugin/copy-dependencies-mojo.html
导出指定范围
1 | mvn dependency:copy-dependencies -DincludeScope=compile |
排除指定范围
1 | mvn dependency:copy-dependencies -DexcludeScope=provided |
以下写法是不生效的,不能同时使用-DincludeScope
和-DexcludeScope
1 | mvn dependency:copy-dependencies -DincludeScope=compile -DexcludeScope=provided |
默认会将jar包放在项目中的target下的dependency
目录下面
清理
1 | mvn clean |
Maven中添加本地jar
安装
1 | mvn install:install-file -Dfile="D:\Tools\BigData\datax\lib\datax-core-0.0.1-SNAPSHOT.jar" -DgroupId="com.datax" -DartifactId="datax-core" -Dversion="0.0.1" -Dpackaging=jar |
卸载
1 | mvn dependency:purge-local-repository -DmanualInclude="com.datax:datax-core" |
打Jar包插件
maven提供的打包插件有如下三种:
plugin | function |
---|---|
maven-jar-plugin | 可执行jar与依赖包是分开,需建立lib目录里来存放需要的j依赖包,且需要jar和lib目录在同级目录, 这也是默认打包方式 |
maven-assembly-plugin | 支持定制化打包方式,例如 apache 项目的打包方式 每种打包方式都具有自己的应用场景。 |
maven-shade-plugin | 用来打可执行包,可替换包名。 |
maven-jar-plugin
可执行jar与依赖包是分开,需建立lib目录里来存放需要的j依赖包,且需要jar和lib目录在同级目录, 这也是默认打包方式,所以打common包不写插件也能打包
maven-assembly-plugin
这个插件可以把所有的依赖包打入到可执行jar包。需要在pom文件的plugin元素中引入才可以使用,功能非常强大,是maven中针对打包任务而提供的标准插件。它是Maven最强大的打包插件,它支持各种打包文件格式,包括zip、tar.gz、tar.bz2等等,通过一个打包描述文件设置(src/main/assembly.xml),它能够帮助用户选择具体打包哪些资源文件集合、依赖、模块,甚至本地仓库文件,每个项的具体打包路径用户也能自由控制。
但是该插件有个bug会缺失spring的xds文件,导致无法运行jar,同时如果同级目录还有其它可执行jar文件依赖可能会产生冲突。
使用Maven的package
命令打包项目;
打包完成后, 即可在项目的target
目录下看到生成的jar包, 其中xxx-jar-with-dependencies.jar
是包含依赖jar包的jar文件, 另一个不包含依赖jar包;
使用java -jar xxxx.jar
命令即可运行此jar包.
1 | <build> |
maven-shade-plugin
需要在pom文件的plugin元素中引入才可以使用,它可以让用户配置Main-Class的值,然后在打包的时候将值填入/META-INF/MANIFEST.MF文件。关于项目的依赖,它很聪明地将依赖的JAR文件全部解压后,再将得到的.class文件连同当前项目的.class文件一起合并到最终的CLI包(可以直接运行的jar包)中,这样,在执行CLI JAR文件的时候,所有需要的类就都在Classpath中了。(springboot打包插件用的就是这个)
单个可执行Jar
1 | <build> |
解决Jar冲突
这是解决Jar冲突,作为其他项目的依赖jar
1 | <plugin> |
如何选用
如果在开发一个库,直接使用默认的
maven-jar-plugin
插件即可;如果是开发一个库或应用程序,需要替换包名解决包冲突,可以考虑使用
maven-shade-plugin
进行打包生成Uber jar
- 如果是开发一个应用程序,并且依赖项目下的Jar,那么推荐使用
maven-assembly-plugin
插件来自定义打包内容。
- 如果是开发一个应用程序,并且依赖项目下的Jar,那么推荐使用
概念
FatJar 又称作 uber-Jar,是包含所有依赖的 Jar 包。
maven-war-plugin
war项目默认的打包工具,默认情况下会打包项目编译生成的.class文件、资源文件以及项目依赖的所有jar包。
1 | <plugin> |
maven-source-plugin
用来打源代码包的, 就像spring写的包,我们要下源代码来看注释,我们自己写的包有时也需要打出源码包给别人用,打完只有就会有一个-sources后缀的包
1 | <plugin> |
springboot打包插件
spring-boot-maven-plugin插件在Maven中提供了对Spring Boot的支持,可以帮助我们打包出可执行的jar包或者war包。
其实spring-boot-maven-plugin所做的工作是在默认的maven-jar-plugin插件打包结束后,将项目依赖的jar包中的.class文件重新进行打包。
Tomcat
1 | <plugin> |
编译
1 | <plugin> |