Pergunta

Estou escrevendo um aplicativo em Java para desktop usando a biblioteca Eclipse SWT para renderização de GUI.Acho que o SWT ajuda o Java a superar o maior obstáculo para aceitação no desktop:ou seja, fornecer a um aplicativo Java uma interface consistente e responsiva que se parece com qualquer outro aplicativo em sua área de trabalho.No entanto, sinto que empacotar um aplicativo ainda é um problema.

O OS X fornece nativamente um mecanismo fácil para agrupar aplicativos Java em pacotes de aplicativos nativos, mas produzir um aplicativo para Windows/Linux que não exija que o usuário execute um arquivo em lote feio ou clique em um .jar ainda é um incômodo.Possivelmente isso não é um problema no Linux, onde o usuário provavelmente tem um pouco mais de conhecimento técnico, mas no Windows eu gostaria de ter um .exe normal para ele executar.

Alguém já teve alguma experiência com alguma das ferramentas de geração de .exe para Java que existem por aí?Eu tentei o JSmooth, mas tive vários problemas com ele.Existe uma solução melhor antes de eu abrir o Visual Studio e criar o meu próprio?

Editar: Devo talvez mencionar que não posso gastar muito dinheiro numa solução comercial.

Foi útil?

Solução

Para acompanhar a resposta do pauxu, estou usando o launch4j e o NSIS em um projeto meu e achei que seria útil mostrar como os estou usando.Aqui está o que estou fazendo no Windows.Aliás, estou criando .app e .dmg para Mac, mas ainda não descobri o que fazer no Linux.

Cópias do projeto launch4j e NSIS

No meu projeto eu tenho um diretório "vendor" e abaixo dele tenho um diretório para "launch4j" e "nsis".Dentro de cada um há uma cópia da instalação de cada aplicativo.Acho mais fácil ter uma cópia local do projeto em vez de forçar outros a instalar os dois produtos e configurar algum tipo de variável de ambiente para apontar para cada um.

Arquivos de script

Também tenho um diretório "scripts" em meu projeto que contém vários arquivos de configuração/script para meu projeto.Primeiro, há o arquivo launch4j.xml:

<launch4jConfig>
  <dontWrapJar>true</dontWrapJar>
  <headerType>gui</headerType>
  <jar>rpgam.jar</jar>
  <outfile>rpgam.exe</outfile>
  <errTitle></errTitle>
  <cmdLine></cmdLine>
  <chdir>.</chdir>
  <priority>normal</priority>
  <downloadUrl>http://www.rpgaudiomixer.com/</downloadUrl>
  <supportUrl></supportUrl>
  <customProcName>false</customProcName>
  <stayAlive>false</stayAlive>
  <manifest></manifest>
  <icon></icon>
  <jre>
    <path></path>
    <minVersion>1.5.0</minVersion>
    <maxVersion></maxVersion>
    <jdkPreference>preferJre</jdkPreference>
  </jre>
  <splash>
    <file>..\images\splash.bmp</file>
    <waitForWindow>true</waitForWindow>
    <timeout>60</timeout>
    <timeoutErr>true</timeoutErr>
  </splash>
</launch4jConfig>

E há o script NSIS rpgam-setup.nsis.Pode ser necessário um argumento VERSION para ajudar a nomear o arquivo.

; The name of the installer
Name "RPG Audio Mixer"

!ifndef VERSION
    !define VERSION A.B.C
!endif

; The file to write
outfile "..\dist\installers\windows\rpgam-${VERSION}.exe"

; The default installation directory
InstallDir "$PROGRAMFILES\RPG Audio Mixer"

; Registry key to check for directory (so if you install again, it will 
; overwrite the old one automatically)
InstallDirRegKey HKLM "Software\RPG_Audio_Mixer" "Install_Dir"

