【发布时间】:2019-09-27 16:53:13
【问题描述】:
短版
当maven assembly plugin 构建jar-with-dependencies 时,它会抓取它找到的第一个META-INF/groovy/org.codehaus.groovy.runtime.ExtensionModulefile 并忽略所有其他META-INF/groovy/org.codehaus.groovy.runtime.ExtensionModulefile。
如何将项目构建为胖 jar,以便它识别所有 Groovy 扩展类?
加长版
我有一个以这行代码开头的 groovy 项目:
def today = new Date().clearTime().toTimestamp()
我的项目构建并运行良好。我现在需要将它打包到一个信封项目中——从技术上讲,构建一个依赖于我的项目的单独项目,作为一个胖 jar(jar-with-dependencies,使用maven assembly plugin)——然后从 ALM(测试管理软件)运行它。
现在,Groovy 2.5.8 包含许多模块(groovy-dateutil.jar 和 groovy-sql.jar 等 - 不再有可用的 groovy-all.jar),并且每个模块有自己的 META-INF/groovy/org.codehaus.groovy.runtime.ExtensionModule 文件定义扩展类。
问题是,当 maven 程序集插件构建一个 jar-with-dependencies 时,它会抓取它找到的第一个 ExtensionModule 文件,而忽略所有其他文件。因此,无论我在项目的 pom.xml 顶部声明的任何 groovy 依赖项,当我运行 fat jar 时,我都可以使用该模块的扩展类,而任何其他依赖项都会导致项目在运行时失败。我可以拥有Date().clearTime() 或Date().toTimestamp(),但不能同时拥有:(
现在,我可以手动编辑 fat jar 中的 ExtensionModule 文件,添加我需要的所有扩展类。但是,每次我对 mu 项目进行更改时,我都需要将它和封装的项目重新构建为一个 fat jar (115 Mb),因此每次手动编辑文件会很烦人。
我尝试使用带有“文件聚合”容器描述符的 maven 程序集插件,但它添加了每个文件的全部内容,而不是将扩展类添加到行 ExtensionClasses=,所以最终结果不会工作。我也尝试过使用 maven shade 插件,但它和 maven 程序集插件做了同样的事情。不过,我没有探索它的任何高级设置。我还听说有一个 Groovy Eclipse maven 插件。
我应该使用什么来组装一个所有 groovy 扩展类都正常工作的胖 jar?
设置
-Java 11.0.3
-Groovy 2.5.8
-Spock 1.3-groovy-2.5
-IntelliJ IDEA 2019.1
-Maven 3.5
-Maven compiler plugin
-Maven build helper plugin
-Maven assembly plugin 3.8.1
【问题讨论】:
-
我尝试使用带有 GroovyResourseTransformer 的 maven shade 插件,但它似乎不起作用。单个 Groovy 模块在 META-INF/groovy/org.codehaus.groovy.runtime.ExtensionModule 中有它们的扩展类描述符(强调 meta-inf/GROOVY/),而 GroovyResourceTransformer 似乎聚合了 META-INF/service 中的文件内容/<...>,我的胖罐子里根本不存在!