maven插件maven-jar-plugin构建jar文件的详细使用

 更新时间:2024年02月20日 09:08:25   作者:老码龙  
maven-jar-plugin插件时maven中最常用的插件,也是maven构建Java程序执行包或者依赖包的默认插件,本文主要介绍了maven插件maven-jar-plugin构建jar文件的详细使用,具有一定的参考价值,感兴趣的可以了解一下

前言

maven-jar-plugin插件时maven中最常用的插件,也是maven构建Java程序执行包或者依赖包的默认插件,大部分情况下我们不需要对其进行配置,但在特殊情况下,我们可以通过配置来定制我们的jar包。

一、使用方式

大部分情况下,我们的配置如下:

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<version>2.4</version>
</plugin>

而且这里的版本号是可选的,如果不配置版本号,maven会自动去寻找最新的版本。

二、常用配置详解

1.classesDirectory

这个表示class文件的目录,默认值是:${project.build.outputDirectory}也就是target目录下的class目录,当然我们也可以指定其他目录。

2.outputDirectory

表示jar文件的输出目录,默认值是:${project.build.directory},就是target目录,生成的jar文件就输出到这里。

3.excludes

表示jar文件打包时,需要排除哪些文件,比如我们在开发时有个dev.properties文件,打包时我们就不需要了,可以这样配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <excludes>
            <exclude>conf/**</exclude>
            <exclude>bin/**</exclude>
            <exclude>cache/**</exclude>
            <exclude>attachment/**</exclude>
            <exclude>dev.properties</exclude>
        </excludes>
    </configuration>
</plugin>

这里我们排除了部分文件夹和开发时用到的文件,在打包时不加入到jar文件中。

4.includes

这个与excludes相反,就是把需要的文件在打包时加入到jar文件中,具体配置可以参照excludes的配置。

5.archive

这个属性配置很多,主要是用于定制化我们的jar包结构以及对Manifest文件的定制化。下面我们用几个实例来演示。

添加Implementation和Specification属性

默认情况下面Manifest文件结构如下:

Manifest-Version: 1.0
Created-By: Apache Maven ${maven.version}
Build-Jdk: ${java.version}

我们可配置下面属性:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.4</version>
  <configuration>
    <archive>
      <manifest>
        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
        <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
      </manifest>
    </archive>
  </configuration>
</plugin>

这样生成的Manifest如下:

Manifest-Version: 1.0
Created-By: Apache Maven ${maven.version}
Build-Jdk: ${java.version}
Specification-Title: ${project.name}
Specification-Version: ${project.artifact.selectedVersion.majorVersion}.${project.artifact.selectedVersion.minorVersion}
Specification-Vendor: ${project.organization.name}
Implementation-Title: ${project.name}
Implementation-Version: ${project.version}
Implementation-Vendor: ${project.organization.name}

添加manifestEntries

这个属性可以添加一下项目信息到jar文件中。常用配置如下:

<configuration>
  <archive>
    <manifestEntries>
      <mode>prod</mode>
      <url>${project.url}</url>
    </manifestEntries>
  </archive>
</configuration>

生成的Manifest如下:

Manifest-Version: 1.0
Created-By: Apache Maven ${maven.version}
Build-Jdk: ${java.version}
mode: prod
url: http://project.url.com

添加键值对属性Manifest Sections

这个功能可以添加多个键值属性,配置如下:

<archive>
    <manifestSections>
        <manifestSection>
            <name>value1</name>
            <manifestEntries>
                <id>key1</id>
            </manifestEntries>
        </manifestSection>
        <manifestSection>
            <name>value2</name>
            <manifestEntries>
                <id>key2</id>
            </manifestEntries>
        </manifestSection>
    </manifestSections>
</archive>

结果如下:

Manifest-Version: 1.0
Created-By: Apache Maven ${maven.version}
Build-Jdk: ${java.version}
 
Name: value1
id: key1
 
Name: value2
id: key2

自定义manifest配置

可以根据下面的配置来定制化manifest文件的加载机制:

设置一个可执行的jar文件

我们可以发布一个可执行的jar文件,就是可以通过命令行来启动一个jar。也可以把一个jar文件当做依赖库,提供给其他项目来使用。如果要发布一个可执行的jar,配置如下:

<configuration>
  <archive>
    <manifest>
      <mainClass>com.test.Main</mainClass>
    </manifest>
  </archive>
</configuration>

这里com.test.Main必须要有一个main方法

精确设置Classpath

就是将所有的jar文件全部枚举出来,配置如下:

<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.1</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.11.0</version>
    </dependency>
  </dependencies>
</project>

Manifest生成结果如下:

Manifest-Version: 1.0
Created-By: Apache Maven ${maven.version}
Build-Jdk: ${java.version}
Class-Path: commons-io-2.11.0.jar commons-lang-2.1.jar

注意这样运行这个jar文件时,需要保证Class-Path的依赖jar在目录中保持平级。

根据目录设置classpath

这里需要用到属性classpathPrefix,配置如下:

<configuration>
  <archive>
    <manifest>
      <addClasspath>true</addClasspath>
      <classpathPrefix>lib/</classpathPrefix>
    </manifest>
  </archive>
</configuration>

Manifest生成结果如下:

Class-Path: lib/commons-io-2.11.0.jar lib/commons-lang-2.1.jar

注意这样运行这个jar文件时,需要保证lib目录和执行jar保持平级。

配置classpath的加载样式

加载样式意思是可以通过特定的配置来配置classpath的路径,配置属性是:classpathLayoutType

自定义加载样式classpathLayoutType=custom

配置如下:

<configuration>
  <archive>
    <manifest>
      <addClasspath>true</addClasspath>
      <classpathLayoutType>custom</classpathLayoutType>
      <customClasspathLayout>lib/$${artifact.groupIdPath}/$${artifact.artifactId}-$${artifact.version}$${dashClassifier?}.$${artifact.extension}</customClasspathLayout>
    </manifest>
  </archive>
</configuration>

接入如下:

Class-Path: lib/commons-io/commons-io-2.11.0.jar lib/commons-lang/commons-lang-2.1.jar

maven风格加载样式classpathLayoutType=repository

我们也可以设置maven风格的加载样式,如果目标机器上有maven库,我们可以这样设置:

<configuration>
  <archive>
    <manifest>
      <addClasspath>true</addClasspath>
      <classpathPrefix>${user.home}/.m2/repository</classpathPrefix>
      <classpathLayoutType>repository</classpathLayoutType>
    </manifest>
  </archive>
</configuration>

结果如下:

Class-Path: ${user.home}/.m2/repository/commons-io/commons-io-2.11.0.jar ${user.home}/.m2/repository/commons-lang/commons-lang/2.1/commons-lang-2.1.jar

这里的${user.home}会替换成你电脑上的绝对路径

强制使用SNAPSHOT版本的依赖

有时我们依赖的jar包可能是SNAPSHOT版本的,默认情况SNAPSHOT版本的库文件是不会被加载的,这里可以使用useUniqueVersions来启用,配置如下:

<configuration>
  <archive>
    <manifest>
      <useUniqueVersions>false</useUniqueVersions>
    </manifest>
  </archive>
</configuration>

这样SNAPSHOT版本的jar依赖也会被加载。

加载外部的manifest文件

我们也可以将manifest编写好,然后直接使用我们自己编写的文件,配置如下:

<configuration>
  <archive>
    <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
  </archive>
</configuration>

这里就直接加载我们自己编写的MANIFEST文件。

总结

与maven-jar-plugin相同的还有一个maven-war-plugin插件,用于将我们的程序打包成war格式的执行包,也是maven默认的打包工具。这个主要用于web项目。它的用法和maven-jar-plugin完全一样,大家可以参照上面的使用。

到此这篇关于maven插件maven-jar-plugin构建jar文件的详细使用的文章就介绍到这了,更多相关maven-jar-plugin构建jar文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java日常练习题,每天进步一点点(62)

    Java日常练习题,每天进步一点点(62)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-08-08
  • 详解在Java中如何优雅的停止线程

    详解在Java中如何优雅的停止线程

    线程,作为并发编程的基础单元,允许程序同时执行多个任务,在Java中,线程可以理解为程序中的独立执行路径,通过使用线程,开发者可以创建更加响应灵敏、效率更高的应用程序,本文小编将给大家介绍一下Java中如何优雅的停止线程,需要的朋友可以参考下
    2023-11-11
  • SpringBoot定义过滤器、监听器、拦截器的方法

    SpringBoot定义过滤器、监听器、拦截器的方法

    本篇文章主要介绍了SpringBoot定义过滤器、监听器、拦截器的方法,具有一定的参考价值,有兴趣的可以了解一下。
    2017-04-04
  • JAVA中简单的for循环异常踩坑

    JAVA中简单的for循环异常踩坑

    这篇文章主要为大家介绍了JAVA中简单的for循环异常踩坑避雷详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Spring AOP对嵌套方法不起作用的解决

    Spring AOP对嵌套方法不起作用的解决

    这篇文章主要介绍了Spring AOP对嵌套方法不起作用的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • RestTemplate发送HTTP POST请求使用方法详解

    RestTemplate发送HTTP POST请求使用方法详解

    这篇文章主要为大家介绍了RestTemplate发送HTTP POST请求的使用方法详解,有需要的朋友可以借鉴参考下希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 使用ftpClient下载ftp上所有文件解析

    使用ftpClient下载ftp上所有文件解析

    最近项目需要写个小功能,需求就是实时下载ftp指定文件夹下的所有文件(包括子目录)到本地文件夹中,保留文件到目录路径不变。今天小编给大家分享使用ftpClient下载ftp上所有文件的方法,需要的的朋友参考下吧
    2017-04-04
  • 详解java并发编程(2) --Synchronized与Volatile区别

    详解java并发编程(2) --Synchronized与Volatile区别

    这篇文章主要介绍了Synchronized与Volatile区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性代码示例

    java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性代码示例

    在Java开发中我们处理JSON数据时经常会遇到空值(null)的情况,这篇文章主要给大家介绍了关于java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • SpringBoot使用ExceptionHandler做异常处理

    SpringBoot使用ExceptionHandler做异常处理

    这篇文章主要介绍了SpringBoot使用ExceptionHandler做异常处理,这篇文章通过多种方法案例来介绍该项技术的使用,需要的朋友可以参考下
    2021-06-06

最新评论