# create a default section.
section "RPG Audio Mixer"

    SectionIn RO

    ; Set output path to the installation directory.
    SetOutPath $INSTDIR
    File /r "..\dist\layout\windows\"

    ; Write the installation path into the registry
    WriteRegStr HKLM SOFTWARE\RPG_Audio_Mixer "Install_Dir" "$INSTDIR"

    ; Write the uninstall keys for Windows
    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RPGAudioMixer" "DisplayName" "RPG Audio Mixer"
    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RPGAudioMixer" "UninstallString" '"$INSTDIR\uninstall.exe"'
    WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RPGAudioMixer" "NoModify" 1
    WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RPGAudioMixer" "NoRepair" 1
    WriteUninstaller "uninstall.exe"

    ; read the value from the registry into the $0 register
    ;readRegStr $0 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" CurrentVersion

    ; print the results in a popup message box
    ;messageBox MB_OK "version: $0"

sectionEnd

Section "Start Menu Shortcuts"
  CreateDirectory "$SMPROGRAMS\RPG Audio Mixer"
  CreateShortCut "$SMPROGRAMS\RPG Audio Mixer\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
  CreateShortCut "$SMPROGRAMS\RPG AUdio Mixer\RPG Audio Mixer.lnk" "$INSTDIR\rpgam.exe" "" "$INSTDIR\rpgam.exe" 0
SectionEnd

Section "Uninstall"

    ; Remove registry keys
    DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\RPGAudioMixer"
    DeleteRegKey HKLM SOFTWARE\RPG_Audio_Mixer

    ; Remove files and uninstaller
    Delete $INSTDIR\rpgam.exe
    Delete $INSTDIR\uninstall.exe

    ; Remove shortcuts, if any
    Delete "$SMPROGRAMS\RPG Audio Mixer\*.*"

    ; Remove directories used
    RMDir "$SMPROGRAMS\RPG Audio Mixer"
    RMDir "$INSTDIR"

SectionEnd

Integração de formigas

Eu tenho alguns alvos em meu buildfile Ant (build.xml) para lidar com o acima.Primeiro eu disse ao Ant para importar as tarefas Ant do launch4j:

<property name="launch4j.dir" location="vendor/launch4j" />
<taskdef name="launch4j" 
    classname="net.sf.launch4j.ant.Launch4jTask"
    classpath="${launch4j.dir}/launch4j.jar:${launch4j.dir}/lib/xstream.jar" />

Tenho então um alvo simples para criar o executável do wrapper:

<target name="executable-windows" depends="jar" description="Create Windows executable (EXE)">
    <launch4j configFile="scripts/launch4j.xml" outfile="${exeFile}" />
</target>

E outro alvo para fazer o instalador:

<target name="installer-windows" depends="executable-windows" description="Create the installer for Windows (EXE)">
    <!-- Lay out files needed for building the installer -->
    <mkdir dir="${windowsLayoutDirectory}" />
    <copy file="${jarFile}" todir="${windowsLayoutDirectory}" />
    <copy todir="${windowsLayoutDirectory}/lib">
        <fileset dir="${libraryDirectory}" />
        <fileset dir="${windowsLibraryDirectory}" />
    </copy>
    <copy todir="${windowsLayoutDirectory}/icons">
         <fileset dir="${iconsDirectory}" />
    </copy>
    <copy todir="${windowsLayoutDirectory}" file="${exeFile}" />

    <mkdir dir="${windowsInstallerDirectory}" />

    <!-- Build the installer using NSIS -->
    <exec executable="vendor/nsis/makensis.exe">
        <arg value="/DVERSION=${version}" />
        <arg value="scripts/rpgam-setup.nsi" />
    </exec>
</target>

A parte superior apenas copia os arquivos necessários do instalador para um local temporário e a segunda metade executa o script que usa tudo isso para fazer o instalador.

Outras dicas

Na minha empresa usamos Lançamento4J para criar o arquivo exe e NSIS para criar o instalador, com aplicativos SWT.

Nós o usamos há anos em diversas aplicações comerciais e o par funciona bem.

Talvez você devesse dar uma olhada IzPack.Criei um instalador muito bom há alguns anos e aposto que eles ainda estão melhorando.Permite a instalação de documentos, binários e um link clicável para iniciar o aplicativo IIRC.

Eu usei o grátis Lançamento4J para criar um inicializador personalizado para meus programas Java no Windows.Combinado com o gratuito Instalador NSIS você pode construir um pacote interessante para seus usuários do Windows.

Editar: Não vi que você usa SWT.Não sei se funciona com SWT também, pois usei apenas Swing em meus aplicativos.

