maven项目依赖第三方包后打包供其他项目依赖

本文详细介绍了如何将SpringBoot项目打包成可供其他项目依赖的jar包。首先,尝试使用原生Maven插件和Spring Boot Maven插件打包,但未达到预期效果。接着,由于直接打包后的jar无法在其他项目中导入三方依赖,问题出在打包过程中未包含依赖。最终,通过使用maven-assembly-plugin插件,并配置`<appendAssemblyId>`为`false`,成功打包出包含所有依赖的jar包,解决了问题。此外,还介绍了Maven中dependency的scope作用域,帮助理解不同scope的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目: springboot
目标:将项目打成jar包供别的项目使用

一、尝试打包

springboot中,如果直接使用自带的maven打包插件,打出来的包是可运行的,但是不能给别的项目依赖使用;
使用如下插件配置:
1、方式一:
原生的Maven插件打包

<build>
   <plugins>
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
         <configuration>
            <source>1.8</source>
            <target>1.8</target>
         </configuration>
      </plugin>
   </plugins>
</build>

2、方式二:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <classifier>exec</classifier>
            </configuration>
        </plugin>
    </plugins>
</build>

打包形成文件:
在这里插入图片描述
第一个 jar 表示可以被其他项目依赖的 jar ,第二个 jar 则表示一个可执行 jar。

二、发现问题

我在项目A中引用了一个三方开源的jar包,如下:

<dependency>
    <groupId>net.openhft</groupId>
    <artifactId>compiler</artifactId>
    <version>2.3.4</version>
</dependency>

把A打包成jar之后,项目B依赖此jar,运行项目B发现import不到compiler包下的类;

三、解决

使用maven-assembly-plugin 插件进行项目A打包:
项目A中pom配置:

 <build>
    <!--<pluginManagement>&lt;!&ndash; lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) &ndash;&gt;-->
      <plugins>
   
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>2.3.2</version>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
          </configuration>
        </plugin>
 
        <plugin>
          <artifactId>maven-assembly-plugin </artifactId>
          <configuration>
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <archive>
              <manifest>
                <mainClass>com.bd.util.appclient.AppMain</mainClass>
              </manifest>
            </archive>
          </configuration>
          <executions>
            <execution>
              <id>make-assembly</id>
              <phase>package</phase>
              <goals>
                <goal>single</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
 
 
      </plugins>
    <!--</pluginManagement>-->
  </build>

如此之后进行项目A打包,在target目录下发现两个jar包:

  • ***.jar
  • ***-jar-with-dependencies.jar
    很显然,第二个jar包是我们需要的,但是如果我们直接使用deploy命令,发布到maven私服的还是第一个;
    继续改造: 添加配置:
<appendAssemblyId>false</appendAssemblyId>

最终pom文件中插件配置为:

 <build>
    <!--<pluginManagement>&lt;!&ndash; lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) &ndash;&gt;-->
      <plugins>
   
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>2.3.2</version>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
          </configuration>
        </plugin>
 
        <plugin>
          <artifactId>maven-assembly-plugin </artifactId>
          <configuration>
		    <appendAssemblyId>false</appendAssemblyId>
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <archive>
              <manifest>
                <mainClass>com.bd.util.appclient.AppMain</mainClass>
              </manifest>
            </archive>
          </configuration>
          <executions>
            <execution>
              <id>make-assembly</id>
              <phase>package</phase>
              <goals>
                <goal>single</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
 
 
      </plugins>
    <!--</pluginManagement>-->
  </build>

最终项目A打包,形成****.jar,完成目标;

附:Maven中的dependency的scope作用域详解
1、test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖

2、compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去(默认)

3、provided依赖:在编译和测试的过程有效,最后生成war包时不会加入,诸如:servlet-api,因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突

4、 runtime在运行的时候依赖,在编译的时候不依赖

参考文章:
https://segmentfault.com/a/1190000019706787

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值