AppUpdater.java:动态加载和执行重新打包后的JAR文件,扩展程序适用范围

import java.io.*;
import java.net.URL;
import java.net.URLClassLoader;
import java.lang.reflect.Method;
import java.util.jar.JarFile;

public class AppUpdater {
    private String jarPath;
    private URLClassLoader classLoader;
    
    public AppUpdater(String jarPath) {
        this.jarPath = jarPath;
    }
    
    public void loadJar() throws Exception {
        File jarFile = new File(jarPath);
        URL jarUrl = jarFile.toURI().toURL();
        classLoader = new URLClassLoader(new URL[]{jarUrl});
    }
    
    public void executeMain(String className, String[] args) throws Exception {
        if (classLoader == null) {
            throw new IllegalStateException("JAR包未加载");
        }
        
        Class<?> mainClass = classLoader.loadClass(className);
        Method mainMethod = mainClass.getMethod("main", String[].class);
        mainMethod.invoke(null, (Object) args);
    }
    
    public void close() {
        if (classLoader != null) {
            try {
                classLoader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("用法: java AppUpdater <JAR路径> <主类名> [程序参数...]");
            return;
        }
        
        String jarPath = args[0];
        String mainClass = args[1];
        String[] programArgs = new String[args.length - 2];
        System.arraycopy(args, 2, programArgs, 0, programArgs.length);
        
        AppUpdater updater = new AppUpdater(jarPath);
        try {
            updater.loadJar();
            updater.executeMain(mainClass, programArgs);
        } catch (Exception e) {
            System.err.println("执行失败: " + e.getMessage());
            e.printStackTrace();
        } finally {
            updater.close();
        }
    }
}

 

posted @ 2026-01-21 13:09  血月葬花魂  阅读(2)  评论(0)    收藏  举报