Ich arbeite an der Optimierung einer Spring Boot-Anwendung, indem ich Abhängigkeiten zur Laufzeit herunterlade, anstatt sie in die endgültige JAR-Datei zu packen. Obwohl ich den Download-Mechanismus erfolgreich implementiert habe, erkennt Spring Boot diese dynamisch geladenen Abhängigkeiten nicht, obwohl sie über den Java ClassLoader zugänglich sind. Ziel:
Reduzieren Sie die endgültige JAR-Größe durch:
Abhängigkeiten aus dem kompilierten JAR ausschließen
Erforderliche Abhängigkeiten herunterladen unter Laufzeit
Dynamisches Laden mit URLClassLoader
Mein Hintergrund
Ich habe online nach möglichen Lösungen gesucht, aber keine gefunden. Ich habe zuvor bei der Entwicklung von Minecraft-Plugins mit Libby etwas Ähnliches mit Core Java gehandhabt, bin mir aber nicht sicher, ob das mit Spring Boot machbar ist. Obwohl ich KI-Tools verwendet habe, um einige Abhängigkeitsprobleme zu lösen, stecke ich jetzt an diesem Punkt fest. Meine aktuelle Implementierung
DependancyLoader.java
Ich arbeite an der Optimierung einer Spring Boot-Anwendung, indem ich Abhängigkeiten zur Laufzeit herunterlade, anstatt sie in die endgültige JAR-Datei zu packen. Obwohl ich den Download-Mechanismus erfolgreich implementiert habe, erkennt Spring Boot diese dynamisch geladenen Abhängigkeiten nicht, obwohl sie über den Java ClassLoader zugänglich sind. [b]Ziel:[/b] Reduzieren Sie die endgültige JAR-Größe durch: [list] [*]Abhängigkeiten aus dem kompilierten JAR ausschließen [*]Erforderliche Abhängigkeiten herunterladen unter Laufzeit [*]Dynamisches Laden mit URLClassLoader [/list] [b]Mein Hintergrund[/b] Ich habe online nach möglichen Lösungen gesucht, aber keine gefunden. Ich habe zuvor bei der Entwicklung von Minecraft-Plugins mit Libby etwas Ähnliches mit Core Java gehandhabt, bin mir aber nicht sicher, ob das mit Spring Boot machbar ist. Obwohl ich KI-Tools verwendet habe, um einige Abhängigkeitsprobleme zu lösen, stecke ich jetzt an diesem Punkt fest. [b]Meine aktuelle Implementierung[/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] Protokoll der Startkonsole Java konnte JDA laden (eine der Bibliotheken erfolgreich) [code]INFO: JDA dependency loaded successfully[/code] aber es wirft die Klasse aus, die später aus irgendeinem Grund nicht gefunden wurde. [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
Ich arbeite an der Optimierung einer Spring Boot-Anwendung, indem ich Abhängigkeiten zur Laufzeit herunterlade, anstatt sie in die endgültige JAR-Datei zu packen. Obwohl ich den Download-Mechanismus...
Ich habe eine Java -Anwendung, die Log4j2 zum Protokollieren verwendet. Ich möchte steuern, welcher Appender zur Laufzeit verwendet wird-aber nur über ein Shell-Skript, ohne den Java-Quellcode zu...
Ich habe eine Java -Anwendung, die Log4j2 zum Protokollieren verwendet. Ich möchte steuern, welcher Appender zur Laufzeit verwendet wird-aber nur über ein Shell-Skript, ohne den Java-Quellcode zu...
In meiner Spring -Anwendung lade ich die Anwendung.Properties Datei außerhalb der Anwendung, z. /User/home/properties/application.properties . Die Werte in der Datei werden über @Value -Annotation in...