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