您的位置:

Maven-jar-plugin详解

一、基本介绍

Maven-jar-plugin是Maven自带的一个插件,它主要用于将项目打包成jar包,一般情况下,Maven执行package命令时就会默认调用该插件完成jar包生成的工作。

使用Maven-jar-plugin进行打包可以大大降低打包工作的难度和复杂度。使用该插件可以实现以下功能:

  • 生成标准格式的jar包;
  • 过滤构建输出文件;
  • 指定程序入口;
  • 指定manifest文件;
  • 设置jar包的依赖项,用于引用其他组件等等。

使用Maven-jar-plugin进行打包的代码示例:

  <build>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-jar-plugin</artifactId>
              <version>3.2.0</version>
              <configuration>
                  <finalName>jarName</finalName>
              </configuration>
          </plugin>
      </plugins>
  </build>

二、生成标准格式的jar包

Maven-jar-plugin默认以Maven项目的主代码目录作为jar包的源文件,将其打包成标准格式的jar包,该jar包可以直接部署到Maven的本地仓库或远程仓库。

若需要特定目录下的文件作为源文件,可以通过配置build元素下的resources或sourceDirectory元素来指定。

生成标准格式的jar包的代码示例:

  <build>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-jar-plugin</artifactId>
              <version>3.2.0</version>
              <configuration>
                  <finalName>jarName</finalName>
                  <archive>
                      <manifest>
                          <addClasspath>true</addClasspath>
                          <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                          <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                      </manifest>
                  </archive>
              </configuration>
          </plugin>
      </plugins>
  </build>

三、过滤构建输出文件

通过使用Maven-jar-plugin,我们可以方便地过滤掉某些不需要打包的文件或目录,使用<excludes>或<includes>指定要过滤的文件或目录,它们既可以用通配符匹配模式,也可以用正则表达式匹配模式。

例如,要过滤掉target目录下所有文件:

  <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.2.0</version>
      <configuration>
          <excludes>
              <exclude>target</exclude>
          </excludes>
      </configuration>
  </plugin>

四、指定程序入口

在打包过程中,Maven-jar-plugin可以通过mainClass参数指定程序的入口点,这样打包后的jar包可以直接从命令行运行,而不需要手动指定入口点。开发者按照下面的示例即可实现指定程序入口:

  <build>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-jar-plugin</artifactId>
              <version>3.2.0</version>
              <configuration>
                  <finalName>jarName</finalName>
                  <archive>
                      <manifest>
                          <addClasspath>true</addClasspath>
                          <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                          <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                          <mainClass>org.example.Main</mainClass>
                      </manifest>
                  </archive>
              </configuration>
          </plugin>
      </plugins>
  </build>

五、指定manifest文件

Maven-jar-plugin可以通过配置manifest元素来指定产生的jar包的manifest文件,manifest文件是一个文本文件,它定义了程序包的一些基本信息,例如程序入口、版本号、依赖库等。开发者可以按照以下示例代码来定义manifest文件:

  <build>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-jar-plugin</artifactId>
              <version>3.2.0</version>
              <configuration>
                  <finalName>jarName</finalName>
                  <archive>
                      <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
                  </archive>
              </configuration>
          </plugin>
      </plugins>
  </build>

六、设置jar包的依赖项

Maven-jar-plugin支持在打包过程中将依赖项打包到生成的jar包内。开发者可以在pom.xml中指定依赖项,然后使用<includes>元素将指定的依赖项打包到生成的jar包内。

  <build>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-jar-plugin</artifactId>
              <version>3.2.0</version>
              <configuration>
                  <finalName>jarName</finalName>
                  <archive>
                      <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
                      <manifest>
                          <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                      </manifest>
                      <manifestEntries>
                          <Class-Path>lib/dependency1.jar lib/dependency2.jar</Class-Path>
                      </manifestEntries>
                      <addClasspath>true</addClasspath>
                  </archive>
                  <includes>
                      <include>com.example.code:dependency1</include>
                      <include>com.example.code:dependency2</include>
                  </includes>
              </configuration>
          </plugin>
      </plugins>
  </build>