Для моей текущей работы мне нужно было предоставить исполняемый файл jar, который мог бы загружать файлы jar внутри себя и выполнять второй метод main (). В основном, это начальная загрузка main () и приложение main ().
Шаг 1. В манифесте "main-class" вы помещаете свой класс начальной загрузки
Шаг 2. Когда ваш класс начальной загрузки запускает, он разархивирует свой собственный jar и все jar внутри него во временный каталог. Используйте что-то вроде строки ниже, чтобы получить свою собственную банку.
Main.class.getProtectionDomain().getCodeSource().getLocation().toURI()
Шаг 3. Ваш класс начальной загрузки обнаруживает ОС через свойство "os.name" и загружает соответствующие jar-файлы из временного каталога с помощью этого
private static void loadJarIntoClassloader( URL u ) throws Exception
{
URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class<URLClassLoader> sysclass = URLClassLoader.class;
Method method = sysclass.getDeclaredMethod("addURL", URL.class);
method.setAccessible(true);
method.invoke(sysLoader, new Object[]{u});
}
Шаг 4. Теперь вы сможете запустить приложение, вызвав приложение main ().
ПРИМЕЧАНИЕ. Этот небольшой хак зависит от вашей JVM, использующей URLClassLoader
в качестве SystemClassLoader, что справедливо для Sun JVM, но не обязательно для других.
Таким образом, вы можете доставить только одну банку, и она распакует себя и будет работать с правильными банками.