Java Web Start e coisas que não funcionam na aplicação

20 respostas
rmlang

Estou rodando a minha aplicação utilizando o JWS, mas tem coisas que durante o desenvolvimento, no eclipse, rodam perfeitamente e na hora de rodar no cliente (utilizando o JWS), algumas coisas não funcionam, como por exemplo, a criação de um gráfico utilizando o jfreechart e a compilação de um relatório baseado em um jrxml do jasperreports.
Quando clico nos botões que disparam os métodos para esses processos, simplesmente não acontece nada e nenhum erro é mostrado.

As bibliotecas necessárias estão todas assinadas e discriminadas no JNLP.
As mensagens de segurança que foram mostradas, foram confirmadas corretamente.

Os métodos onde o problema ocorre estão tratando as exceptions com try/catch…

Como posso descobrir o que está acontecendo?

Sugestões?

[]'s

Robert

20 Respostas

_fs

Olhe o console do JWS para verificar se nenhuma SecurityException está sendo lançada.

E chutando: como você está pegando os caminhos para os arquivos .jrxml de dentro da sua aplicação?

rmlang

Lipe,

Eu criei uma classe só pra pegar recursos do jar pra mim:

public class Resources {
	private static Logger logger = Logger.getLogger(Resources.class);
	private static ClassLoader loader = Resources.class.getClassLoader();

	public static DataInputStream getResource(String fileName) {
		logger.info("Carregando recurso: "+fileName);
		DataInputStream dis = new DataInputStream(loader.getResourceAsStream(fileName));
		logger.info("Concluído.");
		return dis;
	}

	public static DataInputStream getJrxml(String fileName) {
		return getResource(Constants.JRXML_JNDI_NAME + "/" + fileName + ".jrxml"); 
	}

	public static DataInputStream getJasper(String fileName) {
		return getResource(Constants.JASPER_JNDI_NAME + "/" + fileName + ".jasper"); 
	}
	
}

Para buscar o jrxml utilizo o getJrxml.
Funciona perfeitamente com o .jasper, pegando o recurso com o getJasper.

O problema deve estar no processo de compilar o jrxml no jws…
Talvez tente acessar algo no disco, mas não mostra nenhum erro…

Sobre o console do JWS, não sei onde fica isso… não encontrei nenhuma opção, acho que estou meio cego… acabei de revira-lo novamente e não encontrei nada… Onde fica isso?

[]'s

Robert

rmlang

Não sei se ajuda, mas a versão do meu JWS é 1.4.2_06 (build b03) e estou rodando no Windows XP…

[]'s

Robert

_fs

Já debugou o método para saber se ele está realmente encontrando o arquivo?

E sobre o console

google:
In the WebStart Application Manager menu, select File > Preferences. In Preferences,
go to the Advanced Tab and select Show Java Console.

http://www.huihoo.com/compiere/install/webStart.html

rmlang

Lipe,

Eu realmente estava cego… Agora que habilitei o console do JWS estou com uma pilha de erros pra resolver…

Quando eu disparo o método do jfreechart:

ChartFactory.createPieChart3D(title, dataset, true, true, false);

Está ocorrendo esses erros:

java.lang.NoClassDefFoundError: org/jfree/util/PublicCloneable at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at com.sun.jnlp.JNLPClassLoader.defineClass(Unknown Source) at com.sun.jnlp.JNLPClassLoader.access$100(Unknown Source) at com.sun.jnlp.JNLPClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) at br.com.sysmo.sbi.manager.ChartBuilder.createPieChart(ChartBuilder.java:137))

E isso funciona perfeitamente dentro do Eclipse… mas no Jar via JWS…

O que vc acha?

[]'s

Robert

_fs

Este erro indica que a aplicação não encontrou a classe que precisa no classpath.

Indique as dependências do seu jar no arquivo descritor do jws.

rmlang

Acertou na mosca :!: :!: :!:

Estava faltando no jnlp:

