2015-01-09 51 views
1

运行下载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启动后,我从客户端jar中得到一个异常。客户端jar中的Main尝试在上面的窗格中加载一个FXML文件。这是个例外:

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

我不知道是什么触发了这个错误。当我独立运行它时,客户机jar就像应该那样运行。

我需要从更新罐子的客户端jar加载的所有类?

任何帮助,非常感谢!

回答

2

这是说无法找到该类,因为它不在您的类路径中。

这取决于你如何建立你的应用程序(蚂蚁,Maven的等),因为这决定了.jar文件的位置是已知的,并在该.jar文件,。

如果您使用的是IDE,通常会有某种库占位符,您可以在其中定义您所依赖的.jar文件。

+0

感谢您的回答!我正在动态加载jar,所以当我构建updater jar时它还不存在。此外,我不想将它添加到库中,因为我希望更新程序从磁盘上的目录中打开它。 – bashoogzaad

+0

在这种情况下,您需要确保您使用的是正确的URI/URL形式,并明确了相对或绝对地址。 – Jool

+0

我不知道你的意思是什么。客户端jar运行正常,只有屏幕无法打开,因为它找不到控制器类。也许你可以更新你的答案? – bashoogzaad

3

大家感谢您的帮助。我是能够解决像这样(感谢Jool,你会得到所有的学分):

我下载并拼命地跑客户罐子,假设它会有它自己的引用。但是,正如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()}); 

} 

然后,我只是运行在客户端罐子之前调用addPath(url)