Sempre trabalhei com WEB e colocava os arquivos .jar dentro de WEB-INF/lib e funciona OK.
Agora eu quero distribuir uma aplicação Desktop (rodando Swing) para outros computadores.
No meu eu setei o CLASSPATH para esses arquivos, mas nas outras máquinas eu não irei fazer isso (quero algo bem prático).
se o seu programa usa mais de um jar, vc pode instruir o seu usuário a colocar os seus .jar não executaveis, que servem apenas de “bibliotecas” na pasta /jre/lib/ext
Epa!Para isso o usuário deveria ter uma JDK instalada!Isso é quase impossível de um cliente possuir…acho q a melhor opção é montar um jarzinho mesmo ou partir para JWS.
Olá, aproveitando o tópico, estou com um problema parecido.
Minha aplicação usa alguns arquivos .jar (como, por exemplo, o jasperreports.jar).
Acontece que quando monto o meu aplicacao.jar e mando executar o relatório, ele não acha o as classes do pacote net.js.jasperreports…
Tive que incluir o pacote do jasper no meu .jar (incluir o jasperreportes.jar não funcionou). Daí ele pede outro, e mais outro…
Minha pergunta é: tenho que colocar todos os .jar que minha aplicação usa dentro do meu .jar principal? quando mando compilar e gerar o .jar ele já não deveria importar as classes citadas nas minhas cláusulas “import” ?
Alexandre, desculpe, não fiz a pergunta claramente…
tudo bem ao referenciá-los no manifest… (penso que aqui vc esteja falando da tag “Class-Path”, certo?)
pergunta 1:
mas o que eu gostaria de saber se realmente preciso levá-los juntos com minha aplicação para o pc do cliente. pensei que as classes usadas fossem incorporadas automaticamente (como acontece com classes do pacote tools.jar, por exemplo).
pergunta 2:
eu criei mais uma pasta “\lib” na minha estrutura do diretórios e coloquei o jasperreports.jar lá…
coloquei “Class-Path: com/provenda/lib/jasper.jar”, então funcionou…
agora, como incluir outros arquivos .jar que estejam na pasta “\lib” nesse Class-Path? já tentei colocar “Class-Path: com/provenda/lib”, “Class-Path: com/provenda/lib/*.jar”, “Class-Path: com/provenda/lib/jasper.jar;com/provenda/lib/commons.jar” e nada…
Bom… C “com/provenda” for sua package, vc nao deve coloca-las na sua chamada… O manifest procura as libs a partir do diretorio onde esta o JAR. Como no seu caso seus JARs foram colocados dentro de uma basta lib, basta fazer:
Class-Path: lib/jasper.jar
Para colocar mais de um JAR, basta separa-los por espaco:
pô Alexandre… brigadão… vlw…
apesar de não concordar estou incluindo meus .jars auxiliares no meu pacote…
mas veja só:
a estrutura do meu package é esse:
+com
+provenda
+aplicacao -> Main Class
+relas -> Relatórios
+util -> Utilitários
+lib -> jars auxiliares
como a classe principal está em “com.provenda.aplicacao”, se eu colocar no manifest apenas “Class-Path: lib/jasper.jar” ele não acha. Tenho que colocar o caminho inteiro.
ok. Quando executo pelo NetBeans o relatório é gerado normalmente. Mas quando executo pelo arquivo .jar, aparecem esses erros quando da geração do relatório:
net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file:
C:\Arquivos de programas\NetBeans\classic.java:4: package net.sf.jasperreports.engine does not exist
import net.sf.jasperreports.engine.*;
^
C:\Arquivos de programas\NetBeans\classic.java:5: package net.sf.jasperreports.engine.fill does not exist
import net.sf.jasperreports.engine.fill.*;
^
C:\Arquivos de programas\NetBeans\classic.java:17: cannot resolve symbol
symbol : class JRCalculator
location: class classic
public class classic extends JRCalculator
(...)
37 errors
at net.sf.jasperreports.engine.design.JRAbstractJavaCompiler.compileReport(JRAbstractJavaCompiler.java:155)
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.JasperCompileManager.compileReport(JasperCompileManager.java:155)
at com.provenda.relas.bairros.geraRelatorio(bairros.java:21)
at com.provenda.aplicacao.Principal.MenuRelBairrosActionPerformed(Principal.java:611)
at com.provenda.aplicacao.Principal.access$4000(Principal.java:8)
at com.provenda.aplicacao.Principal$41.actionPerformed(Principal.java:596)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
at javax.swing.AbstractButton.doClick(AbstractButton.java:289)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1113)
at javax.swing.plaf.basic.BasicPopupMenuUI$ReturnAction.actionPerformed(BasicPopupMenuUI.java:578)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1530)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2438)
at javax.swing.KeyboardManager.fireBinding(KeyboardManager.java:253)
at javax.swing.KeyboardManager.fireKeyboardAction(KeyboardManager.java:202)
at javax.swing.JComponent.processKeyBindingsForAllComponents(JComponent.java:2515)
at javax.swing.JComponent.processKeyBindings(JComponent.java:2507)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2401)
at java.awt.Component.processEvent(Component.java:4909)
at java.awt.Container.processEvent(Container.java:1569)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1713)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:627)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:831)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:741)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:592)
at java.awt.Component.dispatchEventImpl(Component.java:3506)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
veja que na descrição do erro pede pra eu importar net.js.jasperreports.engine.*;
mas isso já é feito na minha classe. Por isso estou sem entender.
[quote=aborges]Bom… C “com/provenda” for sua package, vc nao deve coloca-las na sua chamada… O manifest procura as libs a partir do diretorio onde esta o JAR. Como no seu caso seus JARs foram colocados dentro de uma basta lib, basta fazer:
Epa!Para isso o usuário deveria ter uma JDK instalada!Isso é quase impossível de um cliente possuir…acho q a melhor opção é montar um jarzinho mesmo ou partir para JWS.[/quote]
O melhor a fazer é copiar a maquina virtual com tudo e colocar os JARs no mesmo diretorio do Javaw.exe. Assim, sempre funciona, com ou sem JRE instalado.
Com isso, você pode usar um instalador qualquer, como o Wise, que ganha de 10 a 0 em qualquer um específico pra Java. No fim das contas, fica do mesmo tamanho que ficaria se o usuario precisase baixar cada um, só que muito mais prático.
[quote=iSoron]O melhor a fazer é copiar a maquina virtual com tudo e colocar os JARs no mesmo diretorio do Javaw.exe. Assim, sempre funciona, com ou sem JRE instalado.
[/quote]
[quote=aborges]Bom… C “com/provenda” for sua package, vc nao deve coloca-las na sua chamada… O manifest procura as libs a partir do diretorio onde esta o JAR. Como no seu caso seus JARs foram colocados dentro de uma basta lib, basta fazer:
Class-Path: lib/jasper.jar
[/quote][/quote]
Alexandre, obrigado…
a questão do class-path eu consegui resolver… vlw…
estou parado no último erro que te relatei… vc viu?
não consigo executar o relatório pelo .jar só pelo NetBeans…
Pessoal, estou com um problema similar ao do Hwoarang, com a diferença que eu não coloquei os jars do Jasper em uma estrutura diferente de pacotes. Alguém tem alguma idéia?
Log:
[code]Errors were encountered when compiling report expressions class file:
F:\temp\x1101232805250.java:4: package net.sf.jasperreports.engine does not exist
import net.sf.jasperreports.engine.;
^
F:\temp\x1101232805250.java:5: package net.sf.jasperreports.engine.fill does not exist
import net.sf.jasperreports.engine.fill.;
^
F:\temp\x1101232805250.java:17: cannot resolve symbol
symbol : class JRCalculator
location: class x1101232805250
public class x1101232805250 extends JRCalculator
(…)
31 errors
net.sf.jasperreports.engine.JRException: Errors were encountered when compiling report expressions class file:
F:\temp\x1101232805250.java:4: package net.sf.jasperreports.engine does not exist
import net.sf.jasperreports.engine.;
^
F:\temp\x1101232805250.java:5: package net.sf.jasperreports.engine.fill does not exist
import net.sf.jasperreports.engine.fill.;
^
[/code]
E os JARs estão referenciados no Manifest.mf . Alguma idéia?