Spring Boot Maven Plugin. LayoutFactory новая функция. Доступно с 1.5.0.M1.Custom Launcher ClassNotFound exception при использовании настраиваемого макета
У меня возникают проблемы, когда я определить пользовательский запуска в пользовательском макете:
@Override public String getLauncherClassName() { return "com.mycompany.CustomLauncher"; }
Если бы я включил свой собственный пусковую в источниках загрузки приложений, он получает упакованный в BOOT-INF/классы, и когда Я пытаюсь запустить JAR, это не с исключением ClassNotFound.
Я читал код Repackager, но я не могу найти какой-либо крючок, который позволяет выборочно исключать данный класс из последовательности переупаковки. Если я переопределяю метод getRepackagedClassesLocation в своем макете, тогда основной класс загрузки загружается другим загрузчиком классов и он не работает в SpringBoot ClassNotFound.
Есть ли способ, с помощью которого я могу вывести пусковую установку из переупаковки BOOT-INF/классов?
UPDATE 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");
Для первого цикла я получаю следующее LOG:
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, но он не на ClassNotFoundException для PropertiesLauncherInternal.class
Привет, Энди, я пробовал это сделать, и я получил свою пусковую установку. Однако, когда я пытаюсь запустить JAR, я получаю ** Ошибка: не удалось найти или загрузить основной класс **. Если я копирую один и тот же класс (идентичный контент, одно и то же имя) в одно и то же место в JAR вручную, тогда он работает. Любая идея, что может быть проблемой? –
Нет, извините. Возможно, вы можете поделиться некоторым кодом, который воспроизводит проблему? –
Я добавил некоторые детали по оригинальному вопросу. –