2017-01-24 5 views
0

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

ответ

0

Вместо того, чтобы иметь его вместе с кодом приложения, код запуска должен быть в отдельном модуль, объявленный как зависимость плагина Maven Spring Boot. Этот отдельный модуль должен использовать стандартную упаковку Jaf Maven и не должен быть переупакован с помощью плагина Maven от Spring Boot.

Существует sample, который показывает, как настроить вещи.

+0

Привет, Энди, я пробовал это сделать, и я получил свою пусковую установку. Однако, когда я пытаюсь запустить JAR, я получаю ** Ошибка: не удалось найти или загрузить основной класс **. Если я копирую один и тот же класс (идентичный контент, одно и то же имя) в одно и то же место в JAR вручную, тогда он работает. Любая идея, что может быть проблемой? –

+0

Нет, извините. Возможно, вы можете поделиться некоторым кодом, который воспроизводит проблему? –

+0

Я добавил некоторые детали по оригинальному вопросу. –

 Смежные вопросы

  • Нет связанных вопросов^_^