Я работаю над оптимизацией приложения Spring Boot, загружая зависимости во время выполнения, а не упаковывая их в окончательный JAR-файл. Хотя я успешно реализовал механизм загрузки, Spring Boot не может распознать эти динамически загружаемые зависимости, хотя они доступны через Java ClassLoader. Цель:
Уменьшите окончательный размер JAR-файла:
Исключив зависимости из скомпилированного JAR-файла
Загрузив необходимые зависимости по адресу время выполнения
Загрузка их динамическое использование URLClassLoader
Моя информация
Я искал в Интернете возможные решения, но не нашел их. Ранее я обрабатывал нечто подобное, используя ядро Java, при разработке плагинов Minecraft с помощью Libby, но я не уверен, осуществимо ли это с помощью Spring Boot. Хотя я использовал инструменты искусственного интеллекта для решения некоторых проблем с зависимостями, сейчас я застрял на этом этапе. Моя текущая реализация
DependancyLoader.java
Я работаю над оптимизацией приложения Spring Boot, загружая зависимости во время выполнения, а не упаковывая их в окончательный JAR-файл. Хотя я успешно реализовал механизм загрузки, Spring Boot не может распознать эти динамически загружаемые зависимости, хотя они доступны через Java ClassLoader. [b]Цель:[/b] Уменьшите окончательный размер JAR-файла: [list] [*]Исключив зависимости из скомпилированного JAR-файла [*]Загрузив необходимые зависимости по адресу время выполнения [*]Загрузка их динамическое использование URLClassLoader [/list] [b]Моя информация[/b] Я искал в Интернете возможные решения, но не нашел их. Ранее я обрабатывал нечто подобное, используя ядро Java, при разработке плагинов Minecraft с помощью Libby, но я не уверен, осуществимо ли это с помощью Spring Boot. Хотя я использовал инструменты искусственного интеллекта для решения некоторых проблем с зависимостями, сейчас я застрял на этом этапе. [b]Моя текущая реализация[/b] DependancyLoader.java [code]package com.hapangama.sunlicense.boot;
@Service public class DependencyLoader { private static final Logger LOGGER = Logger.getLogger(DependencyLoader.class.getName()); private static final String DEPENDENCIES_DIR = "BOOT-INF/lib";
public static void initializeDependencies() throws Exception { // Create libs directory if it doesn't exist File libsDir = new File(DEPENDENCIES_DIR); if (!libsDir.exists()) { libsDir.mkdirs(); }
// Initialize Maven components RepositorySystem system = Booter.newRepositorySystem(); DefaultRepositorySystemSession session = Booter.newRepositorySystemSession(system); session.setLocalRepositoryManager( system.newLocalRepositoryManager( session, new LocalRepository(libsDir.getAbsolutePath()) ) );
// Define repositories List repositories = Arrays.asList( new RemoteRepository.Builder("central", "default", "https://repo.maven.apache.org/maven2/") .setPolicy(new RepositoryPolicy(true, RepositoryPolicy.UPDATE_POLICY_DAILY, RepositoryPolicy.CHECKSUM_POLICY_WARN)) .build(), new RemoteRepository.Builder("spring-releases", "default", "https://repo.spring.io/release") .setPolicy(new RepositoryPolicy(true, RepositoryPolicy.UPDATE_POLICY_DAILY, RepositoryPolicy.CHECKSUM_POLICY_WARN)) .build(), new RemoteRepository.Builder("jcenter", "default", "https://jcenter.bintray.com") .setPolicy(new RepositoryPolicy(true, RepositoryPolicy.UPDATE_POLICY_DAILY, RepositoryPolicy.CHECKSUM_POLICY_WARN)) .build(), new RemoteRepository.Builder("vaadin-addons", "default", "https://maven.vaadin.com/vaadin-addons") .setPolicy(new RepositoryPolicy(true, RepositoryPolicy.UPDATE_POLICY_DAILY, RepositoryPolicy.CHECKSUM_POLICY_WARN)) .build() );
// Define dependencies List dependencies = Arrays.asList( // Spring Boot dependencies new Dependency(new DefaultArtifact("org.springframework.boot:spring-boot-starter-data-jpa:2.5.4"), "runtime"), new Dependency(new DefaultArtifact("org.springframework.boot:spring-boot-starter-security:2.5.4"), "runtime"),
// Vaadin and related dependencies new Dependency(new DefaultArtifact("com.vaadin:vaadin-spring-boot-starter:24.0.0"), "runtime"), new Dependency(new DefaultArtifact("in.virit:viritin:2.10.1"), "runtime"), new Dependency(new DefaultArtifact("com.github.appreciated:apexcharts:24.0.1"), "runtime"), new Dependency(new DefaultArtifact("org.parttio:starpass-theme:1.0.4"), "runtime"), new Dependency(new DefaultArtifact("org.vaadin.crudui:crudui:7.1.2"), "runtime"),
// Database new Dependency(new DefaultArtifact("com.h2database:h2:2.1.214"), "runtime"),
// Utility libraries new Dependency(new DefaultArtifact("org.modelmapper:modelmapper:3.2.0"), "runtime"),
// Discord integration new Dependency(new DefaultArtifact("net.dv8tion:JDA:5.2.1"), "runtime") );
@Theme(value = "sun") @SpringBootApplication(exclude = ErrorMvcAutoConfiguration.class) public class SunLicenseApplication implements AppShellConfigurator {
public static void main(String[] args) { try { // Initialize dependencies before starting Spring DependencyLoader.initializeDependencies();
// Get the context class loader that has our dependencies ClassLoader customClassLoader = Thread.currentThread().getContextClassLoader();
// Create Spring application SpringApplication app = new SpringApplication(SunLicenseApplication.class);
Properties properties = new Properties(); properties.put("spring.main.allow-bean-definition-overriding", "true"); properties.put("spring.main.allow-circular-references", "true");
app.setDefaultProperties(properties);
// Important: Set both resource loader and context class loader app.setResourceLoader(new DefaultResourceLoader(customClassLoader)); Thread.currentThread().setContextClassLoader(customClassLoader);
[/code] Журнал консоли запуска Java удалось загрузить JDA (одна из библиотек успешно) [code]INFO: JDA dependency loaded successfully[/code] но он по какой-то причине выдает класс, который позже не найден. [code]Caused by: java.lang.ClassNotFoundException: net.dv8tion.jda.api.hooks.ListenerAdapter[/code] https://paste.hapangama.com/egewawovif.properties Pom.xml [code] xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0
Я использую пример отсюда с maven-resolver 1.9.20 для простого разрешения транзитивных зависимостей в стиле hello world:
var repoSystem = new RepositorySystemSupplier().get();
var session = MavenRepositorySystemUtils.newSession();
При переносе моего проекта с Ubuntu на Mac я скопировал зависимости и файлы Java из ~/.gradle/cache на Ubuntu в ~/.gradle/caches/artifacts на Mac, чтобы избежать имея gradle, снова загрузите зависимости. К моему удивлению, запуск gradle idea (мы...
Я работаю над проектом, в котором пытаюсь создавать отчеты с использованием API BIRT с помощью кода Java. Однако мне не удалось найти последние зависимости времени выполнения BIRT. Доступны только версии до 4.8. Кто-нибудь знает, где я могу получить...
Я работаю над проектом, в котором пытаюсь создавать отчеты с использованием API BIRT с помощью кода Java. Однако мне не удалось найти последние зависимости времени выполнения BIRT. Доступны только версии до 4.8. Кто-нибудь знает, где я могу получить...
Я работаю над приложением Flask, в котором пользователи могут планировать встречи. В моем приложении есть форма, в которой пользователи могут выбрать отделение, а затем выбрать врача из этого отделения. Как динамически загружать врачей. Мне...