微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Wildfly 15 中动态加载 Jar 类

如何解决如何在 Wildfly 15 中动态加载 Jar 类

*在运行时尝试使用以下方法加载外部示例 .jar 时出现以下异常: Class clazz = Class.forName(jarClass);.

异常: 来自服务模块加载器的模块“部署 .test.war”] java.lang.classNotFoundException: org.abc.xyz.def.abc.Sample 来自 [Module "deployment.test.war" from Service Module Loader]

*然后将类加载器从“this.getClass().getClassLoader()”修改为“ClassLoader.getSystemClassLoader()”但随后它开始抛出以下异常:

deployment.test.war//org.abc.pqr.tasks.JavaDataPlayTask$1.run(JavaDataPlayTask.java:450) - Java 数据播放包执行失败:org/abc/pqr/tasks/DataPlay java.lang.NoClassDefFoundError: org/abc/pqr/tasks/DataPlay

*执行动态类加载的一段代码在 Main.jar 中 * Sample.jar 中的类实现了 Main.jar 中可用的“DataPlay”接口

尝试过以下链接中定义的方法,但没有一个我有用:

https://access.redhat.com/documentation/en-us/jboss_enterprise_application_platform/6.2/html/development_guide/sect-use_the_class_loader_programmatically_in_a_deployment

https://kostenko.org/blog/2019/06/runtime-class-loading.html

https://www.programmersought.com/article/99402552966/

https://coderanch.com/t/614007/java/Dynamic-loading-class-external-jar

https://www.programmersought.com/article/37026364495/

Jar hell: how to use a classloader to replace one jar library version with another at runtime

How to load classes from jar file at runtime?

Load jar dynamically at runtime?

*以下链接中提到的方法是否合适? https://access.redhat.com/documentation/en-us/jboss_enterprise_application_platform/6/html/migration_guide/find_the_jboss_module_dependency1

*Java 平台模块系统是解决此问题的唯一方法吗?

public class ClasspathHacker {
private static Logger log = Logger.getLogger(ClasspathHacker.class);

private static final Class[] parameters = new Class[] { URL.class };

public static void addFile(String s) throws IOException {
    File f = new File(s);
    addFile(f);
}// end method

public static void addFile(File f) throws IOException {
    addURL(f.toURL());
}// end method

public static void addURL(URL u) throws IOException {

    log.debug("Loading jar file: "+u);
    
    try {
        doClasssLoading(ClassLoader.getSystemClassLoader(),u);
    } catch (Throwable t) {
        log.debug("Error,Could not add URL to system classloader");
        throw new IOException(
                "Error,Could not add URL to system classloader");
    }// end try catch

}// end method

public static void addJar(String jarPath,ClassLoader classLoader) throws IOException {
    File f = new File(jarPath);
    URL u = f.toURL();
    log.debug("Class loader class: "+classLoader.getClass());
    log.debug("Loading jar file: "+u);
    
    log.debug("System class loader class: "+ClassLoader.getSystemClassLoader().getClass());

    try {
        doClasssLoading(classLoader,u);
    } catch (Throwable t) {
        // t.printstacktrace();
        log.debug("Error,Could not add URL to system classloader");
    }// end try catch
}

private static void doClasssLoading(ClassLoader classLoader,URL url) {
    if (classLoader instanceof urlclassloader) {
        log.info("Type of URL ClassLoader");
        urlclassloader sysloader = (urlclassloader)classLoader;
        Class sysclass = urlclassloader.class;
        try {
            Method method = sysclass.getDeclaredMethod("addURL",new Class[] { URL.class });
            method.setAccessible(true);
            method.invoke(sysloader,new Object[] { url });
        } catch (Exception var5) {
            var5.printstacktrace();
            throw new IllegalStateException(var5.getMessage(),var5);
        } 
    } else {
        log.info("Not of type of URL ClassLoader");
        try {
            Field field = classLoader.getClass().getDeclaredField("ucp");
            field.setAccessible(true);
            Object ucp = field.get(classLoader);
        
            Method method = ucp.getClass().getDeclaredMethod("addURL",new Class[] { URL.class });
            method.setAccessible(true);
            method.invoke(ucp,new Object[] { url });
        } catch (Exception exception) {
            exception.printstacktrace();
            throw new IllegalStateException(exception.getMessage(),exception);
        } 
    } 
}
  
public static String getMainClass(String jarPath) throws IOException {
    JarFile jarFile = new JarFile(new File(jarPath));
    Attributes attributes = jarFile.getManifest().getMainAttributes();
    String className = attributes.getValue("Main-Class");
    return className;
}

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。