Designer on MacOS asking to have Java SE 6 runtime installed

  • 7023835
  • 23-Apr-2019
  • 03-Dec-2019

Environment


Identity Manager 4.7.2
Identity Manager 4.7.2 Designer on MacOS
Identity Manager 4.8
Identity Manager 4.8 Designer on MacOS

Situation

When starting Designer.app it will give an error, and request to have Java SE 6 runtime installed.


'To open "Designer" you need to install the legacy Java SE 6 runtime.'

Resolution

It is not necessary to install a Java SE 6 runtime, as the message indicates. In order to prevent this message from being displayed, please follow these steps:

1.  Download and Install Azul zulu Open JDK 8 8u222-b10 (or newer Java 8 version such as 8u232-b18) from .dmg


2.  Updated the Info.plist using the NetIQ script in 2a, or Manually in 2b.

2a.  To updated Info.plist using the NetIQ script perform the following actions:

     I.  Open a browser and specify the following URL: https://nu.novell.com/designer/IDM-Designer-MacOSX

     II.  Download the updateInfoPlistScript.py file.  (see Additional Notes)

     III.  Launch a terminal window and run the following command from the directory where you have downloaded the updateInfoPlistScript.py file:

           sudo python updateInfoPlistScript.py

     IV.  Specify the value corresponding to the Azul Zulu JDK version you installed such as 8u222-b10.

     V.  From the list of Designer versions displayed, specify the value corresponding to the required Designer version.

          The Info.plist file is updated.

See Section 6.0 Installing Designer on macOS 10.14 (Mojave) of the NetIQ Identity Manager Designer 4.8 Release Notes

2b.  To update the Info.plist manually perform the following actions.

Edit the file Info.plist under /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/ and change the following section from:

 
<key>JVMCapabilities</key>
<array>
<string>CommandLine</string>
</array> 

 To

<key>JVMCapabilities</key>
<array>
<string>JNI</string>
<string>BundledApp</string>
<string>CommandLine</string>
</array>
 - Edit the file Info.plist under /Applications/Designer/Designer.app/Contents and change the following section from:
 
