无法 运行 从其他 jar 下载 jar
Unable to run downloaded jar from other jar
我目前遇到以下问题:
我创建了一个 updater jar,从中下载了一个 client 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 得到了 运行ned。但是,在其 Main 启动后,我从客户端 jar 中得到一个异常。客户端 jar 中的 Main 尝试在上部窗格中加载 FXML 文件。这是例外情况:
ClassNotFoundException: org.myApp.client.lockscreen.LockscreenController when loading a FXML file
我不知道是什么触发了这个错误。当我 运行 它独立时,客户端 jar 应该是 运行s。
我是否需要从更新程序 jar 从客户端 jar 加载所有 类?
非常感谢任何帮助!
说找不到 class 因为它不在你的 class 路径上。
这取决于您构建应用程序的方式(Ant、Maven 等),因为这决定了 .jar 文件位置的已知方式以及 .jar 文件所在的位置。
如果您使用 IDE,通常会有某种库占位符,您可以在其中定义您所依赖的 .jars。
谢谢大家的帮助。我能够像这样修复它(感谢 Jool,你将获得所有学分):
我下载并运行了客户端 jar,假设它有自己的引用。但是,正如 Jool 所说,我必须将导演添加到 class 路径。我做错了什么,是我添加了目录,而不是 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)
。
我目前遇到以下问题:
我创建了一个 updater jar,从中下载了一个 client 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 得到了 运行ned。但是,在其 Main 启动后,我从客户端 jar 中得到一个异常。客户端 jar 中的 Main 尝试在上部窗格中加载 FXML 文件。这是例外情况:
ClassNotFoundException: org.myApp.client.lockscreen.LockscreenController when loading a FXML file
我不知道是什么触发了这个错误。当我 运行 它独立时,客户端 jar 应该是 运行s。
我是否需要从更新程序 jar 从客户端 jar 加载所有 类?
非常感谢任何帮助!
说找不到 class 因为它不在你的 class 路径上。
这取决于您构建应用程序的方式(Ant、Maven 等),因为这决定了 .jar 文件位置的已知方式以及 .jar 文件所在的位置。
如果您使用 IDE,通常会有某种库占位符,您可以在其中定义您所依赖的 .jars。
谢谢大家的帮助。我能够像这样修复它(感谢 Jool,你将获得所有学分):
我下载并运行了客户端 jar,假设它有自己的引用。但是,正如 Jool 所说,我必须将导演添加到 class 路径。我做错了什么,是我添加了目录,而不是 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)
。