maven三种打包方式maven-jar-plugin、maven-assembly-plugin、maven-shade-plugin

阅读数:200 评论数:0

跳转到新版页面

分类

应用软件

正文

一、概述

在maven中, 主要有三个插件可以用来打包:

1、maven-jar-plugin

默认的打包插件,用来打包普通的project JAR包。

2、maven-shade-plugin

用来打包可执行jar包,也就是所谓的fat jar包。

3、maven-assembly-plugin

支持自定义的打包结构,也可以定制依赖等。

Maven插件列表:https://maven.apache.org/plugins/index.html;

二、maven-jar-plugin

maven-jar-plugin这个插件通常用于将maven工程打成jar包,该插件绑定到package生命周期阶段。

1、生成可执行jar包。

<plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>                         <!--是否要把第三方jar放到manifest的classpath中-->
                        <addClasspath>true</addClasspath>                         <!--生成的manifest中classpath的前缀,                          因为要把第三方jar放到lib目录下,                         所以classpath的前缀是lib/-->
                        <classpathPrefix>lib/</classpathPrefix>                          <!-- 执行的主程序路径 -->
                        <mainClass>com.example.demo.test.App</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

这样打包出来的路径结构:

2、一级配置

classesDirectory 包含应打包到jar中的类和资源文件的目录,默认值是${project.build.outputDirectory}
outputDirectory 指定生成jar的目录,默认值是${project.build.directory}
archive 使用的打包配置
includes 要包含的文件列表
exclude 要排除的文件序列
forceCreation 要求放插件构建一个新的jar包,即使内容没有任何变化

