Consigo correr no Eclipse, mas quando exporto para um jar, não corre!

5 respostas
E

Eu coloquei a mesma mensagem no java avançado.

Estou a utilizar o JFreeReports, decidi fazer um teste e correr o HelloWorld do report.

Os meus passos foram os seguintes, num projecto limpo.

Criei o package src, e adicionei a classe HelloWorld.

Criei um folder lib e copiei os jars que a api depende para lá ‘copy&paste :)’.

de seguida fui ao Projecto>Java Build Path>Libraries e escolhi a opção ‘add jars’ fui à pasta lib e adicionei os jars que são os seguintes :

bsf-2.3.0.jar
bsh-1.3.0.jar
gnujaxp.jar
itext-1.4.jar
jcommon-1.0.6.jar
jcommon-xml-1.0.6.jar
libfonts-0.2.1.jar
libloader-0.1.5.jar
pixie-0.8.6.jar
poi-3.0-alpha1-20050704.jar
jfreereport-0.8.7-9.jar
jfreereport-demo-0.8.7-9.jar


O código da classe HelloWorld é o seguinte

package src;

import java.awt.Color;

import java.awt.geom.Point2D;

import javax.swing.table.DefaultTableModel;

import javax.swing.table.TableModel;
import org.jfree.report.ElementAlignment;

import org.jfree.report.JFreeReport;

import org.jfree.report.JFreeReportBoot;

import org.jfree.report.ReportProcessingException;

import org.jfree.report.demo.helper.DefaultCloseHandler;

import org.jfree.report.demo.helper.DemoHandler;

import org.jfree.report.demo.helper.PreviewHandler;

import org.jfree.report.elementfactory.TextFieldElementFactory;

import org.jfree.report.modules.gui.base.PreviewDialog;

import org.jfree.ui.FloatDimension;

import org.jfree.util.Log;

/**

  • A very simple JFreeReport demo. The purpose of this demo is to illustrate the basic

  • steps required to connect a report definition with some data and display a report

  • preview on-screen.

  • In this example, the report definition is created in code. It is also possible to read

  • a report definition from an XML file…that is demonstrated elsewhere.

  • @author David Gilbert
    /
    public class HelloWorld implements DemoHandler
    {
    /
    *

    • A helper class to make this demo accessible from the DemoFrontend.
      */
      private class HelloWorldPreviewHandler implements PreviewHandler
      {
      public HelloWorldPreviewHandler()
      {
      }
    public void attemptPreview()
    
    {
    
    executeReport();
    
    }
    
    }
    

/**

  • Creates and displays a simple report.
    */
    public HelloWorld ()
    {
    }
protected void executeReport ()

{

final TableModel data = createData();

final JFreeReport report = createReportDefinition();

report.setData(data);

try

{

final PreviewDialog preview = new PreviewDialog(report);

preview.addWindowListener(new DefaultCloseHandler());

preview.pack();

preview.setVisible(true);

}

catch (ReportProcessingException e)

{

Log.error("Failed to generate report ", e);

}

}

/**

  • Creates a small dataset to use in a report. JFreeReport always reads data from a
  • TableModel instance.
  • @return a dataset.
    */
    private TableModel createData ()
    {
final Object[] columnNames = new String[]{"Column1", "Column2"};
final DefaultTableModel result = new DefaultTableModel(columnNames, 1);
result.setValueAt("Hello\n", 0, 0);
result.setValueAt("World!\n", 0, 1);
return result;

}

/**

  • Creates a report definition.
  • @return a report definition.
    */
    private JFreeReport createReportDefinition ()
    {
final JFreeReport report = new JFreeReport();
report.setName(getDescription());

TextFieldElementFactory factory = new TextFieldElementFactory();
factory.setName("T1");
factory.setAbsolutePosition(new Point2D.Float(0, 0));
factory.setMinimumSize(new FloatDimension(150, 12));
factory.setColor(Color.black);
factory.setHorizontalAlignment(ElementAlignment.RIGHT);
factory.setVerticalAlignment(ElementAlignment.MIDDLE);
factory.setNullString("-");
factory.setFieldname("Column1");
report.getItemBand().addElement(factory.createElement());

factory = new TextFieldElementFactory();
factory.setName("T2");
factory.setAbsolutePosition(new Point2D.Float(200, 0));
factory.setMinimumSize(new FloatDimension(150, 12));
factory.setColor(Color.black);
factory.setHorizontalAlignment(ElementAlignment.LEFT);
factory.setVerticalAlignment(ElementAlignment.MIDDLE);
factory.setNullString("-");
factory.setFieldname("Column2");
report.getItemBand().addElement(factory.createElement());
return report;

}

