开头说
为了投产或升级,我需要提供分发包,我们常见的jar包是把class文件和META-INF打包成一起,war包是把class、jar、jsp、静态资源等打包成一起。如果我们在打包的时候想要加入更多的文件,或者想过滤掉特定的文件,就可以使用maven的assemble(打包)插件。本讲就来介绍打包插件。
打包插件
我们先来看一下这个Maven-assemble-plugin插件的pom配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <id>distribution-package</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <finalName>axis2-${project.version}</finalName> <filters> <filter>${basedir}/src/assembly/filter.properties</filter> </filters> <descriptors> <descriptor>src/main/assembly/war-assembly.xml</descriptor> <descriptor>src/main/assembly/src-assembly.xml</descriptor> <descriptor>src/main/assembly/bin-assembly.xml</descriptor> </descriptors> </configuration> </execution> </executions> </plugin>
通过这个pom,我们注意到以下几点:
- 这个插件不是在超级pom文件中,而是在项目的pom文件中。
- 注意到每个goal的配置标签configuration中,有两个关键的标签:filters、descriptors。
接下来我们先来介绍descriptors。
descriptors描述文件
每个descriptor 是一类组件的装配方式描述文件。通常是字节码一个配置,源码一个配置,doc说明文档一个配置。
<descriptors> <descriptor>src/assembly/bin.xml</descriptor> <descriptor>src/assembly/src.xml</descriptor> <descriptor>src/assembly/docs.xml</descriptor> </descriptors>
下面是一个descriptor文件 bin.xml 的龙骨:
<assembly> <id>bin</id> <formats> <format>zip</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <fileSets> <fileSet> <directory>target/tmp-repository</directory> <outputDirectory>repository</outputDirectory> <includes> <include></include> </includes> <excludes> <exclude></exclude> </excludes> </fileSet> </fileSets> <dependencySets> <dependencySet> <useProjectArtifact>false</useProjectArtifact> <outputDirectory>${pom.artifactId}-${pom.version}/repository/deployment/client/modules</outputDirectory> <outputFileNameMapping> ${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension} </outputFileNameMapping> <includes> <include>org.apache.rampart:rampart:mar</include> </includes> <unpack>true</unpack> <outputDirectory>webapp</outputDirectory> <unpackOptions> <includes> <include></include> </includes> <excludes> <exclude></exclude> </excludes> </unpackOptions> </dependencySet> </dependencySets> <files> <file> <source>../../README.txt</source> <outputDirectory>wso2is-${pom.version}</outputDirectory> <filtered>true</filtered> <fileMode>644</fileMode> </file> </files> </assembly>
先来对1级标签解释一下:
- id 生成打包的文件名是项目名 + “-” + id里面的内容,比如这里是 xxx-bin.xxx。
- formats 最终的文件名的后缀,可以是zip、tar、tar.gz、tar.bz2、jar、dir、war。如果配置了多个format,则额外生成对应格式的文件。比如配置zip和jar,就会生成xxx.zip和xxx.jar。
- includeBaseDirectory 这个默认是true,但是没有一个额外的baseDirectory一级标签的话,就会在当前目录下创建最终的打包文件。如果baseDirectory有值,就在当前目录下再创建一个根目录,在目录下生成文件。一般这个设置false。
- fileSets 指定一组文件的集合,其实就是一个父路径下的文件。
- files 指定个别单独的一个文件。
- dependencySets 引入的其它的项目,这个通常是一个jar包。
再说一下includes和excludes。
- includes 这个缺省时,就包含指定父目录下的所有文件。配置具体值时,就包含指定文件。这个值可以是路径,也可以是具体文件,可以使用通配符。如**/*abc.*,表示任意路径下(指定的父路径下)的任意后缀且以abc结尾的文件。
- excludes 用于排除特殊的文件
再对fileSet里面标签说明。
- directory 源文件的路径,源文件就是要参与打包的文件。
- outputDirectory 最终压缩包中的路径。这两个标签结合就是把项目底下的某个路径下的文件打包放到压缩包的指定路径下。
再说一下file里面的标签。
- source 源文件
- fileMode 定义拷贝后文件的访问权限
最复杂的是dependencySet。
- useProjectArtifact 是否把本项目的构建产生的jar(或其它格式)文件放到最终的发布文件中。
- include 这里的include需要重新说明一下,这里的格式是groupdId:artifactId:type[:classifier]
[:version] 定位具体的jar等文件。注意这个没有baseDirectory约束,寻找的文件是从Maven仓库寻找的。 - unpack 引入的jar等依赖会解压到最终的outputDirectory目录下,unpackOptions用于过滤解压生成的文件。
filters配置
也许有人会问,前面我们通过includes、excludes 标签已经实现了对文件过滤,这里怎么又有一个filters?其实这个只是一个属性配置文件。
<filters> <filter>${basedir}/src/assembly/filter.properties</filter> </filters>
里面的内容:
product.name=WSO2 Identity Server product.key=IS product.version=5.0.0 hotdeployment=true hotupdate=true default.server.role=IdentityServer
这些配置就是一些全局变量,会替换scripotrs文件的占位符。
打包实践:可执行Maven项目
以上,我们对打包插件的标签已经做了相当详细的介绍,下面就让我们开始动手,用这个插件构建一个全流程的小项目,项目的源码来源于这里。
整个项目的目录如下:
为节省篇幅(偷懒),不再一一粘代码了,对主要的文件功能进行说明:
- JSONParser.java 功能是在控制台输入json文件名,将文件中json输出到控制台,so easy!
- json-parser/pom.xml 是引入需要的google的simple-json依赖包
- distribution/pom.xml 对assemble插件进行定义,如果仔细看这个文件,还重写了maven-jar-plugin,为了指定main方法入口类以及指定依赖jar,对MANIFEST.MF可参考这里。
- dist.xml 打包描述文件。因定义Format为zip,所以最终的结果为json-parser-bin.zip。
- 最顶层的pom.xml,定义各项目模块。
<!-- distribution/pom.xml 的片段--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.3.1</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.packt.json.JSONParser</mainClass> </manifest> </archive> </configuration> </plugin>
在项目顶级的pom同目录,执行mvn clean install后,可以看到 distribution/target/ 目录输出。
解压这个zip文件,执行。
java -jar json-parser-dist-1.0.0.jar myjsonfile.json
–输出
{“publisher”:“PACKT”,“bookName”:“Mastering Maven”}
总结
本讲介绍了Maven的打包插件,详细讲了打包描述文件的具体配置,最后通过一个简单的例子,加以实战。其实assemble插件有8个goal,推荐用的是single,还有一个help是帮助插件。剩下的6个不推荐使用了,具体参考这里。
今天的文章
maven-assembly_maven命令详解分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/60585.html