Класс открытия, отражения, банки и jnlp - PullRequest
0 голосов
/ 05 января 2011

В нашей системе у нас есть механизм плагинов, позволяющий нам создавать неизвестные классы во время выполнения.

Имея каталог или банку в пути к классам, система способна исследовать содержащиеся в ней классы, и, если класс реализует определенный интерфейс, его можно создать и использовать в качестве плагина.

Все упаковано в банки и работает хорошо и хорошо. Однако при попытке связать его как приложение веб-запуска этот механизм, похоже, выходит из строя.

В частности, кажется, что открытие классов больше не работает:

public static Collection<String> getAllClassFiles()
{
    Collection<String> all_files = new ArrayList<String>();

    String pathSep = System.getProperty("path.separator");
    String classpath = System.getProperty("java.class.path");

    for (String path : classpath.split(pathSep))
    {
        File filepath = new File(path);

        if (filepath.isDirectory()) 
        {
            all_files.addAll(dirContent(filepath));
        } 
        else if (path.endsWith(".jar")) 
        {

            JarFile jar;
            try {
                jar = new JarFile(filepath);
            } 
            catch (IOException e) {
                Log.warning("WARNING: " + filepath + " could not be opened!");
                continue;
            }

            for (Enumeration<JarEntry> entries = jar.entries(); entries
                    .hasMoreElements();)
            {
                JarEntry entry = entries.nextElement();
                if (entry.getName().endsWith(".class"))
                    all_files.add(entry.getName());
            }
        } 
        else if (path.endsWith(".class")) {
            all_files.add(path);
        } 
        else {
            Log.warning("Warning: corrupt classpath entry: " + path);
        }

    }
    return all_files;
}

Итак ... это работает при вызове системы напрямую с использованием jar-файлов ... но больше не с webstart, несмотря на то, что все jar-файлы подписаны и включены.

Есть идеи, как сохранить работу с веб-стартом?

1 Ответ

0 голосов
/ 05 января 2011

Вам может повезет, если вы загрузите контекстный загрузчик классов и попытаетесь получить его URL [] с последующей передачей контента.

Не думаю, что это было бы хорошоидея тоже.Java не построена вокруг отражения контента таким образом.Но предоставляется, возможно, менее элегантная возможность чтения файлов метаданных, например, с помощью Thread.getContextClassLoader().getResources("META-INF/plugins.txt"), где вы можете определить создаваемые экземпляры классов.

Или, что еще более упрощенно, использовать ServiceLoader.

В зависимости от вашего класпата и банок, это все равно быстрее, чем полная загрузка каждого класса вокруг ...

...