我目前遇到以下问题:
我创建了一个更新程序 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中的所有类?
非常感谢任何帮助!
答案 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。