首先:我真的很喜欢弹簧靴和maven。所以我仍然不知道所有东西是如何插在一起的。
我想要实现的是我的应用程序的某种插件功能。根据我的研究,似乎最好的方法是使用ServiceLoader
或SpringFactoriesLoader
的spring-boot implmentation。
根据网上的几条指示,我把两个项目放在一起
JamesApplication提供了一个应该实现的接口(de.maxrakete.james.device.domain.DeviceInterface
)。
TemperatureSensor实现了所述类,并以多种方式公开它。
对于包含此内容的文件META-INF\services\de.maxrakete.james.device.domain.DeviceInterface中的ServiceLoader
in
de.maxrakete.james.plugin.TemperatureSensor.TemperatureSensor
对于包含此内容的文件META-INF\spring.factories中的SpringFactoriesLoader
de.maxrakete.james.device.domain.DeviceInterface=de.maxrakete.james.plugin.TemperatureSensor.TemperatureSensor
根据此page,我尝试了MainApplication中的两个不同的实现(请参阅onApplicationEvent
- 函数):
@SpringBootApplication
public class JamesApplication implements ApplicationListener<ApplicationReadyEvent> {
public static void main(String[] args) {
SpringApplication.run(JamesApplication.class, args);
ClassLoader cl = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader)cl).getURLs();
for(URL url: urls){
System.out.println("Classpath file: " + url.getFile());
}
}
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
ServiceLoader<DeviceInterface> loader = ServiceLoader.load(DeviceInterface.class);
loader.iterator();
List<DeviceInterface> foos = SpringFactoriesLoader.loadFactories(DeviceInterface.class, null);
}
}
我正在尝试两种方式加载jar,但没有发生任何事情(我应该从插件中获取一些日志消息)但是这种情况不会发生。
我运行应用程序的方式是这样的:
java -cp "./plugins/TemperatureSensor-0.0.1-SNAPSHOT.jar" -jar james.war
如您所见,我正在尝试将子文件夹中的jar添加到类路径中,但是在main
- 函数的输出中(我尝试打印类路径中的所有文件)我只得到Classpath file: /home/max/folder/james.war
结论
因此,有三种可能的错误来源
pom.xml
我真的不知道问题可能是什么。我试图向您提供尽可能多的信息以及我研究的所有步骤。我希望有人找到一些有用的线索,我可能会忽略这些线索。
非常感谢!