Good news everyone!
If you develop on Mac OS X you can use the Jar Bundler application to turn jar files into Mac OS X applications. Jar Bundler is distributed with the other developer tools and is located in Developer/Applications/. Start it, select the 'Classpath and Files' tab and add the file JavaSoundDemo.jar. Select the 'Build Information' tab. Cross-play with Java Edition: Windows, Mac, and Linux Allows you to play with other Java edition players. Split screen multiplayer (online multiplayer requires subscription sold separately) Playing split screen allows up to four players to play on the screen at the same time.
You can now put your Java 8 applications onto the mac app store. How do I know? Because I put a little hackathon app I wrote on the Mac App Store. The better news is that Oracle is working on making this very simple with the JavaFX packager. You can get some of the early bits in the open source repo for OpenJFX here (building and using open source code is left as an exercise for the reader).
If you don’t want to wait for the code to get an official release and you are comfortable doing stuff by hand then here are the steps you will need to follow.
Prepare your Environment
First you will need to be signed up as part of the Mac Develoer program at [developer.apple.com]. For this tutorial I will presume your name is
Alice Duke
, that your Team ID is JJJJJJJJJJ
and that the app you are shipping is titled AwesomeJavaApp
. You will of course need to change these to real values.Download your signing keys if you haven’t done so already (here’s how). You will need both the Mac App Distribution and Mac Installer Distribution, and they should automatically be placed in your keychain under the names
3rd Party Mac Developer Application: Alice Duke (JJJJJJJJJJ)
and 3rd Party Mac Developer Installer: Alice Duke (JJJJJJJJJJ)
.You will also need an entitlements file. Read all about them at the Mac Developer Library. You will have to turn on the app-sandbox entitlement as well as any of the other entitlements you will be using. Be sure to keep track of what entitlements you grand and why they are needed. Apple will be asking you to justify every one of them.
Next, create your Mac
.app
bundle the normal way you are doing with the javafxpackager, Ant, Maven, or Gradle build. Make sure this app works as it is what we will be bundling up.Next, you will need to copy the info.plist from the existing JDK or JRE into the embedded JRE in your app. It should be either at
/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Info.plist
or /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Info.plist
, but it is likely to be the first one. Copy this file to AwesomeJavaApp.app/Contents/PlugIns/jdk1.8.0.jdk/Contents/Info.plist
.Now we need to strip a library. The Mac App Store doesn’t accept apps that even mention the deprecated Quicktime API, so we will need to remove the media capabilities tom JavaFX. If your app uses the JavaFX media apis you are out of luck for the time being. There is a bug to fix this in a future release.
The good news is that the Java 8 license lets us fix the problem, at least when it comes to JavaFX. Remove the file
libjfxmedia.dylib
.![Java download for mac Java download for mac](/uploads/1/3/4/2/134283799/689511471.png)
Signing the app (in may different places) is next. Apple loves their cryptographic hashes.
First, you may need to make the JDK in the app bundle writeable. The
codesign
program won’t sign read-only binaries. chmod -R +w AwesomeJavaApp.app/Contents/PlugIns/jdk1.8.0.jdk
should do the trick.You need to sign all jars, dylibs, and executable files in the bundle (with one exception). Enumerating them is left as an exercise to the reader. Any decent build tool can do it for you. You will need to sign it with both the identity you have and the entitlements you want
There is one caveat. Don’t sign the main excitable of the app bundle. It is in
Contents/MacOS
and has the name of your application, for example it would be AwesomeJavaApp.app/Contents/MacOS/AwesomeJavaApp
. We will get that signed another way.Another quirk is that you can give different entitlements to each file. In the javafxpackger we sign with an entitlements file that contains only the
app-sandbox
andinherit
entitlements, so they inherit all the entitlements from the main application.Next, you will want to sign the Java directory itself. Actually you need to sign all plugins and frameworks in your app, but the overwhelming majority of java apps will only have one plugin: Java.
Finally, we can sign the application itself. Yes, we can actually shave the yak at this point.
You may or may not need all of the flags I’ve show with
codesign
, as I have not exhaustively tested them in all the possibly combinations. You may not need the --deep
flag, but adding it will not get you out of signing all the interior jars and libraries. You may not need the -f
flag but it insures that your signature will be the only one. Finally, you may want to add a --verbose=4
flag to see all the gory details. Or not.I bet you thought you were done? Now we need to create an installer package to send to the app store. Use the
productbuld
too to generate the need fileNote that you are signing this with the second key you downloaded: the one for installers.
If you feel the need you can test the install:
Now you can load it into the Mac App store using the Application Loader tool. You will first need to go to iTunes Connect and set things up. But we have now left the Java specific part of the assembly so there are many other blog posts out there by more qualified and experienced Mac App Store developers.
There are many other potholes that you could run into. Two I hit were not having a 512x512@2x icon, and another was a dispute about copyright on an icon. I changed the icon rather than wade through the appeals process to prove that the icon was in the public domain.
I plan on keeping this post up to date with any changes or corrections, so feel free to bookmark this page.
xml:lang='en-US'>These documentation pages are no longer current. They remain available for archival purposes. Please visit
https://docs.oracle.com/javase
for the most up-to-date documentation.This page shows you, step by step, how to convert a simple Java application to a version you can distribute on a Mac. To follow along, download the ButtonDemo (.zip) example from the Java Tutorial. This example was created using NetBeans which uses the Ant utility. You can run all necessary tools and make all necessary edits from the command line, without launching NetBeans. The Ant tool is required.
You have created a Java application and want to bundle it for deployment. This requires the following steps:
Create a JAR File
This step creates the ButtonDemo.jar file.
Execute ant jar in the high-level project directory to create the dist/ButtonDemo.jar file. This jar file is used to create the .app package.
Bundle the JAR File into an App Package
![Package java app for mac Package java app for mac](/uploads/1/3/4/2/134283799/681221969.png)
To create the ButtonDemo.app package, use the appbundler tool. The appbundler is not shipped with the 7u6 version of the Oracle JDK for the Mac. You can download it from the Java Application Bundler project on java.net. There is also AppBundler Documentation available.
As of this writing, the most recent version is appbundler-1.0.jar, which is used by this document. Download the latest version available and substitute the file name accordingly.
- Install the appbundler-1.0.jar file. In this case, create a lib directory in the high-level project directory and add the appbundler-1.0.jar file.
- Modify the build.xml file in the high-level project directory as follows. (The added code is shown in bold.)
- Invoke the appbundler by typing ant bundle-buttonDemo from the high-level project directory. This creates the ButtonDemo.app package in the dist directory.
- You should now be able to launch the application by double clicking ButtonDemo.app in the Finder, or by typing open ButtonDemo.app at the command line.
Bundle the JRE with the App Package
In order to distribute a Java application, you want to avoid dependencies on third party software. Your app package should include the Java Runtime Environment, or JRE. In fact, the Apple Store requires the use of an embedded JRE as a prerequisite for Mac App Store distribution. The runtime sub-element of the <bundleapp> task specifies the root of the JRE that will be included in the app package.
In this example, the location of the JRE is defined using the JAVA_HOME environment variable. However, you might choose to bundle a JRE that is not the same as the one you are using for development. For example you might be developing on 7u6, but you need to bundle the app with 7u4. You will define runtime accordingly.
Since this example defines the runtime sub-element using JAVA_HOME, make sure it is configured correctly for your environment. For example, in your .bashrc file, define JAVA_HOME as follows:
Use the following steps to modify the build.xml file at the top of the project directory:
- Specify an environment property, named env:
- In the target that creates the bundle, specify the location of the JRE on your system, using the env property:
The resulting build.xml file should look like the following. (The new lines are shown in bold.)
Create a fresh version of ButtonDemo.app, using the ant bundle-buttonDemo command. The resulting version includes the JRE in the app package. You can confirm this by examining the Contents/PlugIns directory inside of the app package.
Sign the App
The Gatekeeper feature, introduced in Mountain Lion (OS X 10.8), allows users to set the level of security for downloaded applications. By default, Gatekeeper is set to allow only OS X App Store and Developer ID signed applications. Unless your app is signed with a Developer ID certificate provided by Apple, your application will not launch on a system with Gatekeeper's default settings.
For information on the signing certificates available, see Code Signing Tasks on developer.apple.com.
The signing certificate contains a field called Common Name. Use the string from the Common Name field to sign your application.
Java For Mac Os
Sign your app using the codesign(1) tool, as shown in the following example:
To verify that the app is signed, the following command provides information about the signing status of the app:
To check whether an application can be launched when Gatekeeper is enabled, use the spctl command:
Install Java For Mac
If you leave off the --verbose tag, and it does not print any output, indicates 'success'.
Package Java App For Mac
For more information, see Distributing Outside the Mac App Store on developer.apple.com.
Java Uninstall Tool For Mac
Submitting an App to the Mac App Store
Packaging an app for the Mac App Store is similar to packaging for regular distribution up until the step of signing the app. Signing the app for the Mac App Store requires a few more steps, and a different kind of certificate.
You will need to create an application ID and then obtain a distribution certificate for that application ID. Submit your app using Application Loader. For more information, see the following links (on developer.apple.com):
Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.