Distribuir arquivo .JAR em aplicação Desktop

22 respostas
A

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).

Como eu posso fazer isso?

Obrigado

22 Respostas

A

Serve ISTO?

L

De uma olhada no Java Web Start também.

Eu estou fazendo um tutorial sobre Java Web Start para o GUJ, mas estou sem tempo para terminá-lo… :frowning:

P

leonardom:
De uma olhada no Java Web Start também.

Eu estou fazendo um tutorial sobre Java Web Start para o GUJ, mas estou sem tempo para terminá-lo… :frowning:

Ou termina aí cara… :lol:

A Paz!!

L

Pode deixar vou dar um jeito de termina-lo esse semana…

R

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

I

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.

K

acho mais simples criar uma pastinha lib no mesmo nivel do seu jar
e passar um…

Sealed: true
Classpath: lib/seujarauxiliar.jar

no seu manifest… mais detalhes vide tutorial do GUJ

H

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” ?

Agradeço qualquer dica ae.

Hwo

A

Vc nao precisa incluir os JARs dependentes dentro do seu principal!

Basta “referencia-los” no seu Manifest.mf :wink:

H

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…

obrigado mais uma vez.

Hwo

A

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:

Class-Path: lib/jasper.jar lib/outrojar.jar lib/maisumjar.jar
H

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.

veja meu Manifest.mf:

Manifest-Version: 1.0
Class-Path: com/provenda/lib/jasper.jar com/provenda/lib/digester.jar 
 com/provenda/lib/collections.jar com/provenda/lib/beanutils.jar com/p
 rovenda/lib/logging.jar
Main-Class: com/provenda/aplicacao/Principal

Name: com/provenda/relas
Sealed: true

Name: com/provenda/aplicacao
Sealed: true

Name: com/provenda/utils
Sealed: true

alguma idéia?
obrigado.

Hwo

A

Repetindo o q eu lhe disse:

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

R

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.

negativo

o JRE tem a pasta /lib/ext

I

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.

I

negativo
o JRE tem a pasta /lib/ext

Uia!Como fui esquecer… :shock:
Eh o q dar lidar com VM do Windows… huahauhauh… :oops:

R

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.

humn… isso é totalmente inviavel!

sabe o tamanho de uma VM???

H

aborges:
Repetindo o q eu lhe disse:

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

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…

alguma idéia?

Hwo

1

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:

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.*;
^

E os JARs estão referenciados no Manifest.mf . Alguma idéia?

Obrigado.

D

.

D

.

D

.

Criado 16 de novembro de 2004
Ultima resposta 13 de set. de 2007
Respostas 22
Participantes 11