需求:
这个问题一度困扰了我好几个小时,我一开始使用maven-assembly-plugin构建tar分发包的时候,发现每次最终打包,都会在最外层有个包装层,比如我要构建的tar分发包的artifactId为abc ,那么最终打包完的tar文件总是内含abc目录,然后才是其他子目录sub1,sub2。而我们所希望的是当untar时候,能够直接出来的是子目录(sub1,sub2),而不是abc目录+abc目录里的子目录(/abc/sub1,/abc/sub2)的形式。
解决方案:
其实只要在assembly.xml中加上<includeBaseDirectory>元素,并且让其设为false就可以了,如下:
<assembly> <id>tarball</id> <formats> <format>tar</format> </formats> <!--fixed the wrapper folder issue--> <includeBaseDirectory>false</includeBaseDirectory> <fileSets> ...
关于这个参数的含义,可以参见maven-assembly-plugin的官网:
http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html
深入分析:
为什么这样可以呢,我们可以对maven-assembly-plugin的源代码进行研究。
首先,当我们在pom.xml中使用maven-assembly-plugin并且在<descriptor>中配置了assembly.xml文件的位置时候:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.2.1</version> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptors> <descriptor>src/main/assembly/assembly.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> ..... </plugins> </build>
插件会去调用DefaultAssemblyReader的readAssemblies()方法,然后调用如下代码进行遍历<descriptors>元素:
for ( int i = 0; i < descriptors.length; i++ ) { getLogger().info( "Reading assembly descriptor: " + descriptors[i] ); addAssemblyFromDescriptor( descriptors[i], locator, configSource, assemblies ); } }
我们继续跟进到addAssemblyFromDescriptor方法,可以看出它其实是用来读取一个asssembly descriptor文件(也就是我们例子中的assembly.xml),忽略参数检查,它其实核心代码如下:
private Assembly addAssemblyFromDescriptor( final String spec, final Locator locator, final AssemblerConfigurationSource configSource, final List<Assembly> assemblies ) throws AssemblyReadException, InvalidAssemblerConfigurationException { ... Reader r = null; try { // TODO use ReaderFactory.newXmlReader() when plexus-utils is upgraded to 1.4.5+ r = new InputStreamReader( location.getInputStream(), "UTF-8" ); File dir = null; if ( location.getFile() != null ) { dir = location.getFile().getParentFile(); } final Assembly assembly = readAssembly( r, spec, dir, configSource ); assemblies.add( assembly ); return assembly; } ... }
所以这里可以看出,它最终在11行新建InputStreamReader,并在第19行读取assembly descriptor文件,最终读取的结果存储在Assembly对象模型中,而Assembly这个模型是有includeBaseDirectory这个成员变量的:
/** * Set includes a base directory in the final archive. For * example, * if you are creating an assembly named * "your-app", setting * includeBaseDirectory to true will create an * archive that * includes this base directory. If this option is * set to false * the archive created will unzip its content to * the current * directory. Default value is true. * * @param includeBaseDirectory */ public void setIncludeBaseDirectory( boolean includeBaseDirectory ) { this.includeBaseDirectory = includeBaseDirectory; } //-- void setIncludeBaseDirectory( boolean )
以上是解析assembly descriptor并且设置了includeBaseDirectory,现在我们来看下如何使用这个属性。很显然,在不看代码之前,我们很容易猜想到,它肯定影响了最终打包的行为,正如我们所期望的一样。
相关推荐
`maven-assembly-plugin`是Maven的一个插件,用于生成项目的归档文件,如tar.gz或zip,这在分发和部署软件时非常有用。本篇将详细介绍如何利用`maven-assembly-plugin`在Spring Boot项目中实现这个功能。 首先,`...
maven-assembly-plugin-2.2-beta-5.jar
Maven-assembly-plugin是maven中针对打包任务而提供的标准插件,可以实现自定义打包。主要提供如下功能: ● 提供一个把工程依赖元素、模块、网站文档等其他文件存放到单个归档文件里。 ● 打包成指定格式分发包,...
exec-maven-plugin是Maven生态系统中的一个插件,它允许用户在Maven构建过程中执行外部命令或脚本。这使得Maven项目可以集成更多的自定义操作,比如运行特定的脚本、调用系统命令等。本文将详细介绍exec-maven-...
java运行依赖jar包
java运行依赖jar包
Maven3种打包方式中maven-assembly-plugin的使用详解 Maven 作为一个流行的项目管理工具,提供了多种方式来打包项目。其中,maven-assembly-plugin 是一个非常强大和灵活的插件,支持自定义的打包结构,并且可以...
`maven-compiler-plugin-3.8.0-source-release` 是 Maven 生态系统中不可或缺的一部分,它提供了可靠的源代码编译功能,使得开发者能够专注于编写代码,而无需关心构建过程的细节。通过理解 Maven 插件的工作原理和...
Maven 使用 tomcat8-maven-plugin 插件 Maven 是一个流行的构建自动化工具,它可以帮助开发者自动完成项目的编译、测试、打包、部署等任务。 Tomcat 是一个流行的 Web 服务器,Maven 提供了一个插件 tomcat8-maven-...
maven-jar-plugin-3.1.1.jar
maven-assembly-plugin-2.2-beta-5.jar maven-bundle-plugin-1.0.0.jar maven-clean-plugin-2.4.1.jar maven-clean-plugin-2.5.jar maven-common-artifact-filters-1.3.jar maven-compat-3.2.1-sources.jar maven-...
本文将详细讨论如何将Jetty与Maven进行集成,并介绍关键的`maven-jetty-plugin`插件及其不同版本。 1. Maven与Jetty集成的意义: Maven通过其强大的依赖管理功能,使得项目构建变得简单和规范。而Jetty作为轻量级...
maven是个项目管理工具,如果我们不告诉它我们的代码要使用什么样的jdk版本编译的话,它就会用maven-compiler-plugin默认的jdk版本来进行处理,这样就容易出现版本不匹配,以至于可能导致编译不通过的问题。...
`maven-db-plugin` 插件有两个版本,即 `1.3` 和 `1.4`,这两个版本的 JAR 文件在压缩包中分别以 `maven-db-plugin-1.4.jar` 和 `maven-db-plugin-1.3.jar` 的形式存在。这些 JAR 文件包含了插件所需的全部类和资源...
maven-antrun-plugin-3.0.0.jar
maven-clean-plugin-3.1.0.jar
<artifactId>maven-shade-plugin <version>3.1.0 <phase>package <goal>shade implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring....
maven-surefire-plugin-2.22.1.jar
maven-install-plugin-2.4.jar