<key>Eclipse</key>
<array>
<!-- to use a specific Java version (instead of the platform's default) uncomment one of the following options,
                    or add a VM found via $/usr/libexec/java_home -V
                <string>-vm</string><string>/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Commands/java</string>
                <string>-vm</string><string>/Library/Java/JavaVirtualMachines/1.8.0.jdk/Contents/Home/bin/java</string>
            -->
            <string>-keyring</string><string>~/.eclipse_keyring</string>
            <string>-showlocation</string>
            <!-- WARNING:
                If you try to add a single VM argument (-vmargs) here,
                *all* vmargs specified in eclipse.ini will be ignored.
                We recommend to add all arguments in eclipse.ini
             -->
        </array>

To
    <key>Eclipse</key>
        <array>
            <!-- to use a specific Java version (instead of the platform's default) uncomment one of the following options,
                    or add a VM found via $/usr/libexec/java_home -V
                <string>-vm</string><string>/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Commands/java</string>
                <string>-vm</string><string>/Library/Java/JavaVirtualMachines/1.8.0.jdk/Contents/Home/bin/java</string>
            -->
            <string>-vm</string><string>/Applications/Designer/jre/bin/java</string>
            <string>-keyring</string><string>~/.eclipse_keyring</string>
            <string>-showlocation</string>
            <!-- WARNING:
                If you try to add a single VM argument (-vmargs) here,
                *all* vmargs specified in eclipse.ini will be ignored.
                We recommend to add all arguments in eclipse.ini
             -->
        </array>

3.  After these changes are made, it should be possible to start Designer.

Additional Information

#------------------contents of updateInfoPlistScript.py file------------------------
#!/usr/bin/python
import plistlib, os.path, os, sys

print(" ================================================================================================================================|| ")
print(" ||                                                                                                                                 ")
print(" || This script solves the issue in Mac for Designer which prompts" + ' "To install the legacy Java SE 6 runtime to launch Designer"')
print(" || The script perform the below operations :                                                                                       ")
print(" || 1> Script will update the Azul Zulu OpenJDK info.plist with  JNI and BundledApp capabilites                                     ")
print(" || 2> Script updates the selected Designer info.plist -vm attribute with Designer out of box open jre                              ")
print(" ||                                                                                                                                 ")
print(" ================================================================================================================================|| ")

# Based off of https://forums.developer.apple.com/message/6741
#          and http://apple.stackexchange.com/a/136976

def jdk_info_plists():
    JDK_ROOT = "/Library/Java/JavaVirtualMachines"
    #print("---->Script to update the Info.Plist for open Jdk<----")
    # It's present, let's look for installs
    folderList = []
    if os.path.exists(JDK_ROOT) and os.path.isdir(JDK_ROOT):
        i = 1
        for jdkFol in os.listdir(JDK_ROOT):
            if jdkFol.startswith("zulu") or jdkFol.startswith("Zulu"):
                print("{}> {}".format(i, jdkFol))
                i = i + 1
                folderList.append(jdkFol)

    if len(folderList) == 0:
        print("Please install Azul Zulu OpenJDK to list and rerun the script !!")
        sys.exit()
    try:
        OPEN_JDK = int(input("Enter the Azul Zulu OpenJDK listed from above list:"))
        print("Selected Azul Zulu OpenJDK to update Info.plist -> {}".format(folderList[OPEN_JDK - 1]))
    except:
        print("Invalid entry! Please rerun the script.")
        sys.exit()

    jdk_dir = os.path.join(JDK_ROOT, str(folderList.pop(OPEN_JDK - 1)))
    if os.path.isdir(jdk_dir):
        info_plist_fol = os.path.join(jdk_dir, "Contents", "Info.plist")
        jdk_dir = os.path.join(jdk_dir, "Contents", "Home", "bin", "java")
        return info_plist_fol
    else:
        return


def designer_info_plist():
    des = "/Applications"
    folderList = []
    if os.path.exists(des) and os.path.isdir(des):
        # It's present, let's look for installs
        print("Designer Applications")
        i = 1
        for jdkFol in os.listdir(des):
            if jdkFol.startswith("Des"):
                print("{}> {}".format(i, jdkFol))
                i = i + 1
                folderList.append(jdkFol)

    if len(folderList)==0:
        print("Invalid entry! No Designer instance found to update.")
        sys.exit()
    #Selected Designer Variable
    selected_des=''
    try:
        designer_dir = int(input("Enter the Designer listed from above list to update: "))
        selected_des = folderList[designer_dir-1]
    except:
        print("Invalid entry! Please rerun the script.")
        sys.exit()
   
    path = os.path.join(des, selected_des, "Designer.app", "Contents")
    designer_jre_path = os.path.join(des,selected_des, "jre", "bin", "java")
    if os.path.exists(path) and os.path.isdir(path):
        infolist = os.path.join(path, "Info.plist")
        if os.path.isfile(infolist):
            try:
                dinfo = plistlib.readPlist(infolist)
                capabilitiesDesInfoPlist = set(dinfo['Eclipse'])
                capabilitiesDesInfoPlist.add("-vm")
                capabilitiesDesInfoPlist.add(designer_jre_path)
                # Update our changes
                dinfo['Eclipse'] = sorted(capabilitiesDesInfoPlist)
                plistlib.writePlist(dinfo, infolist)
                print(selected_des +" successfully updated.")
            except:
                print("error found")


if __name__ == '__main__':
    info_plist = jdk_info_plists()
    try:
        if os.path.isfile(info_plist):
            info = plistlib.readPlist(info_plist)
           
            capabilities = set(info['JavaVM']['JVMCapabilities'])
            capabilities.add('JNI')
            capabilities.add('BundledApp')
            # Update our changes
            info['JavaVM']['JVMCapabilities'] = sorted(capabilities)
          
            plistlib.writePlist(info, info_plist)
            # Create a symlink to fix legacy applications
            # Find the Contents directory
            contents_path = os.path.dirname(info_plist)
            # make the bundle/Libraries subpath
            bundle_libraries = os.path.join(contents_path, "Home", "bundle", "Libraries")
            try:
                # Just in case you run this script multiple times, we'll fail if the directory already exists
                os.makedirs(os.path.join(bundle_libraries))
            except:
                pass
            # create the symlink between libjvm.dylib and libserver.dylib
            libjvm_dylib = os.path.join(contents_path, "Home", "jre", "lib", "server", "libjvm.dylib")
            libserver_dylib = os.path.join(bundle_libraries, "libserver.dylib")
            try:
                #Just in case you run this script multiple times, we'll fail if the file already exists
                os.symlink(libjvm_dylib, libserver_dylib)
            except:
                pass
            print("Info.plist successfully Updated !!")
            designer_info_plist()
    except IOError as io:
        print(io.strerror)
        pass
    except Exception as e:
        print(e.message)
        print("Script Failed, Please rerun the script !!")
#------------------end contents of updateInfoPlistScript.py file------------------------

# Related Technical Information Documents