3、archive配置

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <!-- 创建的归档文件是否包含以下pom.xml 和pom.properties Maven 文件,默认是true -->
                        <addMavenDescriptor/>
                        <!-- 是否对存档进行压缩。默认值为 true -->
                        <compress/>
                        <!-- 是否强制重新创建存档。
                            将此选项设置为 false(默认值为 true)意味着将所包含文件的时间戳与目标存档的时间戳进行比较,并重建存档,
                            前提是后者的时间戳小于前者的时间戳。检查时间戳通常会带来性能提升
                            (特别是,如果构建中的以下步骤被抑制,如果没有重新创建归档文件),
                            代价是您会不时得到不准确的结果。特别是,不会检测到源文件的删除。
                            归档程序不一定支持检查最新版本。如果是这样,将此选项设置为 true 将被忽略。-->
                        <forced/>
                        <!-- 创建的存档文件是否包含 INDEX.LIST 文件。默认值为 false -->
                        <index/>
                        <!--  使用此选项覆盖自动创建的 pom.properties 文件(仅当 addMavenDescriptor 设置为 true 时) -->
                        <pomPropertiesFile/>
                        <!-- 提供自己的清单文件 -->
                        <manifestFile/>
                        <!--                        -->
                        <manifest>
                            <!-- 是否创建 Class-Path 清单条目。默认值为 false-->
                            <addClasspath/>
                            <!-- 如果为true,清单将包含以下条目:
                                Created-By: Maven Archiver ${maven-archiver.version}
                                Build-Jdk-Spec: ${java.specification.version}
                             -->
                            <addDefaultEntries/>
                            <!-- 如果为true,清单将包含以下条目:
                                Implementation-Title: ${project.name}
                                Implementation-Version: ${project.version}
                                Implementation-Vendor: ${project.organization.name}
                            -->
                            <addDefaultImplementationEntries/>
                            <!-- 如果为true,清单将包含以下条目:
                                Specification-Title: ${project.name}
                                Specification-Version: ${project.artifact.selectedVersion.majorVersion}.${project.artifact.selectedVersion.minorVersion}
                                Specification-Vendor: ${project.organization.name}
                            -->
                            <addDefaultSpecificationEntries/>
                            <!-- 如果为true,清单将包含以下条目:
                                Build-Tool: ${maven.build.version}
                                Build-Jdk: ${java.version} (${java.vendor})
                                Build-Os:  ${os.name} (${os.version}; (${os.arch})
                            -->
                            <addBuildEnvironmentEntries/>
                            <!-- 是否创建 Extension-List 清单条目。默认值为 false -->
                            <addExtensions/>
                            <!-- 在所创建的 Class-Path 中格式化条目时要使用的布局类型。
                                有效值包括:simple、repository(与Maven类路径布局相同)和 custom。
                                注意:如果指定 custom 的类型,还必须设置 customClasspathLayout。默认值为 simple
                            -->
                            <classpathLayoutType/>
                            <!-- 将作为所有 Class-Path 项前缀的文本。默认值为空字符串 “”-->
                            <classpathPrefix/>
                            <!-- 在 classpathLayoutType 中设置的布局类型值为 custom 时使用的布局表达式。表达式将根据类路径相关对象的以下有序列表进行计算:
                                当前 Artifact 实例(如果存在)。
                                来自上述 Artifact 的当前 ArtifactHandler 实例。
                                注意:如果指定 custom 布局类型,则必须设置该布局表达式
                            -->
                            <customClasspathLayout/>
                            <!-- Main-Class 清单项-->
                            <mainClass/>
                            <!-- 名为 Package 清单条目-->
                            <packageName/>
                            <!-- 是否使用唯一的时间戳快照版本而不是 -SNAPSHOT。默认值为 true-->
                            <useUniqueVersions/>
                        </manifest>
                        <!-- 要添加到清单的键/值对的列表 -->
                        <manifestEntries>
                            <key>value</key>
                        </manifestEntries>
                        <manifestSections>
                            <manifestSection>
                                <!-- 节的名称-->
                                <name/>
                                <!-- 要添加到清单的键/值对的列表。java.util.Map 类型-->
                                <manifestEntries>
                                    <key>value</key>
                                </manifestEntries>
                            </manifestSection>
                        </manifestSections>
                    </archive>
                </configuration>
</plugin>

三、maven-assembly-plugin

打包生成的的普通jar包,只包含该工程下源码编译结果,不包含依赖内容,所以还需要使用maven-assembly-plugin来二次组装,

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals> // 该打包任务只运行一次
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                 <descriptors>  
                        <descriptor>assembly.xml</descriptor>   //和 pom.xml 同级目录下
                     </descriptors>
                    <outputDirectory>output</outputDirectory>    //和 pom.xml同级目录下,assembly 组装出来的包会被放置在output目录下
            </configuration>
        </plugin>

assembly.xml内容如下:

<?xml version='1.0' encoding='UTF-8'?> 
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
    <id>consul-consumer-demo</id>
    <formats> 
        <format>zip</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <fileSets> 
        <fileSet> 
            <directory>${project.build.directory}</directory> //${project.build.directory} 指 target目录
            <outputDirectory>/</outputDirectory>   //表示输出到 pom 中配置的 output目录下
            <includes>
               <include>consul-product.jar</include>
            </includes>
        </fileSet> 
        <fileSet> 
            <directory>${project.build.directory}/classes</directory> 
            <outputDirectory>/config</outputDirectory>   //表示输出到 pom 中配置的 output/config 目录下
           <includes>
               <include>application.properties</include>
            </includes> 
        </fileSet> 
        <fileSet> 
            <directory>${project.basedir}</directory> //${project.basedir} 指 工程根目录
            <outputDirectory>/</outputDirectory> 
            <includes>
               <include>script/*.*</include>
            </includes> 
        </fileSet>
    </fileSets> 
</assembly>

在不指定jar包名称的时候,通常的jar包名称是:artifactId-version.jar。要自定义jar包名称,可以直接在pom.xml中build结点下设置finalName,如:

<build>
      <finalName>p-test-tool</finalName>
</build>

 




相关推荐

Nexus是maven仓库管理器,可以使用它在本地架构一个maven仓库服务器。 https://help.sonatype.com/en/download.html 可能需要借助梯子。 一、修改启

目的 在你的maven项目中创建一个Docker镜像。比方说,build过程可以为java服务输出一个可以运行该服务的Docker镜像。 步骤 有两种配置方式,一种是通过Dockerfile文件,一种

&lt;mirror&gt; &lt;id&gt;alimaven&lt;/id&gt; &lt;name&gt;

Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息,那么所有<stron

在pom.xml中使用distributionManagement将项目打包上传到nexus私服(maven的一种远程私有仓库)。 <pre class="language-markup

一、概述 repositories配置jar仓库,pluginRepositories配置插件仓库。 二、通过项目pom.xml配置 <repositories> <repository>

dependencyManagement 只是声明依赖,并不实际引入,只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目继承该项。 denpende

一、前置知识 1、settings.xml中的proxy、server、repository、mirror proxy 是服务器不能直接访问外网时需要设置的代理服务。 server 是服务器

在Maven的pom.xml文件中,存在如下两种build &lt;project&gt; &lt;buil

在构建Maven项目的时候,如果没有进行特殊配置,Maven会按照 标准的目录结构查找和处理各种类型文件。 src/main/java和src/test/java <p