使用SystemLoader / SpringFactoryLoader在Spring-Project中加载外部Jar

时间:2017-07-11 21:56:29

标签: java spring maven spring-boot serviceloader

首先:我真的很喜欢弹簧靴和maven。所以我仍然不知道所有东西是如何插在一起的。

我想要实现的是我的应用程序的某种插件功能。根据我的研究,似乎最好的方法是使用ServiceLoaderSpringFactoriesLoader的spring-boot implmentation。

根据网上的几条指示,我把两个项目放在一起

  • James(主要应用程序)GitHub
  • TemperatureSensor(插件)GitHub

JamesApplication提供了一个应该实现的接口(de.maxrakete.james.device.domain.DeviceInterface)。

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

结论

因此,有三种可能的错误来源

  1. 错误的cli命令添加类路径文件
  2. META-INF文件夹中的接口声明错误
  3. 错误的Loader实施
  4. 也许我正在以错误的方式编辑来源?
  5. pom.xml
  6. 的配置错误

    我真的不知道问题可能是什么。我试图向您提供尽可能多的信息以及我研究的所有步骤。我希望有人找到一些有用的线索,我可能会忽略这些线索。

    非常感谢!

0 个答案:

没有答案