因为运维要求,最近项目中需要将部署规范化,涉及到了使用 Maven 的打包插件对项目进行重新规范化打包,这里对 Maven 的几个打包插件:maven-jar / dependency / assembly-plugin 做个总结和简记,方便日后用到时及时翻阅和回顾。
Java 包基本概念
-
普通 jar 包
都是作为类库,作为给其他工程提供依赖而打出的 jar 包,Maven 中 pom.xml 文件添加的 dependency 都算是普通的 jar 包。 -
可执行 jar 包
即 java -jar 命令就可运行的 jar 包,打包时需要设置入口类等信息。 -
war 包
Java Web应用包,包含所有程序类、配置文件、jsp、js等资源文件,放到 Tomcat 的 webapps 下启动 Tomcat 即可部署 web 服务。
Maven 打包的几种方式
默认情况下,使用 mvn package 只会把项目自身的 class 文件打成 jar 包,并不包括工程依赖的其他 jar ,而且打出的也是普通 jar ,往往就是给其他工程做引用而打的 Jar 包。如果想要打出一个可执行的 jar 包,就需要在 pom 中 <build> 标签下做打包插件配置,配置 maven-jar-plugin ,其配置如下:
maven-jar-plugin
<!-- Maven 打可执行 jar包 配置-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<!-- 指定启动主类(Main-Class)-->
<mainClass>com.com.chifuyong.TestDemo</mainClass>
<!-- 在 MANIFEST.MF 加上 Class-Path 项并配置依赖包 -->
<addClasspath>true</addClasspath>
<!-- 指定依赖包所在目录 -->
<classpathPrefix>dependencies/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
mainClass 可以设置主类,就是程序的入口类,java -jar 时就是以这个类为入口;addClasspath 表示增加工程所依赖 jar 包的 class-path 路径,设为 true ;classpathPrefix 就是工程依赖 jar class-path 的相对根路径,设为 dependencies ,执行 mvn package 打完包后的,解压 jar 包,其中 MANIFEST.MF 文件部分内容如下图:
TestDemo 入口类如下,调用了 DruidDataSource 这个类,依赖于 druid-1.0.9.jar 这个包
此时做这个配置时,虽然打包打出来的是可执行 jar ,但是并没有把工程所依赖的 jar 包都打进去,java -jar 运行这个 jar 时肯定会因找不到类而报 ClassNotFoundException ,如下:
这就需要配合 maven-dependency-plugin 的使用,来将工程所依赖的 jar 包复制到相应的目录,也就是上面 maven-jar-plugin 配置中的 classpathPrefix(dependencies),配置如下:
maven-dependency-plugin
<!-- 可执行jar 相关依赖目录存放配置 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- 依赖的jar包输出目录 -->
<outputDirectory>${project.build.directory}/dependencies</outputDirectory>
<!-- 排除 provide 范围-->
<!-- <excludeScope>provided</excludeScope>-->
<!-- 只包含 runtime -->
<includeScope>runtime</includeScope>
<useBaseVersion>true</useBaseVersion>
</configuration>
</execution>
</executions>
</plugin>
phase 设置为 package ,goal 设置为 copy-dependencies ,表示在 Maven 的生命周期 package 阶段,会执行 maven-dependency-plugin 插件的 copy-dependencies 功能,也就是当 Maven 执行到 package 时会把工程所依赖的 jar 包复制到某个目录,outputDirectory 设置的就是这个目录,excludeScope 就是排除相应的 scope,排除不需要打包的 scope,而 includeScope 则相反;mvn package 打完包后结果如下,${project.build.directory} 也就是 Maven(约定大于配置理念)约定好了的编译目录 target ,结构如下图:
这个时候只需要将 jar 包和 dependencies 目录(里面有工程所依赖的 jar 包)放在同个目录下,之后,之后不管放哪里,java -jar 都不会再报 找不到类,如下:
其他
具体的演示代码 GitHub 地址 > 点击这里
还要更强大的打包插件 maven-assembly-plugin,请看这里 > maven:assembly打包插件简记
网友评论