Você já pensou em escrever um pequeno programa em C/C++ que apenas chame CreateProcess iniciar o Java VM com o arquivo jar (ou classe)?

Você poderia conseguir Visual C++ Expresso e montar o programa de inicialização com bastante facilidade.Isso também tornaria mais fácil adicionar um ícone amigável.

Considere converter seu aplicativo para Eclipse RCP.Está escrito em SWT, e o Eclipse IDE contém ferramentas de empacotamento que geram executáveis ​​para todas as plataformas principais.Para windows, pode gerar um zip ou uma pasta contendo seu código.Para uma experiência de instalação comum, eu usaria o NSIS.Na verdade existe um gerador de pacotes projeto no Eclipse para criar instaladores comuns para todas as plataformas suportadas pelo Eclipse.

Você já pensou sobre Início da Web Java? Aqui é um tutorial específico para implementar um aplicativo SWT com Java Web Start.

Instalar4J.Não é gratuito, mas vale a pena.Dê uma chance ao julgamento

Agora você pode fazer isso através do Netbeans!É muito fácil e funciona perfeitamente.Confira esse tutorial no site do Netbeans.

Passei pelo mesmo e descobri que todas as opções gratuitas não eram muito boas.Parece que você escreverá o seu próprio.Eu estaria interessado em ver se alguém tem uma opção gratuita/barata que funcione

Outra opção que estava considerando:em vez de escrever um inicializador nativo do zero, o Eclipse vem com o código-fonte de seu próprio inicializador, e isso talvez possa ser reaproveitado para meu aplicativo.

É uma pena que a Sun nunca tenha incluído nada semelhante no JDK.

Outra votação para o Launch4J, acabei de escrever uma tarefa formiga esta manhã para integrar com um dos meus projetos.Parece funcionar muito bem

Eu usei JSmooth no passado e ainda tenho sorte com ele.A interface do usuário tem muitos bugs, mas eu só a uso para construir o arquivo de configuração uma vez e, depois disso, construo a partir do Ant.

Que problemas você está tendo com JSmooth?

JSMooth funcionou muito bem para nós em um ambiente de produção, onde primeiro gerei um único jar usando one-jar (plugin fat jar para Eclipse) e depois o envolvi com JSmooth.

(Observe que eu queria uma distribuição sem instalação de um único arquivo, que pudesse solicitar a instalação do JRE, se necessário).

Funcionou tão bem que pensei que ninguém estava usando :)

Você pode querer experimentar nossa ferramenta, Construtor de instalação BitRock.Embora seja um aplicativo nativo, muitos de nossos clientes o utilizam para empacotar aplicativos Java de desktop.Se você agrupar o JRE e criar o inicializador, etc.o usuário nem precisa saber que está instalando um aplicativo Java.É multiplataforma, então você pode gerar instaladores para Windows e Mac (e Linux, Solaris, etc.). Assim como a ferramenta install4j mencionada em outro post, é uma ferramenta comercial, mas temos licenças gratuitas para projetos de código aberto e descontos especiais para microISVs/pequenas empresas, etc.basta nos enviar um e-mail.Também gostaria de enfatizar que esta é uma ferramenta de instalação, portanto não atenderá às suas necessidades se você estiver procurando apenas um único arquivo executável.

Na minha empresa usamos launch4J e NSIS para a distribuição Windows, e jdeb para a distribuição Debian, e Java Web Start para o sistema operacional geral.Isso funciona muito bem.

Tente por favor InstalarJammer.O melhor que já usei.Gratuito e poderoso. E suficiente para uso pessoal e comercial.

Você já considerou o Instalador Avançado?

Eu o usei várias vezes, especialmente para Windows e Mac.Não é necessário script ou Ant.Tudo GUI.Muito simples e compreensível.Não é de graça, mas vale cada centavo.

- Lauch como Administrador
- Associação de arquivo
- Temas de instalação personalizados + temas integrados
- Pacote com JRE
- Local de instalação
- Implementação de tela inicial nativa
- Você pode criar eventos de serviços e eventos de instalação
- Pré-requisitos
- Versão mínima e versão máxima do JRE

E muito mais.E não se engane, não tenho conexões com os caras... o aplicativo deles é simplesmente incrível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top