我有一个由多个模块组成的Maven项目:一个服务器应用程序和一个核心库模块。我的服务器应用程序是一个Spring Boot 2项目,其pom文件包括我的核心库作为其依赖项之一。
在核心库模块中,我定义了一个类似于以下内容的类:
public class ServiceFunction implements Function<String, String> {
private DataMapping mapping = new DataMapping();
@Override
public String apply(String str) {
return mapping.apply(str);
}
}
DataMapping
是一个类,可以在我的核心库的传递依赖项中找到一个类,其定义如下:
public class DataMapping implements Function<String, String> {
private FunctionMapping mapping = new FieldMapping();
@Override
public String apply(String str) {
return mapping.apply(str);
}
}
FunctionMapping
也是一个在相同的传递依赖项中也找到的类,其外观类似于:
public class FunctionMapping {
public String apply(String str) {
return applyFunction(str);
}
private static String applyFunction(String str) {
DynamicFunction df = DynamicFunction.load();
return df.apply(str);
}
}
现在,DynamicFunction看起来像:
public interface DynamicFunction {
String apply(String str);
static DynamicField lookup() {
return ServiceLoader.load(DynamicFunction.class, ClassLoader.getSystemClassLoader()).iterator().next();
}
}
在核心库模块中,我提供了一个典型的SPI实现,其中在我的资源目录下有META-INF / services目录,并且有一个名为abc.def.DynamicFunction的文件,其中包含ghi.jkl.MyFunction的内容。
我已经在核心库中定义了MyFunction:
public MyFunction {
public String apply(String str) {
return str.toLowerCase();
}
}
现在,一旦服务器开始运行并且在apply()
类中调用了ServiceFunction
方法,我发现ServiceLoader
的迭代器为空。是否有一种特殊的方式来加载我的Spring Boot应用程序依赖项中提供的服务?