Packaging Java apps for the Windows/Linux desktop

后端 未结 18 1886
时光说笑
时光说笑 2020-12-02 06:41

I am writing an application in Java for the desktop using the Eclipse SWT library for GUI rendering. I think SWT helps Java get over the biggest hurdle for acceptance on th

相关标签:
18条回答
  • 2020-12-02 07:16

    You can now do this through Netbeans! It's really easy and works perfectly. Check out this tutorial on the Netbeans website.

    0 讨论(0)
  • 2020-12-02 07:17

    To follow up on pauxu's answer, I'm using launch4j and NSIS on a project of mine and thought it would be helpful to show just how I'm using them. Here's what I'm doing for Windows. BTW, I'm creating .app and .dmg for Mac, but haven't figured out what to do for Linux yet.

    Project Copies of launch4j and NSIS

    In my project I have a "vendor" directory and underneath it I have a directory for "launch4j" and "nsis". Within each is a copy of the install for each application. I find it easier to have a copy local to the project rather than forcing others to install both products and set up some kind of environment variable to point to each.

    Script Files

    I also have a "scripts" directory in my project that holds various configuration/script files for my project. First there is the launch4j.xml file:

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

    And then there's the NSIS script rpgam-setup.nsis. It can take a VERSION argument to help name the file.

    ; 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
    

    Ant Integration

    I have some targets in my Ant buildfile (build.xml) to handle the above. First I tel Ant to import launch4j's Ant tasks:

    <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" />
    

    I then have a simple target for creating the wrapper executable:

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

    And another target for making the installer:

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

    The top portion of that just copies the necessary files for the installer to a temporary location and the second half executes the script that uses all of it to make the installer.

    0 讨论(0)
  • 2020-12-02 07:17

    Have you considered Advanced Installer?

    I have used it severally especially for Windows and Mac. No scripting or Ant required. All GUI. Very simple and understandable. Ain't free but worth every penny.

    - Lauch as Administrator
    - File Association
    - Custom Install Themes + In built Themes
    - Package with JRE
    - Install location
    - Native Splash screen implementation
    - You can event create services and installation events
    - Prerequisites
    - JRE minimum version and maximum version

    And a lot more. And don't get it twisted, i have no connections with the dudes...their App is just awesome.

    0 讨论(0)
  • 2020-12-02 07:18

    In my company we use launch4J and NSIS for the windows distribution, and jdeb for the Debian distribution, and Java Web Start for the general operating system. This works quite fine.

    0 讨论(0)
  • 2020-12-02 07:20

    Install4J. Not free, but worth it. Give the trial a shot

    0 讨论(0)
  • 2020-12-02 07:23

    Another vote for Launch4J, just wrote an ant task this morning to integrate with one of my projects. Seems to work really well

    0 讨论(0)
提交回复
热议问题