无法从其他jar运行下载的jar

时间:2015-01-09 11:42:27

标签: java 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中的所有类?

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

每个人都感谢你的帮助。我能够像这样修理它(感谢Jool,你将得到所有的学分):

我下载并运行了客户端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)

答案 1 :(得分:2)

这是说找不到类,因为它不在你的类路径上。

这取决于您构建应用程序的方式(Ant,Maven等),因为这决定了.jar文件的位置是如何知道的,以及.jar文件的位置。

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