Maven集成模块打包&使用

文章目录

1.问题思考(如何对集成模块进行打包)

思考:假设有这么一个场景,你需要制作一个Springboot的集成模块 给其他人使用,该集成模块依赖了你公司的多个内部的模块,并且该集成模块是没有主启动类之类的。当你把集成模块开发完毕之后,如何提供给在其他外部环境使用?

  如果你没有做其他任何打包配置,直接对集成模块进行maven install,你会发现你打出来的jar包很小,例如只有十几KB,此显然是有问题的,该jar包集成模块所依赖的外部模块、内部模块 都没有集成进jar包里面,所以会导致jar包很小。

  此时如果将该jar包安装到本地仓库并进行使用,会发现在使用的过程中,该集成模块缺少其所需依赖的内部模块,而这些内部模块是使用者所不曾拥有的。

使用spring-boot-maven-plugin 来实现依赖集成打包,行不行?
:不行的,因为使用spring-boot-maven-plugin插件进行打包,会要求该模块必须要有一个主启动类,否则会打包失败。我们的集成模块是没有主启动类的,故而使用该方式会打包失败!

xml 复制代码
 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>3.1.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

2.问题解决 (如何对集成模块进行打包)

在需要打包的集成模块的pom.xml里面进行如下配置:

xml 复制代码
<!--  将本模块所需依赖到打进本jar包(此方式无需主启动类)   -->
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-shade-plugin</artifactId>
	<version>3.4.1</version> <!-- 使用最新版本 -->
	<executions>
		<execution>
			<phase>package</phase>
			<goals>
				<goal>shade</goal>
			</goals>
			<configuration>
				<!-- 防止某些文件被重复打包,比如 META-INF 下的文件 -->
				<transformers>
					<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
						<mainClass><!-- 这里通常不需要指定,因为没有主启动类 --></mainClass>
					</transformer>
					<!-- 如果需要合并某些文件,比如 Spring 的配置文件,可以使用 AppendingTransformer 等 -->
				</transformers>
			</configuration>
		</execution>
	</executions>
</plugin>

然后进行maven install打包,会发现没用Main主入口也能打包成功,并且打出来的jar包也是包含了所需的相关依赖,这里是20MB.

3.使用者使用该jar包(jar包安装本地仓库和使用)

你只需将上面打好的jar包发给其他人,其他人只需将jar包安装到本地仓库,然后在自身项目的pom.xml进行引用即可。

jar包安装到本地仓库的命令:

bash 复制代码
mvn install:install-file -Dfile=D:\aaa-1.0.0-SNAPSHOT.jar -DgroupId=com.bbb -DartifactId=aaa -Dversion=ccc-SNAPSHOT -Dpackaging=jar

上面参数说明:

-Dfile=D:\aaa-1.0.0-SNAPSHOT.jar:为jar包所在的磁盘完整路径。

-DgroupId=com.bbb:为jar包所在的组织。

-DartifactId=aaa:当前依赖的名称

-Dversion=ccc-SNAPSHOT:当前依赖的版本

这里的-DgroupId、-DartifactId、-Dversion的值可以随便填,只需要和使用者pom.xml对应的依赖配置能一致即可。

使用者将jar包安装到本地仓库之后,在自身项目的pom.xml里面进行使用。

bash 复制代码
 <dependency>
    <groupId>com.bbb</groupId>
    <artifactId>aaa</artifactId>
    <version>ccc-SNAPSHOT</version>
</dependency>
相关推荐
eralong41 分钟前
Java 面向对象:继承、多态、接口
java·后端
哦虎!44 分钟前
【数据库】事务
java·数据库·mysql
CDN3601 小时前
流媒体加速实践:出海东南亚短视频点播频繁缓冲,HLS 分片与 Nginx 配置调优
java·网络·nginx·流媒体加速
程序员黑豆1 小时前
Java中的null与NullPointerException完全指南:安全处理、实战排查与面试题
java·前端·ai编程
晴天162 小时前
Electron面试题-Day19
java·javascript·electron
GeekZHR2 小时前
C语言指针进阶补充6:动态内存管理、mem系列内存函数、复杂指针声明,一次补齐指针的“三大盲区“
java·c语言·算法·指针
Herbert_hwt2 小时前
第七章 Java深入理解枚举类型
java·开发语言·算法
侧耳倾听1112 小时前
java 日志框架简介
java·开发语言
她的男孩3 小时前
我用 LLM 把后台 CRUD 效率提升 10 倍:AI 代码生成器的架构与落地实践
java·后端·架构
土司大王3 小时前
LeetCode hot100——移动零
java·算法·leetcode