<jar href="jws/jcommon-0.9.6.jar"/>

Já estou te devendo duas! :smiley:

Agora que o jfreechart já está funcionando no JWS, ainda me resta o problema na compilação do jasper…
Vou fazer uns testes e depois mando uma resposta. :roll:

_fs

:thumbup:

Mas tem certeza que sua aplicação precisa compilar os relatórios em runtime? Não bastaria distribuir os arquivos .jasper?

rmlang

Lipe,

Infelizmente eu preciso criar todo o relatório na hora…

Funciona mais ou menos assim:

O usuario seleciona um “cubo” (grupo de entidades, ou tabelas) através de um JTree.
Então ele escolhe os “atributos” das entidades (campos de cada tabela) que ele quer que apareça no relatório a partir de outro JTree, arrasta o dito atibuto e solta em um JTable, utilizando Dnd.
Então eu tenho que em tempo de execução, motar o sql, pesquisar e mostrar o resultado nesta tabela. O usuário pode ordenar a tabela. incluir mais coisa, retirar, etc…
Sobre esta tabela existe uma JToolBar, com botões para geração de um gráfico, relatório, etc.
O usuário clica no gráfico e ele aparece, com os dados escolhidos.
Se ele clicar no relatório, eu tenho que monta-lo em tempo de execução e então mostra-lo.

A princípio estou usando um jrxml pronto para testar, mas preciso urgente gerar o jrxml, importa-lo no jasper, compilar e apresentar para o usuário.

A importação do jrxml está beleza, acabei de testar.
O problema agora é a compilação… :frowning:

Tomara que dê pra fazer isso pelo JWS, senão terei que utilizar outra forma de gerar o relatório… :shock:
Preferiria poder continuar com o Jasper…

_fs

Que trampo :smiley: não seria 6 milhões de vezes mais fácil integrar sua aplicação com o “excel” do open office? :smiley: hehe

Um cara estava enfrentando exatamente este problema semana passada. Se resolveu não postou :expressionless:

Boa sorte :XD:

rmlang

Só que esses dados são provenientes de um datawarehouse, onde tenho os dados em formatos especias a fim de permitir que o usuário faça a análise do que e como quiser…

É uma espécie de BI.

TedLoprao

E aí Robert, a princípio não tem problema na compilação do jasper… Visto q vc pode gerar um relatório até mesmo sem ter o XML…

De uma verificada nos demos do jasper, vc pode tirar algumas idéias legais para implementar isso…

Fallow

rmlang

Vou dar uma olhada.

rmlang

TedLoprao:
E aí Robert, a princípio não tem problema na compilação do jasper… Visto q vc pode gerar um relatório até mesmo sem ter o XML…

De uma verificada nos demos do jasper, vc pode tirar algumas idéias legais para implementar isso…

Fallow

Revirei o The JasperReports Ultimate Guide 1.0 e não encontrei nada para gerar um relatório sem ter o XML… onde vc encontrou isso?

rmlang

Olhem só o erro que está ocorrendo:

java.io.IOException: CreateProcess: javac -classpath "C:\Program Files\Java\j2re1.4.2_06\javaws\javaws-l10n.jar" "C:\Documents and Settings\Usuario Corrente\Desktop\UserReport.java" error=2 at java.lang.ProcessImpl.create(Native Method) at java.lang.ProcessImpl.<init>(Unknown Source) at java.lang.ProcessImpl.start(Unknown Source) at java.lang.ProcessBuilder.start(Unknown Source) at java.lang.Runtime.exec(Unknown Source) at java.lang.Runtime.exec(Unknown Source) at net.sf.jasperreports.engine.design.JRJavacCompiler.compileClass(JRJavacCompiler.java:103) at net.sf.jasperreports.engine.design.JRAbstractJavaCompiler.compileReport(JRAbstractJavaCompiler.java:152) at net.sf.jasperreports.engine.design.JRDefaultCompiler.compileReport(JRDefaultCompiler.java:137) at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:203) at net.sf.jasperreports.engine.JasperManager.compileReport(JasperManager.java:985) at br.com.sysmo.sbi.manager.ReportBuilder.<init>(ReportBuilder.java:53) at br.com.sysmo.sbi.manager.CriarForm.buildReport(CriarForm.java:270) at br.com.sysmo.sbi.manager.CriarForm.actionPerformed(CriarForm.java:293) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

