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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка классов из .jar 
V
    Опции темы
diablero
Дата 13.5.2007, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Есть программа, в обязанности которой входит построение диаграмм и графиков, для чего была выбранна библиотека JFREECHART.
Мне необходимо нужные jar файлы поместить в свой, jar программы. И в случае необходимости подгружать нужные классы для соответствующих графиков.
Просмотрел форум, статью про класс лоадер, и в данном случае не могу с этой задачей справиться. Вот пример тест.
Код

import org.jfree.ui.RefineryUtilities;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class ClassLoaderTest {
    private static final Class[] parameters = new Class[]{URL.class};

    public static void main(String[] args) throws Exception {
        new ClassLoaderTest().go();
    }
    private static void loadJARLibraries(URL url) {
        URLClassLoader sysloader = (URLClassLoader)ClassLoader.getSystemClassLoader();
        Class sysclass = URLClassLoader.class;
        try {
            Method method = sysclass.getDeclaredMethod("addURL", parameters);
            method.setAccessible(true);
            method.invoke(sysloader,new Object[]{ url });
        } catch (Throwable t) {

        }
    }
    private void go() throws Exception {

        try {
            loadJARLibraries(ClassLoader.getSystemResource("lib/jcommon-1.0.9.jar"));
            loadJARLibraries(ClassLoader.getSystemResource("jfreechart-1.0.5.jar"));
        } catch (Exception e) {

        }
        PieChartDemo1 demo = new PieChartDemo1("Pie Chart Demo 1");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}

Код

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.ui.ApplicationFrame;

import javax.swing.*;
import java.awt.*;

public class PieChartDemo1 extends ApplicationFrame {
    public PieChartDemo1(String title) {
        super(title);
        setContentPane(createDemoPanel());
    }
    private static PieDataset createDataset() {
        DefaultPieDataset dataset = new DefaultPieDataset();
        dataset.setValue("One", new Double(43.2));
        dataset.setValue("Two", new Double(10.0));
        dataset.setValue("Three", new Double(27.5));
        dataset.setValue("Four", new Double(17.5));
        dataset.setValue("Five", new Double(11.0));
        dataset.setValue("Six", new Double(19.4));

        return dataset;
    }
    private static JFreeChart createChart(PieDataset dataset) {

        JFreeChart chart = ChartFactory.createPieChart(
            "Pie Chart Demo 1",  // chart title
            dataset,             // data
            true,               // include legend
            true,
            false
        );

        PiePlot plot = (PiePlot) chart.getPlot();
        plot.setSectionOutlinesVisible(false);
        plot.setLabelFont(new Font("SansSerif", Font.PLAIN, 12));
        plot.setNoDataMessage("No data available");
        plot.setCircular(false);
        plot.setLabelGap(0.02);
        return chart;

    }
    public static JPanel createDemoPanel() {
        JFreeChart chart = createChart(createDataset());
        return new ChartPanel(chart);
    }

}


Получаю всегда одно и тоже
Код

D:\test\classes>java -jar ClassLoaderTest.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/jfree/ui/Applicat
ionFrame
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(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 java.lang.ClassLoader.loadClassInternal(Unknown Source)
        at ClassLoaderTest.go(ClassLoaderTest.java:32)
        at ClassLoaderTest.main(ClassLoaderTest.java:12)


Это сообщение отредактировал(а) diablero - 13.5.2007, 18:12


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
w1nd
Дата 13.5.2007, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(diablero @  13.5.2007,  18:07 Найти цитируемый пост)
Мне необходимо нужные jar файлы поместить в свой, jar программы. И в случае необходимости подгружать нужные классы для соответствующих графиков.

Если вы включили классы в архив своей программы, ничего подгружать не нужно, - после запуска вашей программы все эти классы уже загружены. Точнее формулируйте вопрос.

Теперь по существу: включите вывод трассировки исключений везде, где вы их "съедаете" и попробуйте еще раз.

Это сообщение отредактировал(а) w1nd - 13.5.2007, 18:18


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
diablero
Дата 13.5.2007, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Цитата

Если вы включили классы в архив своей программы, ничего подгружать не нужно, - после запуска вашей программы все эти классы уже загружены. Точнее формулируйте вопрос.

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

Теперь по существу:
Цитата

 включите вывод трассировки исключений везде, где вы их "съедаете" и попробуйте еще раз.

Ничего не изменилось. Тоже самое


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
w1nd
Дата 13.5.2007, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(diablero @  13.5.2007,  19:10 Найти цитируемый пост)
Вы не правы, классы не загруженны, и все они не подгружаются, а только используемые.

В чём именно я не прав? В том, что вы использовали непонятную формулировку? Или в том, что все классы, упомянутые в коде данного будут загружены до того, как будет загружен он сам?

Цитата(diablero @  13.5.2007,  19:10 Найти цитируемый пост)
Ничего не изменилось. Тоже самое

Ок. В вашем случае класс PieChartDemo1 загружается до того, как управление будет передано коду, загружаещему библиотеки. Уберите любые упоминания классов, зависимых от загружаемых (исключая reflection) из ClassLoaderTest.

Но это поможет вам только если вы запустите пример, не упаковывая его в архив. Попытка подсунуть загрузчику архив из архива не пройдёт.

Это сообщение отредактировал(а) w1nd - 14.5.2007, 00:09


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
math64
Дата 14.5.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Вместо добавления классов из JFreeChart в свой jar добавь в манифест:
Код

Manifest-Version: 1.0
Main-Class: PieChartDemo1
Class-Path: jfreechart-1.0.3.jar jcommon-1.0.6.jar


PM   Вверх
diablero
Дата 14.5.2007, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

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



Цитата

Вместо добавления классов из JFreeChart в свой jar добавь в манифест:

О, самое простое и подходящее решение.


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

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

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


 




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


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

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