Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка библиотеки из программы, Как загрузить *.jar файл.....? 
:(
    Опции темы
Andyb
  Дата 26.5.2005, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 7.6.2004
Где: Lille, France

Репутация: 4
Всего: 5



Вопрос собственно вот в чем:
Есть программа которая должна загрузить библиотеки
(*.zip и *.jar), а затем использовать их классы.
!java - classpath не подходит, т.к. программка работает через webStart!
... smile если можно
--------------------
 Большинство наших ошибок происходит из-за невнимательности.
PM ICQ   Вверх
Domestic Cat
Дата 26.5.2005, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Не совсем понятно - откуда загрузить? Где архивы ?


--------------------

PM   Вверх
Andyb
Дата 26.5.2005, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 7.6.2004
Где: Lille, France

Репутация: 4
Всего: 5



Цитата
Где архивы ?

архивы на локальной машине - С:\\SQLLIB\java\db2java.zip например
--------------------
 Большинство наших ошибок происходит из-за невнимательности.
PM ICQ   Вверх
tux
Дата 26.5.2005, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 31
Всего: 132



Если речь идет об изменении classpath на лету, могу предложить реализацию расширяемого класс-лоудера.
Код

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;

/**
 * Класс реализует <code>ClassLoader</code>, позволяющий динамически расширять
 * маршрут поиска классов и ресурсов 
 */
public class ExtendableClassLoader extends ClassLoader implements Serializable {

    private Hashtable cache;

    private ArrayList paths;

    private ClassLoader currentLoader = null;

    public ExtendableClassLoader() {
        cache = new Hashtable();
        paths = new ArrayList();
    }

    /**
     * Устанавливает новый загрузчик классов для текущего потока, используя 
     * данный экземпляр класса расширенного загрузчика. Перед установкой
     * выполняется проверка не был ли уже установлен такой загрузчик
     */    
    public void setCurrentThreadClassLoader() {
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        if (loader instanceof ExtendableClassLoader) return;
        else {
            currentLoader = loader;
            Thread.currentThread().setContextClassLoader(this);
        }
    }
    
    /**
     * Добавляет строку в CLASSPATH
     * @param path Добавляемая строка
     */
    public void addClassPath(String path) {
        paths.add(path);
    }

    /**
     * Удаляет строку из CLASSPATH
     * @param path Удаляемая строка
     */
    public void removeClassPath(String path) {
        int index = paths.indexOf(path);
        paths.remove(index);
    }

    /**
     * Преобразует имя пакета в путь к каталогу
     * @param className преобразуемое имя класса
     * @return полученное имя файла
     */
    private String classNameToFileName(String className) {
        return className.replace(
            '.',
            System.getProperty("file.separator").charAt(0))
            + ".class";
    }

    /**
     * Метод ищет класс в созданном CLASSPATH и возвращает массив байтов
     * @param className the class to load
     * @return a byte array containing the byte code of the class
     */
    private byte[] getClassFromAddedClassPaths(String className) {
        
        try {
            ByteArrayOutputStream st = new ByteArrayOutputStream();
            String fsep = System.getProperty("file.separator");
            String fileName = classNameToFileName(className);

            // Поиск класса в добавленных путях поиска
            for (Iterator e = paths.iterator(); e.hasNext();) {
                String path = (String) e.next();
                File pathFile = new File(path);
                if (pathFile.isDirectory()) {
                    File f = new File(path + fsep + fileName);
                    if (f.exists()) {
                        FileInputStream fis = new FileInputStream(f);
                        log.info("Class "+className+" was found in "+path);
                        int length = fis.available();
                        return createByteArray(fis);
                    }
                } else {
                    JarFile jarFile = new JarFile(pathFile);
                    ZipEntry entry = jarFile.getEntry(fileName);
                    if (entry == null) continue;
                    InputStream stream = jarFile.getInputStream(entry);
                    log.info("Class "+className+" was found in "+path);
                    int length = stream.available();
                    return createByteArray(stream);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * Создает массив байтов из входного потока
     * @param in Входной поток
     * @return Массив байтов
     * @throws IOException
     */
    private byte[] createByteArray(InputStream in) throws IOException {
        final int bufferSize = 2048;
        byte result[] = new byte[bufferSize];
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int len = 0;
        while ((len = in.read(result)) != -1) out.write(result, 0, len);
        return out.toByteArray();
    }

    protected URL findResource(String name) {
        byte result[] = null;
        
        URL res = ClassLoader.getSystemResource(name);
        if (res != null) return res;

        try {
            String fsep = System.getProperty("file.separator");

            // Поиск ресура в добавленных маршрутах поиска
            for (Iterator e = paths.iterator(); e.hasNext();) {
                String path = (String) e.next();
                File pathFile = new File(path);
                if (pathFile.isDirectory()) {
                    File f = new File(path + fsep + name);
                    if (f.exists()) return f.toURL();
                } else {
                    JarFile jarFile = new JarFile(pathFile);
                    ZipEntry entry = jarFile.getEntry(name);
                    if (entry == null) return null;
                    String url = createJarResourceURL(pathFile, name, fsep);
                    return new URL(url);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    private String createJarResourceURL(File jarFile, String resourceName, String fsep) throws MalformedURLException {
        String url = "jar:" + jarFile.toURL() + "!" + fsep + resourceName;
        return url; 
    }

    /**
     * @see java.lang.ClassLoader#findClass(java.lang.String)
     */
    protected synchronized Class findClass(String className) throws ClassNotFoundException {
        Class result;
        byte classData[];
        
        log.info("Class to be found: "+className);

        // Проверяем кэш классов. Если класса в кэше нет, тогда применяются другие средства
        result = (Class) cache.get(className);
        if (result != null) {
            return result;
        }

        // Проверяется нет ли такого класса в стандартном пути 
        try {
            // если загрузчик классов текущего потока уже является расширенным,
            // используем сохраненное значение загрузчика классов
            if (Thread.currentThread().getContextClassLoader() instanceof ExtendableClassLoader) {
                if (this.currentLoader == null) throw new ClassNotFoundException();
                else result = this.currentLoader.loadClass(className);
            } else
                result = Thread.currentThread().getContextClassLoader().loadClass(className);
            return result;
        } catch (ClassNotFoundException e) {
            log.info("Class was not found in the default classloader");
        } catch (Exception e) {
            log.info("Exception happens: "+e.getStackTrace());
        }

        // Попытка загрузить класс из добавленного пути
        classData = getClassFromAddedClassPaths(className);
        if (classData == null) {
            throw new ClassNotFoundException();
        }

        // определение класса
        result = super.defineClass(className, classData, 0, classData.length);
        if (result == null) throw new ClassFormatError();

        resolveClass(result);

        // Полученный класс добавляется в кэш классов
        cache.put(className, result);

        return result;
    }

}


PM MAIL Skype GTalk Jabber YIM   Вверх
Domestic Cat
Дата 26.5.2005, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



А почему их нельжя распространять вместе с самим приложением?

Посмотри тут
http://java.sun.com/j2se/1.5.0/docs/guide/....html#resources

и вообще
http://java.sun.com/j2se/1.5.0/docs/guide/...sguide/faq.html


--------------------

PM   Вверх
Andyb
Дата 26.5.2005, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 7.6.2004
Где: Lille, France

Репутация: 4
Всего: 5



Цитата
А почему их нельжя распространять вместе с самим приложением?

В связи с переходом на новую версию базы данных получилась такая ситуация:
у одних стоит старая клиентская часть,которая не работает с новыми библиотеками, у других новая,которая не работает со старыми, а указать могу только одну...

Цитата
реализацию расширяемого класс-лоудера.

надо попробовать! СПАСИБО!
--------------------
 Большинство наших ошибок происходит из-за невнимательности.
PM ICQ   Вверх
Andyb
Дата 26.5.2005, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 7.6.2004
Где: Lille, France

Репутация: 4
Всего: 5



Код

....
ExtendableClassLoader cl = new ExtendableClassLoader();
      cl.addClassPath("C:/SQLLIB/java/db2java.zip");
....

и такой облом:
The driver: COM.ibm.db2.jdbc.app.DB2Driver could not be loaded. This could be a problem with the driver itself, or that the driver is not found on the classpath.

при запуске, может что не так делаю? smile
--------------------
 Большинство наших ошибок происходит из-за невнимательности.
PM ICQ   Вверх
Domestic Cat
Дата 26.5.2005, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



А у него права есть читать с локальной машины?


--------------------

PM   Вверх
tux
Дата 26.5.2005, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 31
Всего: 132



Попробуй установить класслоудер текущего потока
Код

public void setCurrentThreadClassLoader();

или грузить нужные классы таким способом:
Код

ExtendableClassLoader loader = new ExtendableClassLoader();
...
Object obj = loader.loadClass(className).newInstance();


PM MAIL Skype GTalk Jabber YIM   Вверх
Andyb
Дата 26.5.2005, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 7.6.2004
Где: Lille, France

Репутация: 4
Всего: 5



Цитата
А у него права есть читать с локальной машины?

права есть, причем полные-в jnlp файле определяются
--------------------
 Большинство наших ошибок происходит из-за невнимательности.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.