Distribuir arquivo .JAR em aplicação Desktop

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

Serve ISTO?

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:

[quote=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: [/quote]

Ou termina aí cara… :lol:

A Paz!!

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

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.

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

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

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

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

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

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
1 curtida

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

Repetindo o q eu lhe disse:

[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]

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]

negativo

o JRE tem a pasta /lib/ext

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]negativo
o JRE tem a pasta /lib/ext [/quote]
Uia!Como fui esquecer… :shock:
Eh o q dar lidar com VM do Windows… huahauhauh… :oops:

[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]

humn… isso é totalmente inviavel!

sabe o tamanho de uma VM???

[quote=aborges]Repetindo o q eu lhe disse:

[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…

alguma idéia?

Hwo

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?

Obrigado.