Получил ‘java.lang.Ошибка NoClassDefFoundError: org/apache/commons/logging/LogFactory` в коде с использованием JasperReports API

#java #jasper-reports #noclassdeffounderror

#java #джаспер-отчеты #ошибка noclassdeffounderror

Вопрос:

Я работаю над простым автономным настольным приложением, которое будет генерировать отчет на основе значений, переданных программе. База данных не используется. Я разработал свой отчет JasperReports с помощью iReport designer и добавил параметр ID_NO и текстовое поле с выражением $P{ID_NO}

Я могу успешно просмотреть отчет и посмотреть, чего я ожидал. Но я не могу сгенерировать отчет из Java-приложения и передать параметр ID_NO оттуда. Вот мой код:

 public class MyReportViewer extends JFrame {

    public MyReportViewer(String fileName) {
        this(fileName,null);
    }

    public MyReportViewer(String fileName,HashMap<String, Object> parameter) {
        super("View Report");
        try {
            JasperPrint print = JasperFillManager.fillReport(fileName, parameter);
            JRViewer viewer = new JRViewer(print);

            Container c = getContentPane();
            c.add(viewer);
        } catch(Exception e) {
            e.printStackTrace();
        }

        setBounds(10, 10, 600,500);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }

    public static void main(String args[]) {
        HashMap<String, Object> param = new HashMap<String, Object>();
        param.put("ID_NO", "101-15-980");
        MyReportViewer viewer = new MyReportViewer("test.jasper", param);
        viewer.setVisible(true);
    }
}
 

Код выдает исключение

 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    at net.sf.jasperreports.engine.util.JRLoader.<clinit>(JRLoader.java:61)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:267)
    at jspertest.MyReportViewer.<init>(MyReportViewer.java:37)
    at jspertest.MyReportViewer.main(MyReportViewer.java:60)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
    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)
 

И не запускается.

Пожалуйста, дайте мне подсказку. Я никогда раньше не использовал JasperReports или какой-либо генератор отчетов.

Редактировать:

Добавлены все файлы библиотеки из jasperreports4.x.x/lib/.. в проект. Теперь исключение исчезло. Теперь консоль говорит-

 log4j:WARN No appenders could be found for logger (net.sf.jasperreports.extensions.ExtensionsEnvironment).
log4j:WARN Please initialize the log4j system properly.
 

и небольшое всплывающее окно сообщает, что в документе нет страниц. Появляется небольшое окно без отчета.

Комментарии:

1. И что происходит, когда вы запускаете этот код? Компилируется ли он? Выдает ли он исключение? Если да, то какова трассировка стека? Вы видите что-то в кадре? Что?

2. Извините за неполный вопрос. Последние несколько строк отсутствуют, отредактированные, которые вы должны увидеть через некоторое время

Ответ №1:

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

Похоже, вам не хватает входа в Apache Commons в вашем пути к классу. Он запускается в режиме предварительного просмотра, потому что у вашей IDE есть правильный путь к классу.

Комментарии:

1. Загрузить jar с commons.apache.org/logging и добавьте в свой путь к классу. Возможно, вам не хватает еще нескольких библиотек

2. jasperforge.org/uploads/publish/jasperreportswebsite/trunk /… содержит таблицу с необходимыми библиотеками.

3. Я добавил все файлы jar из библиотеки jasperreports-4.1.2 , теперь исключение исчезло, и появляется всплывающее окно — «В документе нет страниц», я также вижу сообщение в консоли — «log4j: ПРЕДУПРЕЖДЕНИЕ Для logger не удалось найти никаких добавлений (net.sf.jasperreports.расширения. ExtensionsEnvironment). log4j: ПРЕДУПРЕЖДЕНИЕ Пожалуйста, правильно инициализируйте систему log4j «.

4. «В документе нет страниц» означает, что в источнике данных нет записей, поэтому отчет не генерируется. Вам действительно следует заглянуть в учебник jasper reports / ireport. Из всего, что вы сказали, я понимаю, что вы пытаетесь создать отчет на основе данных, которые не поступают из базы данных. Вам следует создать Java-компонент, привязать его к своему отчету и, наконец, сгенерировать свой отчет с JRBeanCollectionDataSource помощью .

5. Спасибо, мне удалось создать свой первый отчет. Но я не знаком с компонентами ejb. Поэтому мне пришлось создать базу данных дампа.

Ответ №2:

Да, это верно. "The document has no pages" означает, что в источнике данных нет записей, поэтому отчет не генерируется.

Ответ №3:

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

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