【发布时间】:2013-03-10 04:06:39
【问题描述】:
所以这是我的问题。我正在创建一个类似于 DOS 命令行的软件。我希望人们能够通过简单地将包含扩展基本Command 类的类的 jar 文件放入文件夹中来添加其他命令。我没有尝试过任何方法。
这是我尝试过的:
-
使用 Reflections 库添加在 jar 文件中搜索扩展 Command 类的类
这引发了很多错误,只是没有在我的 jar 中找到大多数类。我认为这与发生的所有SomeClass$1.class事情有关。 -
遍历 jar 中的每个文件并将其添加到类路径中
我找不到让它工作的方法,因为我根本无法将ZipEntry的迭代转换为可以添加到类路径中的任何内容,例如 URL。 -
将整个 jar 添加到类路径
这也不起作用,因为程序不知道这些类的名称,因此不能将它们转换为命令。
我想在这里得到一些帮助。任何关于如何使我的程序更具可扩展性的建议都将非常受欢迎。包含代码的 +1 ;)
如果您需要任何进一步的信息,请告诉我。
编辑:
新代码:
URLClassLoader ucl = (URLClassLoader) ClassLoader.getSystemClassLoader();
for(File file : FileHelper.getProtectedFile("/packages/").listFiles()) {
if(file.getName().endsWith(".jar")) {
Set<Class<?>> set = new HashSet<Class<?>>();
JarFile jar = null;
try {
jar = new JarFile(file);
Enumeration<JarEntry> entries = jar.entries();
while(entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if(!entry.getName().endsWith(".class"))
continue;
Class<?> clazz;
try {
clazz = ucl.loadClass(entry.getName().replace("/", ".").replace(".class", "")); // THIS IS LINE 71
} catch(ClassNotFoundException e) {
e.printStackTrace();
continue;
}
if(entry.getName().contains("$1"))
continue;
if(clazz.getName().startsWith("CMD_"))
set.add(clazz);
jar.close();
}
} catch(Exception e) {
//Ignore file
try {
jar.close();
} catch (IOException e1) {/* Don't worry about it too much... */}
OutputHelper.log("An error occurred whilst adding package " + OutputStyle.ITALIC + file.getName() + OutputStyle.DEFAULT + ". " + e.getMessage() + ". Deleting package...", error);
e.printStackTrace();
file.delete();
}
抛出的错误:
java.lang.ClassNotFoundException: com.example.MyCommands.CMD_eggtimer
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.MyWebsite.MyApplication.Commands.CommandList.update(CommandList.java:71)
上面的代码中已经标记了第 71 行。
【问题讨论】:
-
查看
java.util.jar.JarFile在stackoverflow.com/questions/9796814/… 中的用法,您将了解如何从jar 文件中获取类列表 -
但是你可以对 ZipFile 做同样的事情,这也会使用更少的内存......但问题不是找到类,而是将它们添加到类路径并保留它们的实例我可以在运行命令时运行...