簡體   English   中英

在 jar 中加載外部庫

[英]Load an external library inside a jar

我有一個動態加載的 jar 文件,里面有我在 main 中使用的 lib/另一個 jar(外部庫)(import it.xxx.xx)。 如何在類路徑中動態加載這個外部庫? 我的代碼不起作用:

public static void runOne(String jar, String class_name, Optional<String> test_name, 
TestExecutionListener listener) throws Exception {
        Launcher launcher = LauncherFactory.create();
        
        ClassLoader loader = URLClassLoader.newInstance(
                new URL[] { new File(pathJars+"/"+jar).toURI().toURL() },
                ServiceUtil.class.getClassLoader()
        );

        loader.getClass(); 

        addURL(loader); <--here i want add a jar to classpath!

        Class cls=loader.loadClass(class_name);
        Constructor constructor = cls.getConstructor();
        constructor.newInstance();

        LauncherDiscoveryRequest request;
        if (test_name.isPresent()) {
            Method m = cls.getMethod(test_name.get());
            request = LauncherDiscoveryRequestBuilder.request()
                    .selectors(selectMethod(cls,m))
                    .build();
        }
        else{
            request = LauncherDiscoveryRequestBuilder.request()
                    .selectors(selectClass(cls))
                    .build();
        }

        TestPlan testPlan = launcher.discover(request);
        launcher.registerTestExecutionListeners(listener);
        launcher.execute(request);
        //launcher.execute(request);
        loader=null;
        System.gc();

    }
    public static void addURL(ClassLoader loader) throws IOException {
        URL u=loader.getResource("lib/sem-platform-sdk-1.0-SNAPSHOT.jar");
        Class[] parameters = new Class[]{URL.class};
        URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        Class sysclass = URLClassLoader.class;

        try {
            Method method = sysclass.getDeclaredMethod("addURL", parameters);
            method.setAccessible(true);
            method.invoke(sysloader, new Object[]{u});
        } catch (Throwable t) {
            t.printStackTrace();
            throw new IOException("Error, could not add URL to system classloader");
        }//end try catch

    }//end method

謝謝

這通常是通過構建工具(例如 maven 或 gradle)完成的。 我不知道您是否正在使用其中之一。 他們讓生活變得更輕松。

我們使用 Maven 和 Apache Shade 插件來做到這一點。 Maven 具有自動為您設置配置的命令,然后您將 Shade 插件添加到生成的配置文件 (pom.xml) 中。

https://maven.apache.org/plugins/maven-shade-plugin/index.html

如果我正確理解您的問題,您希望從 jar 文件加載的類能夠訪問嵌套 jar 文件中的類。 您可以通過創建一個 ClassLoader 來實現這一點,其中一個條目用於 jar 文件,另一個條目用於嵌套的 jar 文件。

Java 有一個特殊的 URL 方案jar: ,用於直接引用 jar 條目。 (這個方案和語法在JarURLConnection 的文檔中有描述。)所以你可以這樣構造你的類加載器:

    URL jarURL = new File(pathJars+"/"+jar).toURI().toURL();
    URL semURL = new URL("jar:" + jarURL + "!/"
        + "lib/sem-platform-sdk-1.0-SNAPSHOT.jar");

    ClassLoader loader = URLClassLoader.newInstance(
            new URL[] { jarURL, semURL },
            ServiceUtil.class.getClassLoader()
    );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM