1.聊聊如何避免多个jar通过maven打包成一个jar,包源包下多个同名配置文件发生覆盖问题
2.如何把github上下载下来的码下maven源代码zip文件打包成可运行的jar文件
3.maven是干嘛的?
聊聊如何避免多个jar通过maven打包成一个jar,多个同名配置文件发生覆盖问题
在开发过程中,载m载你是包源包下否遇到过这样的问题:外部项目需要访问内部nexus私仓的jar,但私仓不对外开放,码下导致外部项目无法下载私仓的载m载义乌到太原源码jar,进而导致项目无法运行。包源包下
面对这种情况,码下常用的载m载解决方法有两种:一是外部项目与内部nexus的网络打通,例如通过***;二是包源包下将私仓的jar直接下载给外部项目。然而,码下私仓的载m载jar可能包含依赖其他内部jar的情况,因此需要下载多个jar。包源包下为了方便,码下我们可能会将这些jar合并成一个大jar再给出去。载m载但是,一些jar包会有同名的react install 源码配置文件,如spring.factories,如果不进行处理,直接打包,就会出现同名配置文件覆盖的情况。
本文将探讨如何解决多个jar合并成一个jar时,多个同名配置文件覆盖的问题。
解决思路是通过maven-shade-plugin插件,利用插件的org.apache.maven.plugins.shade.resource.AppendingTransformer来处理多个jar包中存在重名的配置文件的合并。其核心是在于合并多个同名配置文件内容,而非覆盖。
示例配置如下,打包后的配置文件效果如下图所示。
然而,仅仅追加同名的配置内容可能无法满足所有需求,例如spring.factories文件。为了达到预期的源码变反码效果,我们需要进行进一步的调整。
在尝试寻找解决方案时,我在maven-shade-plugin的官方示例中未能找到合适的方案。于是,我面临两条路:一是放弃maven-shade-plugin插件,选择其他类似的插件,如maven-assembly-plugin;二是扩展maven-shade-plugin。由于maven-assembly-plugin的扩展配置比maven-shade-plugin复杂,我最终选择了在maven-shade-plugin的基础上进行扩展。
在扩展思路中,我没有直接修改maven-shade-plugin插件,而是在maven-shade-plugin打包后的基础上,进行插件定制。具体实现思路是修改maven-shade-plugin打包后的spring.factories文件内容,将其调整为如下形式:
自定义maven插件spring-factories-merge-plugin的核心思路如下:
1. 如何读取配置文件spring.factories中key重复的内容,而不被覆盖。android 源码 lunch
如果直接使用java.util.properties的读取,当配置文件中有key重复时,如多个org.springframework.boot.autoconfigure.EnableAutoConfiguration,最后会出现value值被覆盖的情况。
解决方案是利用org.apache.commons.configuration.PropertiesConfiguration进行处理。
在项目的pom中引入GAV,读取配置示例代码如下。
2. 如何将修改后的配置文件重新写入jar。
我的思路是直接利用IO进行操作。
项目中如何配置插件的小细节是:当maven-shade-plugin和spring-factories-merge-plugin的执行生命周期都是相同阶段,例如都是在package时,则maven-shade-plugin的放置顺序需要在spring-factories-merge-plugin之前,因为spring-factories-merge-plugin是对maven-shade-plugin打包后的结果进行二次加工。如果maven-shade-plugin的放置顺序不在spring-factories-merge-plugin之前,则spring-factories-merge-plugin的执行阶段需要比maven-shade-plugin靠后,例如maven-shade-plugin在package阶段执行,discuz交友源码则spring-factories-merge-plugin需要在install或deploy阶段执行。
打包后的效果图如下。
总结:在阅读开源框架时,我们常常关注源码,而忽略了maven插件。这次因为有打包jar的需求,我发现无论是springboot还是dubbo都集成了许多宝藏插件,例如maven-shade-plugin插件。如果以后有对maven插件的需求,推荐从springboot或dubbo中寻找,可能会带来意想不到的收获。
如何把github上下载下来的maven源代码zip文件打包成可运行的jar文件
1.下载Spring源码
git下载地址:/SpringSource/spring-framework/
2.下载完成后,编译前需满足的先决条件
1)当前系统中安装了gradle,如果为安装,可以从:/release/STS/3.3.0/dist/e4.3/spring-tool-suite-3.3.0.RELEASE-e4.3-win.zip
直接回车确认即可
4)接着会提示要运行的命令是:
./gradlew cleanEclipse :spring-oxm:compileTestJava eclipse -x :eclipse
直接回车确认
5)接下来会自动下载所需的依赖包,等待其下载、编译完成即可。
编译的过程中,第一次编译停留在“> Building > :spring-core:cglibRepackJar”这个提示处很久,查看cmd的进程,貌似死了,我将其结束后重新运行,依旧停留在这个地方。
注:在编译过程中,经常出现在下载依赖项时没有响应的情况,需要找到对应的java进程,结束后重新运行,或者直接关闭命令行窗口重新来一次,暂未找到具体原因。
猜测应该和我的网络状况和java环境有关,编译过程中尝试了jdk8的位和位版本,都有这个问题。
在编译多次不成功以后,我通过运行gradlew.bat install,尝试先把所有的依赖项都先下载下来,在下载子项目相关的依赖项的过程中,仍然会出现命令没有响应的情况,只能一次又一次地关闭,重新运行。
一次又一次编译假死后,终于看到了“BUILD SUCCESS”,再次运行import-into-eclipse.bat,这次运行,跳过了很多之前需要下载的依赖项,应该是运行install命令的时候已经下载过了,但还是有一些仍然需要下载的依赖项。观察输出,会发现首先会下载依赖项所对应的pom文件,接着才会下载对应的jar。应该是和Maven相关的,有时间要把Maven、ant、ivy、gradle这些都看一下。
maven是干嘛的?
项目构建,管理,jar包下载,使用maven可以实现项目自动化构建和管理。例如:
mvn compile - 下载jar文件并编译项目。
mvn test - 执行测试。
mvn dependency: sources - 尝试下载源代码文件。
mvn eclipse:eclipse - 生成eclipse工程配置文件。
成功配置maven后,可以进行以下操作:
1)下载并解压maven。
2)设置环境变量,以便在命令行中运行maven命令。
3)在命令行中测试maven是否成功配置。
接下来,使用maven进行项目管理:
5)使用maven创建Java工程,可以减少配置文件,自动下载依赖库,并进行测试。
6)使用pom文件描述项目信息,便于团队管理。
7)maven提供了仓库概念,使得依赖库可共享。
8)maven主要功能包括项目构建、依赖管理、持续集成、版本管理等。
9)通过maven,项目更科学地管理,构建更有效,更易于维护。
)maven能帮助发现重复的代码和组件,提高项目的复用性。
)maven环境搭建涉及下载maven、解压、设置环境变量和测试配置。
)maven使用入门包括创建项目、编写代码、配置依赖和打包。
)利用IDE如Myeclipse构建POM文件。
)总结maven环境搭建和入门命令,了解其思想和功能。