これが私の問題です。DOSコマンドラインに似たソフトウェアを作成しています。Command
基本クラスを拡張するクラスを含むjarファイルをフォルダーにドロップするだけで、他のコマンドを追加できるようにしたいと思います。私が試したことはまだ何も機能しません。
これが私が試したことです:
- Reflectionsライブラリを使用して、コマンドクラスを拡張するクラスのjarファイルの検索を追加します。
これにより、多くのエラーが発生し、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行目は上記のコードでマークされています。