打包Java项目时,我们依赖于Maven,但我认为Gradle或Ant存在相同的问题。有时,如果一个依赖项依赖于传递性依赖项的版本不同于另一个依赖项,则遇到了称为“ Jar Hell”的问题,番石榴是一个经常出现的例子。如果加载的库具有冲突的类路径或函数签名,则在运行时会得到臭名昭著的ClassNotFoundException
或NoSuchMethodError
。 (“有趣”,一个是异常,另一个是错误btw ^^)
我知道使用dependencyManagement
,使用Maven Shade Plugin可以解决问题,并使用Enforcer插件将其检测到,例如“依赖收敛”。我也知道与这些方法有关的许多问题,例如SO Link。
现在我的问题是在编译时如何检测这些错误?据我了解,Java编译器javac
本身并没有用于打包应用程序的机制,但我会假设使用jar
,shade
之类的assembly
打包程序或能够检测是否所有类和方法都存在?显然,假设在运行时不会加载任何类。 (对于我们来说就是这种情况,因为我们主要构建独立的应用程序,而不处理诸如JBoss / Wildfly之类的应用程序服务器)