我有一个类,它从程序包运行时可能包含在类路径中的包类扩展,除非满足相关性,否则不调用它, 但它似乎惹恼了java验证程序在尝试加载程序时抛出NoClassDefFoundError,
有什么方法吗?
答案 0 :(得分:2)
有什么方法吗?
在实践中,没有。必须在类路径上提供超类才能成功加载,链接和验证子类。这必须在类初始化之前发生,并创建它的实例。
如果您无法确定超类是否可用,则需要删除子类上的所有直接和间接静态依赖项,然后使用Class.forName()
动态加载子类。如果超类“丢失”,那将失败,但是你会得到一个不同的异常(不是Error
),如果它的设计是为了应对缺少的类,你的应用程序可能会继续。< / p>
答案 1 :(得分:0)
Spring等具有“可选使用”代码的框架,取决于其他库,使用“策略模式”将特定于依赖项的代码放入“内部类”或单独的类中。
外部类可以加载&amp;好的;只有当你尝试&amp; 实例化将抛出NoClassDefFoundError的内部类。
因此外部类通常尝试(try-catch)实例化一个要使用的策略,然后如果失败则实例化后备策略。
public class MyService {
protected MyStrategy strategy;
// constructor;
// -- choose our strategy.
public MyService() {
try {
this.strategy = new ExternalLib_Strategy();
} catch (NoClassDefFoundError x) {
// external library not available.
this.strategy = new Standard_Strategy ();
}
}
// --------------------------------------------------------
protected interface MyStrategy {
public void doSomething();
}
protected static class ExternalLib_Strategy implements MyStrategy {
ExternalLib lib = org.thirdparty.ExternalLib.getInstance(); // linkage may
public void doSomething() {
// ... use the library for additional functionality.
}
}
protected static class Standard_Strategy {
public void doSomething() {
// ... basic/ fallback functionality.
}
}
}
答案 2 :(得分:0)
作为解决此问题的方法,如果您的类(子类)在类路径中可用,则可以使用方法{{1}通过将类文件作为资源加载来检查类路径中是否可用父类。 }。此方法永远不会抛出未找到的类异常。但是如果找不到类,这将返回null。如果资源为空,您可以使用您的类进行aviod。
请参阅以下示例代码:
ClassLoader.getResource()
}