Java 如何从Maven着色jar中的依赖项组织文件

Java 如何从Maven着色jar中的依赖项组织文件,java,maven,maven-shade-plugin,Java,Maven,Maven Shade Plugin,当您使用构建胖jar时,同一路径上但源自不同依赖项的文件之间可能存在冲突。类似地,如果将各个依赖项(LICENSE.txt、本机库等)并排放置在着色jar中的公共位置,则很难区分位于各个依赖项根目录下的各种依赖项特定文件的来源 maven shade插件本身和类似插件似乎提供了自动重新定位类的功能,但不提供依赖项中的其他文件,如以下示例中所示: 当前混乱结构的示例 / -通知 -magic.gz -LICENSE.txt -许可证 -asm-license.txt /META-INF -LICE

当您使用构建胖jar时,同一路径上但源自不同依赖项的文件之间可能存在冲突。类似地,如果将各个依赖项(LICENSE.txt、本机库等)并排放置在着色jar中的公共位置,则很难区分位于各个依赖项根目录下的各种依赖项特定文件的来源

maven shade插件本身和类似插件似乎提供了自动重新定位类的功能,但不提供依赖项中的其他文件,如以下示例中所示:

当前混乱结构的示例
/
-通知
-magic.gz
-LICENSE.txt
-许可证
-asm-license.txt
/META-INF
-LICENSE.TXT
-关于.html
/com.some.library
/com.some.other.library
/com.some.third.library
这是我刚开始的一个项目的一个例子。上面的文件都不是我添加的,但都来自我正在使用的各种流行的第三方库。我希望通过让Maven在公共包结构中重新组织文件来清理这一混乱,如以下示例所示:

所需清洁结构的示例
/
/com.some.library
-通知
-许可证
/META-INF
-关于.html
/com.some.other.library
-magic.gz
-LICENSE.txt
/com.some.third.library
-asm-license.txt
/META-INF
-LICENSE.TXT

我有很多依赖关系,所以我不考虑编写依赖性的过滤器/重新定位器/…使用硬编码文件名可以很好地解决此问题


如何自动组织着色jar中依赖项的所有文件?理想情况下,将依赖项中的所有文件重新定位到以依赖项命名的子文件夹中。

这听起来不像是Maven的最佳实践……但话说回来,一种可能的方法是基于Maven shade插件创建自己的Maven插件。代码库非常简单。您可以实现
org.apache.maven.plugins.shade.resource.ResourceTransformer
,并在
org.apache.maven.plugins.shade.DefaultShader
类中调用它,当它枚举每个Jar&Jar条目时(您可能可以按Jar名称组织资源)。如果您想要一个基本的实现,我将发布一个。

那么Maven的最佳实践是什么?请随时提供一个实现,如果你觉得它可以解决这个问题。抱歉的延误-繁忙的周末。这将破坏期望根目录中有资源的JAR。也就是说,我分叉了maven shade插件并对其进行了编辑,以支持根资源重新定位。这是一个非常基本的实现,但我对一个简单的案例进行了单元测试。在此处克隆repo,并在shadeplus maven插件项目上运行mvn clean安装。shadeplus maven测试项目中有一个示例项目,您可以在其中比较我的插件和原始shade插件。让我知道它是否适合你。谢谢!我一定去看看!我看了你的密码以后再报告。它似乎只重新定位位于shaded.jar根目录中的文件。我问的是“如何自动组织着色jar中依赖项中的所有文件?理想情况下,将依赖项中的所有文件重新定位到以依赖项命名的子文件夹中。”我的问题是。由于对根文件行为的描述,我误读了您的请求(我确实发现只重新定位根资源非常奇怪:)。我会抓住机会,并推动它。
/
  - NOTICE
  - magic.gz
  - LICENSE.txt
  - LICENSE
  - asm-license.txt
  / META-INF
    - LICENSE.TXT
    - about.html
  / com.some.library
    <class files>
  / com.some.other.library
    <class files>
  / com.some.third.library
    <class files>
/
  / com.some.library
    <class files>
    - NOTICE
    - LICENSE
    / META-INF
      - about.html
  / com.some.other.library
    <class files>
    - magic.gz
    - LICENSE.txt
  / com.some.third.library
    <class files>
    - asm-license.txt
    / META-INF
      - LICENSE.TXT