/**

  • Returns a short description of the demo.
  • @return
    */
    protected String getDescription ()
    {
    return “A Very Simple Report”;
    }
public String getDemoName()

{

return Hello World Demo (External);

}
public PreviewHandler getPreviewHandler()

{

return new HelloWorldPreviewHandler();

}

/**

  • The starting point for the “Hello World” demo application.
  • @param args ignored.
    */
    public static void main (final String[] args)
    {
    // this also installs the log.
    // initialize JFreeReport
    JFreeReportBoot.getInstance().start();
//final HelloWorld app =
new HelloWorld().executeReport();

}

}

Exactamente como eles o forneceram com as demonstrações do JFreeReports.

Quando eu compilo e corro no eclipse , mostra tudo certo.

Quando exporto o jar, seguindos todos os passos até no final escolhendo a classe que vai iniciar.

eu ao correr no terminar com java -jar HelloWorld.jar dá-me o seguinte erro :

Exception in thread main java.lang.NoClassDefFoundError: org/jfree/report/demo/helper/DemoHandler

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)

E não sei o que fiz de errado, é a primeira vez que trabalho com jar’s de terceiros, portanto não sei se me podem ajudar?
Fiz alguma coisa mal no classpath?

Cumprimentos, e espero que me possam ajudar.

5 Respostas

Sombriks

Olá, edfimasa

eu já precisei também de jars de terceiros e pra eles serem usados fora do ambiente eclipse alguns cuidados devem ser tomados. ao que parece ambas abordagens são válidas:

1- Sua variável $CLASSPATH (ou %CLASSPATH%) deve conter o caminho dos jars. por exemplo, no prompt do DOS:

setenv CLASSPATH="c:\java\lib;.;c:\jarDosOutros.jar"
java -jar meuJar.jar

2- No arquivo MANIFEST.MF do seu jar deve conter algo assim:

Class-Path: lib/swing-layout-1.0.jar lib/db4o-5.2-java5.jar lib/swt.jar

onde lib é uma pasta que está junta com o seu arquivo jar.

qq dúvida continue perguntando, :smiley:

E

Obrigado por ter respondido ao meu post.

Não me podes dizer como fazer isso dentro do eclipse?

E

Olha lancei uma nova thread no ‘Java Básico’ acerca deste assunto, pode dár uma olhadela?

Luca

Olá

Bem vindo ao GUJ mas aprenda a usar o fórum para não dar tanto trabalho aos moderadores.

Você já criou este tópico várias vezes. Já apaguei um monte de mensagens repetidas. Por favor faça como os outros 15 mil e aprenda a usar.

Obrigado

[]s
Luca

E

Peço desculpa :slight_smile: .

Continua a me dar o mesmo erro.

compilo manualmente usando o seguinte.

javac -sourcepath src -classpath lib\bsf-2.3.0.jar;lib\bsh-1.3.0.jar;lib\gnujaxp.jar;lib\itext-1.4.jar;lib\jcommon-1.0.6.jar;lib\jcommon-xml-1.0.6.jar;lib\jfreereport-0.8.7-9.jar;lib\jfreereport-demo-0.8.7-9.jar;lib\libfonts-0.2.1.jar;lib\libloader-0.1.5.jar;lib\pixie-0.8.6.jar;lib\poi-3.0-alpha1-20050704.jar src\HelloWorld.java

depois para correr escrevo o seguinte:

java -classpath lib\bsf-2.3.0.jar;lib\bsh-1.3.0.jar;lib\gnujaxp.jar;lib\itext-1.4.jar;lib\jcommon-1.0.6.jar;lib\jcommon-xml-1.0.6.jar;lib\jfreereport-0.8.7-9.jar;lib\jfreereport-demo-0.8.7-9.jar;lib\libfonts-0.2.1.jar;lib\libloader-0.1.5.jar;lib\pixie-0.8.6.jar;lib\poi-3.0-alpha1-20050704.jar; src\HelloWorld

e depois dá me o erro:

Exception in thread main java.lang.NoClassDefFoundError: src\HelloWorld (wrong name: src/HelloWorl

d)

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)

Não sei o que se passa, pois a mim parece-me tudo bem definido.
Esse código corre perfeitamente quando executado dentro do eclipse.

alguem me consegue ajudar?

Criado 11 de novembro de 2006
Ultima resposta 14 de nov. de 2006
Respostas 5
Participantes 3