I want to create an Windows installer for a Java application, though the native executables already exist and hence it simplifies to installing any kind of files. This question is similar to this one, but with following restrictions:
the Windows installer must be a native one, it must require an installed or bundled JRE
the installer creation must be platform independent, so it can be run on Windows, Linux or OS X (e.g. Java/ANT-based installer creation)
Currently, depending on our specific product, we are using WiX and InnoSetup, but both require the build process to be running on Windows. I want to avoid using Windows or Wine, but search a tool which already does it on all platforms.
Have you tried Wine compatability for Wix & InnoSetup? Also you can make scripts that start virtual machines to do stuff like this automatically. I have a Linux system that makes Windows XP/Windows 7 installation files using a combination of Wine and VirtualBox scripting.
Related
I imagine some Java gurus with experience delivering Java apps on Windows desktops will be able to ace this one. I've always been a Mac/Linux Java developer so this is uncharted territory for me :-/.
I have to write a Java 8 Swing application and install it on a Windows 10 (64-bit) machine. My gameplan is to package the app as an executable JAR and wrap it with Launch4J, so that it looks like a native Windows EXE (.exe file). However its a little bit more complication than that when it comes to the distribution:
There will be the JAR/EXE as mentioned above, lets call it myapp.exe (built from myapp.jar)
The app will output logs to a (local?) directory, myapp.log
The app will load a config file at runtime, myapp.properties
The distribution should also contain the User's Guide, MyApp User Guide.html
Let's assume a Java 8 JRE/JDK is already installed on the machine, so we don't need to worry about installing Java itself.
The installation process must be simple and include:
Removing the old version (and all of its other artifacts such as the log file, config/properties file, user guide, etc) off the machine completely
Installing the new version at either the Windows 10 default location, or allowing the user to specify a different location
Additionally, if at all possible, I'd like the installation process to include:
A requirements check for things like minimum memory and disk space, OS version info/compatibility (i.e. make sure its being installed on Windows 10, etc.)
Provide an easy-to-use wizard such as an MSI that the user can click though
Optionally install shortcuts to the user's Desktop
Given all this, I'm wondering what my options are in the modern Windows 10/Java/Launch4J landscape. Are there tools that will help me script together MSIs quickly, or do I have to write my own in, say, C#/.NET and have that be a separate binary/project? If MSIs aren't an option, what options exist that might hit all my bullets above?
I realize I could just distribute the whole thing as a ZIP, and have the installation process look something like:
Save the ZIP to some place on the user's machine, say, the Desktop
Move the previous app and its artifacts to the trash, manually
Unzip the new ZIP
However that feels janky and I'm looking for something more professional. Any solutions here?
JDK 8 is bundled with a tool called javapackager (formerly javafxpackager) which is part of JavaFX. However, you can use it package java swing application without using JavaFX. This tool can generate an installer file (exe or msi) which contains the application and the Java runtime as well.
Here is an example:
javapackager -deploy -native exe -Bruntime="C:\Program Files\Java\jdk1.8.0_66\jre" -Bicon=app_icon.ico -BsystemWide=true -BshortcutHint=true -outdir packages -outfile appFile -srcdir dist -srcfiles MyApp.jar;COPYING.txt -appclass somePackage.MainClass -BlicenseFile=COPYING.txt -name appName -title "The application name"
For more information, see adding icon to bundle using javapackager
There is also a new tool called jpackage which is based on javapackager. It is proposed to be released with the next JDK release, JDK 14. Note that javapackager was removed from JDK since version 11 as part of the removal of JavaFX.
See A Brief Example Using the Early Access jpackage Utility
Tools: Some deployment tools information:
Multi-Platform Installers
List of the major MSI installer tools
WiX quick start tips (the open source, free tool with a heavy learning curve)
"Hello WiX - step-by-step in Visual Studio"
"Hello World" - WiX style
Advanced Installer: As stated in a comment above you can use Advanced Installer to install Java applications on Windows and Mac (no Linux support).
Videos: Here are some videos from Advanced Installer (commercial tool) on Java installations:
Hello Java Installer: 1 minute video that shows the basics of installing a Java application
List of Java-related videos: https://www.youtube.com/user/AdvancedInstaller/search?query=java+jre
Tutorial (to read): Package your Java application for Windows and for Mac OS. Java landing page.
Digression: Not Java as such - do have a skim. Auto-updating applications using various deployment technologies: What is the best practice to auto upgrade MSI based application?
Links:
Make Installer of java Application
Installer for Java Web Application
How to create windows installer
How to create a MSI Windows installer for a Java program?
Old: How can I convert my Java program to an .exe file?
Let say I am not a java developer and an ordinary person, and installing any application that is written in Java. So, do I need to first install the JRE or no all operating systems already have JRE installed on them?
Do all operating systems already have JRE installed for running java applications?
No.
First of all, Java is not necessarily available for all operating systems. (It is probably available for most operating systems that are targeted by your application ... but it might not be.)
Secondly, most operating system platforms don't have Java installed by default. Indeed many OS vendors don't support Java at all: Java is provided by a 3rd-party vendor.
So, do I need to first install the JRE or no all operating systems already have JRE installed on them?
Prior to Java 9, the answer is that you have to install a JRE or a JDK. This can be done by downloading and installing it directly, or installing it via a package management system on some OSes. It can also be done by embedding a JRE in your application's installer.
From Java 9 onwards, you can also use "jlink" to create an executable that contains a cut-down JRE which is tailored to run your application on a specific target platform. This is the approach recommended by Oracle for people who want to distribute "consumer grade" Java applications.
And from Java 11 onwards, for some Java vendors (Oracle for example), the JRE option is no longer available. For these vendors, if you want "full" Java to run your application, you / your users need to install a JDK.
The Java Runtime Environment has nothing to do with the OS. You could install any OS with or without the JRE. If you installed the OS yourself, I'd guess it doesn't have it. If you bought the computer with the OS on it, it depends who you bought it from.
Checking if you have JRE installed is pretty much the same on all OS. Open a Terminal (on windows run CMD) and type java --version.
If you don't have it, you need to install it. Just google install JRE on [insert your os here]
I designed a Java application with some JavaFX features, whose ideal target is the Java 8 JRE. The application works fine, and has to be ran on several OS, like Windows, Mac OS or Linux.
The application is designed with Eclipse and JavaFX scene builder.
Thought I manage in installing manually it on Mac OS, I would need a more automated process for end-users: so far, I must copy the files, run a JRE installer if needed and finally launch the application.
Now what I need is some kind of script that would do the job in one click:
- Check whether the appropriate JRE is available or not
- Install or upgrade the appropriate JRE
- Copy the needed files
- Set a shortcut on the desktop
- Launch the application.
Does anybody know which tool I should try ?
Thanks!
I have a Java program, let's say it's called MyApp.jar
To run it on Linux, I just write a shell script called myapp.sh, which simply runs java -jar MyApp.jar and double click on it. Everything works well.
On Windows 7, I cannot assume that the java command will be in everyone's path (if that's what you call it on Windows), so I have to have a workaround and do something like create a batch script with this in it: "C:\Program Files (x86)\Java\jre6\bin\java.exe" -jar MyApp.jar, which is obviously a Bad Solution... and it doesn't work on XP or Vista. It works on most Windows 7 machines though.
My application ships as a .zip file, the user extracts it to a folder MyApp, and then ideally will double click on something to invoke the program. So far it has a .sh script for Linux users to double click on, and a batch script for Windows 7 users (it works in most cases). It creates and consumes files in its own directory (MyApp).
What is the best way to invoke this program in a cross platform way?
Thanks!
As mentioned by biziclop, Java Web Start is commonly used to install/launch/update Java desktop apps.
As far as the JRE goes, it is usually sufficient to use the deployJava.js linked from that page above to ensure minimum necessary JRE is installed, and the elements in the JNLP file to specify any JRE micro-versions that are supported for the app.
Application launch
JWS can install desktop shortcuts and menu items when supported by the OS. Those can be specified in the launch file, or added/removed at run-time using services of the JNLP API.
If you can't deliver Java with your application, it might be a good solution to use JAVA_HOME to start it. It is set on, well... not all but many systems.
Definitly you should not use C:\Program Files (x86)... it is much better to use the environment variable %ProgramFiles%
Java application require a java runtime environment with a certain version to be installed on the target system.
The most convenient way, to my opinion, is to ship all libraries and documentation in a single archive and add start scripts for windows and *nix systems.
You could ship a JRE with your application too but then you'd have to support builds for different platforms...
I've managed to run JavaFX 2.0 under Linux by following this guide. It works nicely by running a Windows version of Java using Wine. This Java process can pick up the native .dll files of the Windows version of JavaFX.
Now I wonder if there is a different solution that runs a Linux version of Java but somehow makes access to the .dll files through Wine.
To sum it up graphically:
works: Wine -> Java(win) -> DLL(win)
what I'm asking: Java(linux) -> Wine -> DLL(win)
Why I want to do it
I have the hope to make the application start like any other Java application and only require an installation of Wine. The already working solution requires a Wine installation and a Windows version of Java.
I doubt wine makes .dll appear as .so Wine works by creating an emulated environment and applications have to be run inside that environment to work.
What you should be able to do is
Java(linux) -- socket --> Java(Wine) -- loads --> DLL(win)