所以这是我的问题.我正在创建一个类似于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> set = new HashSet>();
JarFile jar = null;
try {
jar = new JarFile(file);
Enumeration 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行已在上述代码中标记.
最佳答案 当我过去需要这样做时,我使用了第2点和第3点的组合,即我将jar文件添加到类路径中,然后遍历它列出它包含的文件以计算类的名称,并使用Class.forName(…)加载它们,以便我可以检查它们是否是我需要执行处理的类.
另一个选择是要求在jar文件的清单中标识类,或者通过其他元数据机制标识类.