Maven 使用自定义布局时自定义启动器ClassNotFound异常

Maven 使用自定义布局时自定义启动器ClassNotFound异常,maven,spring-boot,spring-boot-maven-plugin,Maven,Spring Boot,Spring Boot Maven Plugin,SpringBootMaven插件。布局工厂新功能。从1.5.0.M1开始提供 在自定义布局中定义自定义启动器时遇到问题: @Override public String getLauncherClassName() { return "com.mycompany.CustomLauncher"; } 如果我在启动应用程序源代码中包含我的自定义启动器,它将被重新打包为boot-INF/classes,当我尝试运行JAR时,它将失败,并出现ClassNotFound异常 我一直在阅读Repack

SpringBootMaven插件。布局工厂新功能。从1.5.0.M1开始提供

在自定义布局中定义自定义启动器时遇到问题:

@Override public String getLauncherClassName() { return "com.mycompany.CustomLauncher"; }
如果我在启动应用程序源代码中包含我的自定义启动器,它将被重新打包为boot-INF/classes,当我尝试运行JAR时,它将失败,并出现ClassNotFound异常

我一直在阅读Repackager代码,但是我找不到任何允许有选择地从重新打包序列中排除给定类的钩子。如果我在布局中重写getRepackagedClassesLocation方法,那么引导主类将由另一个类加载器加载,并且在SpringBoot ClassNotFound上失败

我有没有办法强制启动程序退出BOOT-INF/classes重新打包

更新1

@Override
public void writeLoadedClasses(LoaderClassesWriter writer) throws IOException
{
    String name = PropertiesLauncherInternal.class.getName().replaceAll("\\.", "\\\\") + ".class";
    InputStream inputStream = PropertiesLauncherInternal.class.getResourceAsStream(PropertiesLauncherInternal.class.getSimpleName() + ".class");
    writer.writeEntry(name, inputStream);
    writer.writeLoaderClasses();
}
为了确保代码可以访问,我添加了以下测试:

    JarInputStream is = new JarInputStream(new FileInputStream(new File("c:/git/dev/framework/boot/target/boot-current-SNAPSHOT.jar")), true);
    JarEntry entry = null;
    while (null != (entry = is.getNextJarEntry()))
    {
        System.out.println(entry.getName() + "-" + entry.getCrc());
    }

    URL url = new File("c:/git/dev/framework/boot/target/boot-current-SNAPSHOT.jar").toURL();
    URL[] urls = new URL[] { url };
    ClassLoader cl = new URLClassLoader(urls);
    Class cls = cl.loadClass("com.test.Boot");
    Class cls = cl.loadClass("com.launcher.PropertiesLauncherInternal");
对于第一个循环,我得到以下日志:

BOOT-INF/--1
BOOT-INF/classes/--1
BOOT-INF/classes/com/-0
BOOT-INF/classes/com/test/-0
BOOT-INF/classes/com/test/Boot.class-2405822989
...
com\launcher\PropertiesLauncherInternal.class--1
类名旁边的数字是CRC。我不确定是否相关,但CRC-32不得而知


当使用类加载器时,我可以加载com.test.Boot,但它在PropertiesLauncherInternal.class的ClassNotFoundException上失败,而不是将它与应用程序代码放在一起,您的启动程序代码应该位于一个单独的模块中,该模块声明为Spring Boot的Maven插件的依赖项。这个单独的模块应该使用Maven的标准jar包装,不应该使用SpringBoot的Maven插件重新包装


这里有一个演示如何设置的程序。

嗨,安迪,我已经试过了,我的发射器已经打包好了。然而,当我尝试运行JAR时,我得到一个错误:无法找到或加载主类。如果我手动将相同的类(相同的内容、相同的名称)复制到JAR中的相同位置,那么它就可以工作了。知道问题出在哪里吗?不,对不起。也许你可以分享一些重现问题的代码?我已经在原始问题上添加了一些细节。问题是我使用了错误的斜杠转换。JAR已经构建,可以找到资源,但是类加载器无法加载它。