1

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

因此我实施了这个解决方案

@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

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

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

4

1 回答 1

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>
于 2017-07-13T06:40:03.250 回答