ServiceLoader,URLClassLoader& Spring:java.lang.NoClassDefFoundError

时间:2017-07-12 20:45:22

标签: java spring serviceloader

我正在尝试加载一个外部module.jar,它从我的主spring应用程序实现了一个接口。

因此我实施了this solution

@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
    File loc = new File("plugins");

    File[] flist = loc.listFiles(new FileFilter() {
        public boolean accept(File file) {return file.getPath().toLowerCase().endsWith(".jar");}
    });

    URL[] urls = new URL[flist.length];
    for (int i = 0; i < flist.length; i++) {
        try {
            urls[i] = flist[i].toURI().toURL();
            System.out.println(flist[i].toURI().toURL().toString());
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    URLClassLoader ucl = new URLClassLoader(urls);

    ServiceLoader<DeviceInterface> sl = ServiceLoader.load(DeviceInterface.class, ucl);
    Iterator<DeviceInterface> apit = sl.iterator();
    while (apit.hasNext())
        System.out.println(apit.next().getName());
}

不幸的是,这引发了这个例外:

java.lang.NoClassDefFoundError: de/maxrakete/james/device/domain/DeviceInterface

我是否应该将我的主应用程序声明为模块中的依赖项?目前我的模块只有自己的依赖项。

我在网上找到的资源并不是很清楚这个问题。

1 个答案:

答案 0 :(得分:0)

可能是springboot包装问题。尝试将重新打包添加到您的maven构建

        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <classifier>exec</classifier>
                    </configuration>
                </execution>
            </executions>
        </plugin>