O Jasper pegou corretamente o XML do Jar (JWS) e está tentando compilar um .java no diretório onde a aplicação foi iniciada…

Me digam o que estou fazendo errado:

// aqui pega o jrxml do jar e funciona corretamente no JWS JasperDesign jasperDesign = JasperManager.loadXmlDesign(Resources.getJrxml(reportName)); // aqui deveria compilar o jrxml que está em jasperDesign, mas está tentando encontrar um arquivo local, em vez de pegar o que foi lhe atribuido do jar JasperReport jasperReport = JasperManager.compileReport(jasperDesign);

Provavelmente preciso criar a partir do jrxml, um arquivo .java para poder compilar e rodar…

TedLoprao

Desculpa a demora Robert, esquecidesse post, hehehe

Junto com a API do Jasper vem algumas pastas como a demo, dentro da demo está uma pasta samples, e ali dentro vc encontra a pasta noxmldesign, q mostra a construção de um relatório sem possuir o XML, bem interessante!

Ah, essa estrutra de pastas é verdadeira para pelo menos as versões 0.4.6, 0.5.0 e 0.6.4 q são as q tenho aqui no momento…

Espero ter ajudado, fallow

TedLoprao

ah, quanto ao seu outro erro, é o fato do jasper ter que compilar uma classe e para isso ele precisa encontrar as ferramentas do JDK, uma solução talvez seja disponibilizar o tools.jar junto com a aplicação, o grande problema é que são praticamente 5MB a mais, hehehe

rmlang

Rodrigo,

Estou seguindo as suas dicas e já consegui montar no braço, um pequeno e simples relatório baseado no exemplo NoReportApp.java, que baseia-se na classe JasperPrint.

O exemplo NoXmlDesignApp.java utiliza a classe JasperDesign.
Pelo que eu entendi, segundo o site http://www.javaworld.com/javaworld/jw-09-2002/jw-0920-opensourceprofile.html é que o JasperDesign precisa ser compilado pelo JasperReport, ou melhor, o JasperReport representa um JasperDesign compilado…

Para evitar esse processo de compilação, optei por usar o JasperPrint.

O detalhe agora é que a classe JasperPrint, por representar um relatório pronto (gerado), não tem recursos para preenchimento (fill).

Vc já chegou a trabalhar com a JasperPrint, alimentando os dados diretamente nela?

Estou achando que terei que trabalhar com a classe JasperReport que representa um JasperDesign compilado, certo?

TedLoprao

Hmmm, realmente se vc quiser utilizar o fill vc precisa ter um JasperReport e não sei se vc consegue montá-lo dinamicamente.
Agora, vc não quer compilar o report para não precisar mandar o tools.jar junto, é isso?

Se for, parece que na versão 0.6.4 vc pode mandar o jdt-compiler.jar somente, que possui apenas 896KB (dependendo da aplicação, talvez não seja muito)… Entretanto essa informação eu apenas li, nunca testei para ver se funciona…

Se vc fizer o teste posta o resultado aqui :wink: , vallew

rmlang

O que é esse tools.jar?
Eu só gostaria de não fazer muito processamento no cliente e evitar de deixar a aplicação lenta… Alguns segundos de compilação já são suficientes para uma reclamação…
Sim, parece que vou ter que usar o fill…
Estudei um pouco o JasperPrint e ele parece gerar um relatórios estático, sem o fill e controles de paginação, quebra, etc… isso é verdadeiro?

Criado 9 de março de 2005
Ultima resposta 11 de mar. de 2005
Respostas 20
Participantes 3