Maven shade在所有模块中的重新定位?
我有一个maven多模块项目,它有一个父pom项目和一堆模块。其中一个模块是“主模块”,它将所有库着色到其中。所有其他模块都依赖于该模块并使用提供的库 主模块是一个Bukkit插件,它将其他模块作为扩展加载。这些扩展都使用自己的类加载器加载,但是加载的类在加载器之间共享,以便能够相互依赖。他们还可以依赖其他Bukkit插件,因为他们的父类加载器是Bukkit的PluginClassLoader,它还可以在插件之间共享加载的类以允许交互 问题就从这里开始:不同的插件可能使用同一个库,但该库的类可能被不同的类加载器加载,从而导致LinkageErrors和其他问题 我解决这个问题的想法是通过maven shade插件重新定位主模块中的库。这与仅由主模块使用的库一样有效。但是,重新定位其他模块使用的库会导致运行时ClassNotFoundExceptions,因为这些模块仍然搜索正常的包名,而不是重新定位的包名。 然后我尝试将导入更改为重新定位的包,但我的IDE(IntelliJ)找不到类Maven shade在所有模块中的重新定位?,maven,bukkit,Maven,Bukkit,我有一个maven多模块项目,它有一个父pom项目和一堆模块。其中一个模块是“主模块”,它将所有库着色到其中。所有其他模块都依赖于该模块并使用提供的库 主模块是一个Bukkit插件,它将其他模块作为扩展加载。这些扩展都使用自己的类加载器加载,但是加载的类在加载器之间共享,以便能够相互依赖。他们还可以依赖其他Bukkit插件,因为他们的父类加载器是Bukkit的PluginClassLoader,它还可以在插件之间共享加载的类以允许交互 问题就从这里开始:不同的插件可能使用同一个库,但该库的类可能
有人知道如何解决这个搬迁问题吗?或者在类加载问题上可能有不同的方法?我的问题几乎与您的问题完全相同(从这个问题的年龄判断)。虽然我没有一个更干净的解决方案覆盖其他插件版本的库,但我确实有一个解决IntelliJ不识别重新定位的类的方法 为了防止它抱怨,我将着色jar(带有重定位)作为IntelliJ库添加到目标模块中。 您可以这样做:
文件>项目结构…>模块>(目标模块)>依赖项
Add(green+)>1选择着色罐子。JAR或目录…
- 通过Maven的模块依赖关系,代码仍然可以看到未重新定位的类,如果您碰巧使用了它们,则只有在使用Maven编译时才能看到。(您可以删除模块依赖项,但每次重新导入pom时都会读取该依赖项)
- 如果在jar文件名中包含版本号,则每次更改项目版本时都必须更新jar路径(解决方法:指定静态
)project.build.finalName
- 添加新方法或更改签名时,需要再次编译库模块。(这可以通过为着色依赖项创建单独的模块来解决,这实际上也可以解决文件名问题)
这样IntelliJ就不知道重新定位,但也不需要知道。如有必要,可以在父pom中配置重新定位,以确保所有项目的规则一致。我已经有一段时间没有尝试过这样做了。到目前为止,该项目已经进行了重大重组。我的问题中提到的主模块现在是一个单独的maven项目,其余的模块分为3个不同的项目(主模块、附加模块、原型模块)和一个单独的共享父模块,没有任何依赖项声明。因此,模块从核心依赖项而不是父依赖项继承它们的依赖项。我认为现在应该可以搬迁了。我仍然喜欢你提到的IntelliJ解决方案