簡體   English   中英

無法運行從其他jar下載的jar

[英]Unable to run downloaded jar from other jar

我目前有以下問題:

我創建了一個更新器 jar,從該下載器中下載了一個客戶端 jar並將其放置在某個目錄中(就在磁盤上的某個位置,與更新器jar的目錄無關)。 我使用以下代碼從更新程序運行客戶端jar:

private void startApplication() {

    String url = getFilePath()+"client.jar";

    URL parsedURL = null;
    try {
        parsedURL = new File(url).toURI().toURL();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }

    ClassLoader loader = URLClassLoader.newInstance(new URL[]{parsedURL}, getClass().getClassLoader());
    Class<?> cl = null;
    try {
        cl = Class.forName("org.myApp.client.mainPackage.Main", true, loader);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    finally {
        loader = null;
    }

    Class<? extends Application> runClass = cl.asSubclass(Application.class);
    // Avoid Class.newInstance, for it is evil.
    Constructor<? extends Application> ctor = null;
    try {
        ctor = runClass.getConstructor();
    } catch (NoSuchMethodException | SecurityException e) {
        e.printStackTrace();
    }

    Application doRun = null;
    try {
        doRun = ctor.newInstance();
    } catch (InstantiationException | IllegalAccessException
            | IllegalArgumentException | InvocationTargetException e) {
        e.printStackTrace();
    }

    try {
        doRun.start(primaryStage);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

這段代碼似乎有效,因為client.jar的Main已運行。 但是,在其Main啟動之后,我從客戶端jar中獲得了異常。 客戶端jar中的Main試圖在上方窗格中加載FXML文件。 這是例外:

ClassNotFoundException: org.myApp.client.lockscreen.LockscreenController when loading a FXML file

我不知道是什么觸發了此錯誤。 當我獨立運行客戶端jar時,它應該按預期運行。

我是否需要從更新程序jar中加載客戶端jar中的所有類?

任何幫助是極大的贊賞!

大家謝謝您的幫助。 我能夠這樣修復它(感謝喬爾,您將獲得全部學分):

我下載並運行了客戶端jar,並假設它具有自己的引用。 但是,正如Jool所說,我必須將導演添加到課程路徑中。 我做錯了,是我添加了目錄,而不是Jar文件。 您還必須添加JAR文件! 我用這段代碼做到了:

public void addPath(String s) throws Exception {

    File f = new File(s);
    URI u = f.toURI();
    URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
    Class<URLClassLoader> urlClass = URLClassLoader.class;
    Method method = urlClass.getDeclaredMethod("addURL", new Class[]{URL.class});
    method.setAccessible(true);
    method.invoke(urlClassLoader, new Object[]{u.toURL()});

}

然后在運行客戶端jar之前,我只調用了addPath(url)

就是說找不到該類,因為它不在您的類路徑中。

這取決於您如何構建應用程序(Ant,Maven等),因為這確定了.jar文件的位置以及.jar文件的位置。

如果使用的是IDE,通常會有某種庫占位符,您可以在其中定義依賴的.jars。

暫無
暫無

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

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