首页 > 其他分享 >如何使用Maven将项目中的依赖打进jar包

如何使用Maven将项目中的依赖打进jar包

时间:2024-09-17 19:01:37浏览次数:10  
标签:打进 maven plugin jar Maven 源码 shade javassist

需求

有时候写一些库,需要其它三方依赖,但是又不想这个依赖影响到使用方,可以将这些三方依赖打到自己的项目jar包,并且更换包名,避免冲突(更换包名之后,项目中的类引用第三方依赖的类import语句也会跟着变化)。如Mybatis就使用了Ognl库,在打包时把Ognl的所有类都打到了Mybatis自己的jar中。

实现

实现的目标主要为两点

  • 核心目标:将所需依赖打进自己的项目jar包
  • 次要目标:将所需依赖的源码也同步打进自己项目的源码中,方便用户浏览源码。

要实现这两个需求需要使用到maven-source-pluginmaven-jar-pluginmaven-shade-plugin

例子如下:

项目依赖javassist库,需要把javassist库打进自己项目jar包中,pom配置如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.wangtao</groupId>
  <artifactId>enhanced-thread-local</artifactId>
  <version>1.0.0</version>

  <properties>
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <!-- 三方依赖 -->
    <dependency>
      <groupId>org.javassist</groupId>
      <artifactId>javassist</artifactId>
      <version>3.30.2-GA</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>3.3.1</version>
        <executions>
          <execution>
            <id>attach-sources</id>
            <!-- 必须绑定到package阶段, 因为shade插件也是package阶段执行 -->
            <phase>package</phase>
            <goals>
              <goal>jar</goal>
            </goals>
            <configuration>
              <!-- 不要将构建的源码jar附加到构建产物中,由maven-shade-plugin来做 -->
              <attach>false</attach>
            </configuration>
          </execution>
        </executions>
      </plugin>

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

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.6.0</version>
        <executions>
          <execution>
            <id>shade-when-package</id>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <!-- 创建source jar -->
              <createSourcesJar>true</createSourcesJar>
              <shadeSourcesContent>true</shadeSourcesContent>
              <dependencyReducedPomLocation>
                ${project.build.directory}/dependency-reduced-pom.xml
              </dependencyReducedPomLocation>
              
              <!-- 需要将哪些依赖打进项目jar包中 -->
              <artifactSet>
                <includes>
                  <include>org.javassist:javassist</include>
                </includes>
              </artifactSet>
              <filters>
                <filter>
                  <artifact>org.javassist:javassist</artifact>
                  <excludes>
                    <exclude>META-INF/MANIFEST.MF</exclude>
                  </excludes>
                </filter>
              </filters>
              <relocations>
                <!-- 将javassist及其子包打到com.wangtao.etl.agent.javassist包中 -->
                <relocation>
                  <pattern>javassist</pattern>
                  <shadedPattern>com.wangtao.etl.agent.javassist</shadedPattern>
                </relocation>
              </relocations>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

执行mvn install命令的工作流程如下(mvn package同理,只是少了将jar、sources.jar安装到本地仓库这一步)

第一步:maven-jar-plugin先将本项目打成jar包

第二步:maven-source-plugin将本项目的源码打成sources.jar

第三步:maven-shade-plugin将artifactSet参数项指定的依赖打进项目jar包中,如果有relocations配置,则根据对应配置调整依赖在jar包中的位置,并且改写import语句。最后替换掉第一步打好的原始jar。

第四步:maven-shade-plugin将artifactSet参数项指定的依赖源码打进项目sources.jar包中,这一步默认是关闭的,需要配置createSourcesJar参数为true,源码位置也受relocations配置影响。其中shadeSourcesContent参数用于控制是否改写源码中的import语句,默认也是false。最后替换掉第二步打好的原始sources.jar。

第五步:将jar、sources.jar安装到本地仓库中。

注意的点

maven-source-plugin

  • 绑定的生命周期需要为package,不要设置成verify。因为maven-shade-plugin要将maven-source-plugin生成的项目源码包和自己生成的第三方依赖源码包合成最终的源码包。

  • attach参数要设置成false,默认为true,否则会有如下警告。参数含义:不要将构建的源码jar附加到构建产物中。关闭之后由maven-shade-plugin来attach。

    artifact com.wangtao:enhanced-thread-local:java-source:sources:1.0.0 already attached, replace previous instance
    
  • 如果没有maven-shade-plugin插件,只是把项目源码安装到本地仓库,则绑定生命周期为verifyattach设置成true,是比较好的工程实践,这样子mvn package命令不会触发生成源码包的任务,因为生命周期顺序为package->verify->install。install的目标是构建产物,因此需要把attach设置成true,才会把源码包也会安装到本地仓库中。

maven-shade-plugin

  • createSourcesJar参数需要设置成true,该参数用于控制是否生成第三方依赖的源码包,且合并到项目中的源码包中。
  • shadeSourcesContent参数需要设置成true,如果调整了第三方依赖的位置(即包名发生变化),同步调整项目源码中引用的第三方依赖类的import语句。
  • dependencyReducedPomLocation默认为project.basedir/dependency-reduced-pom.xml,将其调整到target目录,这样git提交时会被忽略,一般target目录肯定是设置了ignore的。
  • 使用filter排除掉第三方依赖的MANIFEST.MF文件,不然和项目自己的MANIFEST.MF产生冲突。

标签:打进,maven,plugin,jar,Maven,源码,shade,javassist
From: https://www.cnblogs.com/wt20/p/18417390

相关文章

  • Maven踩坑——父模块生命周期的操作会被子模块继承
    Maven生命周期与阶段总结Maven共有三个主要生命周期,每个生命周期由多个阶段组成。以下是每个生命周期和其阶段的详细描述。生命周期阶段描述默认生命周期validate验证项目是否正确且所有必要信息是否可用。initialize初始化构建状态,设置一些属性。generate-sources生成......
  • Maven笔记(二):进阶使用
    Maven笔记(二)-进阶使用一、Maven分模块开发分模块开发对项目的扩展性强,同时方便其他项目引入相同的功能。将原始模块按照功能拆分成若干个子模块,方便模块间的相互调用,接口共享(类似Jar包一样之间引用、复用)。开发步骤:创建Maven项目书写模块代码分模块开发需要先针对......
  • JAVA-IO获取resource WEB-INF 中文件 JAR包中
    getResource+getPath()classPaththis.getClass().getClassLoader().getResource(StringUtils.EMPTY).getPath()Stringpath=this.getClass().getClassLoader().getResource(fileName).getPath();StringfilePath=URLDecoder.decode(path,StandardCharsets.UTF_8);......
  • linux下安装部署Maven
    目录版本对应关系安装maven配置maven验证版本对应关系不同版本下载地址:https://archive.apache.org/dist/maven/Maven与JDK版本的对应关系主要取决于Maven的版本和所需的Java版本。以下是具体的对应关系:Maven2.0.11及以下版本支持JDK1.3和JDK1.4。Maven2.0.11及以上版......
  • maven高级
    Maven高级Web开发讲解完毕之后,我们再来学习Maven高级。其实在前面的课程当中,我们已经学习了Maven。我们讲到Maven是一款构建和管理Java项目的工具。经过前面10多天web开发的学习,相信大家对于Maven这款工具的基本使用应该没什么问题了。我们掌握了Maven工具的......
  • 记一次nginx布署spring cloud项目后,jar包运行正常,但访问静态资源报404的问题。
    1、我们知道springcloud,是通过注册中心来注册所有的应用,这里面也包括网关gateway的注册:2、这里面我们运行了consoleapplication应用,这样里面就有一个Instance。3、测试静态资源的访问:4、consoleapplication结构:5、访问单个模块里的资源是正常的,但是上了服务器,nginx布......
  • 直接编辑jar包的IDEA插件 JarEditor
    JarEditor:是一款不需要解压就可以直接编辑jar包的IDEA插件,使得jar包文件的编辑变得便捷和高效。一、功能特点无需解压即可直接编辑JAR包内的class文件和资源文件在JAR包内可以添加、删除、重命名文件或目录可以搜索JAR包内的内容可以将文件或目录复制到剪......
  • springboot jar包瘦身
    现在的项目结构是业务包引用comomn包,common包里又引用了很多其他的jar包,导致业务包打包出来动则就是一百甚至两百兆,现在要做到把公共的包放出来,放到一个单独的文件夹,业务包里只放业务代码。现在只需要修改mavenbuild节点如下:<build><finalName>pager</finalName>......
  • .sh 文件内容方式运行jar
    一、创建后台运行sh文件,内容如下:#!/bin/bash#设置环境变量exportJAVA_HOME=/usr/local/java/jdk-1.8.0_25exportCLASSPATH=.:$JAVA_HOME/lib/exportPATH=.:$JAVA_HOME/bin:$PATH#Java应用程序JAR文件路径JAR_PATH="/usr/local/application/sendInfo.jar"#定义日志文......
  • Eclipse + Maven+Tycho 打包知识整理
    环境:Eclipse:2023-06(4.28.0)Maven:3.9.5Tycho:4.0.8JRE:17需要创建下面几种工程-org.test.root//父工程,用来统一配置tycho插件,以及要构建的模块 |-org.test.feature//feature插件工程,可以有多个,打包出来后的featrue插件 |-category.xml//配置feature所关联......