Mac安装JD-GUI

Mac安装反编译工具步骤如下:

  1. 打开官网https://java-decompiler.github.io/
  2.  选择下载mac的安装包
  3. 解压下载好的压缩包,点击JD-GUI安装 
  4. 有可能会遇到如下错误。
  5. 请先检查是否安装JDK,通过java -version命令查看是否是1.8版本的jdk
  6. 如果jdk没问题,那么需要修改安装包文件。
  7. 点击显示包内容->Contents->MacOs->universalJavaApplicationStub.sh;
  8. 编辑文件,把universalJavaApplicationStub.sh文件内容替换为如下内容:
  9. #!/bin/bash
    ##################################################################################
    #                                                                                #
    # universalJavaApplicationStub                                                   #
    #                                                                                #
    # A BASH based JavaApplicationStub for Java Apps on Mac OS X                     #
    # that works with both Apple's and Oracle's plist format.                        #
    #                                                                                #
    # Inspired by Ian Roberts stackoverflow answer                                   #
    # at http://stackoverflow.com/a/17546508/1128689                                 #
    #                                                                                #
    # @author    Tobias Fischer                                                      #
    # @url       https://github.com/tofi86/universalJavaApplicationStub              #
    # @date      2020-03-19                                                          #
    # @version   3.0.6                                                               #
    #                                                                                #
    ##################################################################################
    #                                                                                #
    # The MIT License (MIT)                                                          #
    #                                                                                #
    # Copyright (c) 2014-2020 Tobias Fischer                                         #
    #                                                                                #
    # Permission is hereby granted, free of charge, to any person obtaining a copy   #
    # of this software and associated documentation files (the "Software"), to deal  #
    # in the Software without restriction, including without limitation the rights   #
    # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell      #
    # copies of the Software, and to permit persons to whom the Software is          #
    # furnished to do so, subject to the following conditions:                       #
    #                                                                                #
    # The above copyright notice and this permission notice shall be included in all #
    # copies or substantial portions of the Software.                                #
    #                                                                                #
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR     #
    # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,       #
    # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE    #
    # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER         #
    # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  #
    # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE  #
    # SOFTWARE.                                                                      #
    #                                                                                #
    ################################################################################### function 'stub_logger()'
    #
    # A logger which logs to the macOS Console.app using the 'syslog' command
    #
    # @param1  the log message
    # @return  void
    ################################################################################
    function stub_logger() {syslog -s -k \Facility com.apple.console \Level Notice \Sender "$(basename "$0")" \Message "[$$][${CFBundleName:-$(basename "$0")}] $1"
    }# set the directory abspath of the current
    # shell script with symlinks being resolved
    ############################################PRG=$0
    while [ -h "$PRG" ]; dols=$(ls -ld "$PRG")link=$(expr "$ls" : '^.*-> \(.*\)$' 2>/dev/null)if expr "$link" : '^/' 2> /dev/null >/dev/null; thenPRG="$link"elsePRG="$(dirname "$PRG")/$link"fi
    done
    PROGDIR=$(dirname "$PRG")
    stub_logger "[StubDir] $PROGDIR"# set files and folders
    ############################################# the absolute path of the app package
    cd "$PROGDIR"/../../ || exit 11
    AppPackageFolder=$(pwd)# the base path of the app package
    cd .. || exit 12
    AppPackageRoot=$(pwd)# set Apple's Java folder
    AppleJavaFolder="${AppPackageFolder}"/Contents/Resources/Java# set Apple's Resources folder
    AppleResourcesFolder="${AppPackageFolder}"/Contents/Resources# set Oracle's Java folder
    OracleJavaFolder="${AppPackageFolder}"/Contents/Java# set Oracle's Resources folder
    OracleResourcesFolder="${AppPackageFolder}"/Contents/Resources# set path to Info.plist in bundle
    InfoPlistFile="${AppPackageFolder}"/Contents/Info.plist# set the default JVM Version to a null string
    JVMVersion=""
    JVMMaxVersion=""# function 'plist_get()'
    #
    # read a specific Plist key with 'PlistBuddy' utility
    #
    # @param1  the Plist key with leading colon ':'
    # @return  the value as String or Array
    ################################################################################
    plist_get(){/usr/libexec/PlistBuddy -c "print $1" "${InfoPlistFile}" 2> /dev/null
    }# function 'plist_get_java()'
    #
    # read a specific Plist key with 'PlistBuddy' utility
    # in the 'Java' or 'JavaX' dictionary (<dict>)
    #
    # @param1  the Plist :Java(X):Key with leading colon ':'
    # @return  the value as String or Array
    ################################################################################
    plist_get_java(){plist_get ${JavaKey:-":Java"}$1
    }# read Info.plist and extract JVM options
    ############################################# read the program name from CFBundleName
    CFBundleName=$(plist_get ':CFBundleName')# read the icon file name
    CFBundleIconFile=$(plist_get ':CFBundleIconFile')# check Info.plist for Apple style Java keys -> if key :Java is present, parse in apple mode
    /usr/libexec/PlistBuddy -c "print :Java" "${InfoPlistFile}" > /dev/null 2>&1
    exitcode=$?
    JavaKey=":Java"# if no :Java key is present, check Info.plist for universalJavaApplication style JavaX keys -> if key :JavaX is present, parse in apple mode
    if [ $exitcode -ne 0 ]; then/usr/libexec/PlistBuddy -c "print :JavaX" "${InfoPlistFile}" > /dev/null 2>&1exitcode=$?JavaKey=":JavaX"
    fi# read 'Info.plist' file in Apple style if exit code returns 0 (true, ':Java' key is present)
    if [ $exitcode -eq 0 ]; thenstub_logger "[PlistStyle] Apple"# set Java and Resources folderJavaFolder="${AppleJavaFolder}"ResourcesFolder="${AppleResourcesFolder}"APP_PACKAGE="${AppPackageFolder}"JAVAROOT="${AppleJavaFolder}"USER_HOME="$HOME"# read the Java WorkingDirectoryJVMWorkDir=$(plist_get_java ':WorkingDirectory' | xargs)# set Working Directory based upon PList valueif [[ ! -z ${JVMWorkDir} ]]; thenWorkingDirectory="${JVMWorkDir}"else# AppPackageRoot is the standard WorkingDirectory when the script is startedWorkingDirectory="${AppPackageRoot}"fi# expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOMEWorkingDirectory=$(eval echo "${WorkingDirectory}")# read the MainClass nameJVMMainClass="$(plist_get_java ':MainClass')"# read the SplashFile nameJVMSplashFile=$(plist_get_java ':SplashFile')# read the JVM Properties as an array and retain spacesIFS=$'\t\n'JVMOptions=($(xargs -n1 <<<$(plist_get_java ':Properties' | grep " =" | sed 's/^ */-D/g' | sed -E 's/ = (.*)$/="\1"/g')))unset IFS# post processing of the array follows further below...# read the ClassPath in either Array or String styleJVMClassPath_RAW=$(plist_get_java ':ClassPath' | xargs)if [[ $JVMClassPath_RAW == *Array* ]] ; thenJVMClassPath=.$(plist_get_java ':ClassPath' | grep "    " | sed 's/^ */:/g' | tr -d '\n' | xargs)elseJVMClassPath=${JVMClassPath_RAW}fi# expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOMEJVMClassPath=$(eval echo "${JVMClassPath}")# read the JVM Options in either Array or String styleJVMDefaultOptions_RAW=$(plist_get_java ':VMOptions' | xargs)if [[ $JVMDefaultOptions_RAW == *Array* ]] ; thenJVMDefaultOptions=$(plist_get_java ':VMOptions' | grep "    " | sed 's/^ */ /g' | tr -d '\n' | xargs)elseJVMDefaultOptions=${JVMDefaultOptions_RAW}fi# read StartOnMainThread and add as -XstartOnFirstThreadJVMStartOnMainThread=$(plist_get_java ':StartOnMainThread')if [ "${JVMStartOnMainThread}" == "true" ]; thenJVMDefaultOptions+=" -XstartOnFirstThread"fi# read the JVM Arguments in either Array or String style (#76) and retain spacesIFS=$'\t\n'MainArgs_RAW=$(plist_get_java ':Arguments' | xargs)if [[ $MainArgs_RAW == *Array* ]] ; thenMainArgs=($(xargs -n1 <<<$(plist_get_java ':Arguments' | tr -d '\n' | sed -E 's/Array \{ *(.*) *\}/\1/g' | sed 's/  */ /g')))elseMainArgs=($(xargs -n1 <<<$(plist_get_java ':Arguments')))fiunset IFS# post processing of the array follows further below...# read the Java version we want to findJVMVersion=$(plist_get_java ':JVMVersion' | xargs)# post processing of the version string follows below...# read 'Info.plist' file in Oracle style
    elsestub_logger "[PlistStyle] Oracle"# set Working Directory and Java and Resources folderJavaFolder="${OracleJavaFolder}"ResourcesFolder="${OracleResourcesFolder}"WorkingDirectory="${OracleJavaFolder}"APP_ROOT="${AppPackageFolder}"# read the MainClass nameJVMMainClass="$(plist_get ':JVMMainClassName')"# read the SplashFile nameJVMSplashFile=$(plist_get ':JVMSplashFile')# read the JVM Options as an array and retain spacesIFS=$'\t\n'JVMOptions=($(plist_get ':JVMOptions' | grep "    " | sed 's/^ *//g'))unset IFS# post processing of the array follows further below...# read the ClassPath in either Array or String styleJVMClassPath_RAW=$(plist_get ':JVMClassPath')if [[ $JVMClassPath_RAW == *Array* ]] ; thenJVMClassPath=.$(plist_get ':JVMClassPath' | grep "    " | sed 's/^ */:/g' | tr -d '\n' | xargs)# expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOMEJVMClassPath=$(eval echo "${JVMClassPath}")elif [[ ! -z ${JVMClassPath_RAW} ]] ; thenJVMClassPath=${JVMClassPath_RAW}# expand variables $APP_PACKAGE, $JAVAROOT, $USER_HOMEJVMClassPath=$(eval echo "${JVMClassPath}")else#default: fallback to OracleJavaFolderJVMClassPath="${JavaFolder}/*"# Do NOT expand the default 'AppName.app/Contents/Java/*' classpath (#42)fi# read the JVM Default OptionsJVMDefaultOptions=$(plist_get ':JVMDefaultOptions' | grep -o " \-.*" | tr -d '\n' | xargs)# read the Main Arguments from JVMArguments key as an array and retain spaces (see #46 for naming details)IFS=$'\t\n'MainArgs=($(xargs -n1 <<<$(plist_get ':JVMArguments' | tr -d '\n' | sed -E 's/Array \{ *(.*) *\}/\1/g' | sed 's/  */ /g')))unset IFS# post processing of the array follows further below...# read the Java version we want to findJVMVersion=$(plist_get ':JVMVersion' | xargs)# post processing of the version string follows below...
    fi# (#75) check for undefined icons or icon names without .icns extension and prepare
    # an osascript statement for those cases when the icon can be shown in the dialog
    DialogWithIcon=""
    if [ ! -z ${CFBundleIconFile} ]; thenif [[ ${CFBundleIconFile} == *.icns ]] && [[ -f "${ResourcesFolder}/${CFBundleIconFile}" ]] ; thenDialogWithIcon=" with icon path to resource \"${CFBundleIconFile}\" in bundle (path to me)"elif [[ ${CFBundleIconFile} != *.icns ]] && [[ -f "${ResourcesFolder}/${CFBundleIconFile}.icns" ]] ; thenCFBundleIconFile+=".icns"DialogWithIcon=" with icon path to resource \"${CFBundleIconFile}\" in bundle (path to me)"fi
    fi# JVMVersion: post processing and optional splitting
    if [[ ${JVMVersion} == *";"* ]]; thenminMaxArray=(${JVMVersion//;/ })JVMVersion=${minMaxArray[0]//+}JVMMaxVersion=${minMaxArray[1]//+}
    fi
    stub_logger "[JavaRequirement] JVM minimum version: ${JVMVersion}"
    stub_logger "[JavaRequirement] JVM maximum version: ${JVMMaxVersion}"# MainArgs: replace occurences of $APP_ROOT with its content
    MainArgsArr=()
    for i in "${MainArgs[@]}"
    doMainArgsArr+=("$(eval echo "$i")")
    done# JVMOptions: replace occurences of $APP_ROOT with its content
    JVMOptionsArr=()
    for i in "${JVMOptions[@]}"
    doJVMOptionsArr+=("$(eval echo "$i")")
    done# internationalized messages
    ############################################LANG=$(defaults read -g AppleLocale)
    stub_logger "[Language] $LANG"# French localization
    if [[ $LANG == fr* ]] ; thenMSG_ERROR_LAUNCHING="ERREUR au lancement de '${CFBundleName}'."MSG_MISSING_MAINCLASS="'MainClass' n'est pas spécifié.\nL'application Java ne peut pas être lancée."MSG_JVMVERSION_REQ_INVALID="La syntaxe de la version de Java demandée est invalide: %s\nVeuillez contacter le développeur de l'application."MSG_NO_SUITABLE_JAVA="La version de Java installée sur votre système ne convient pas.\nCe programme nécessite Java %s"MSG_JAVA_VERSION_OR_LATER="ou ultérieur"MSG_JAVA_VERSION_LATEST="(dernière mise à jour)"MSG_JAVA_VERSION_MAX="à %s"MSG_NO_SUITABLE_JAVA_CHECK="Merci de bien vouloir installer la version de Java requise."MSG_INSTALL_JAVA="Java doit être installé sur votre système.\nRendez-vous sur java.com et suivez les instructions d'installation..."MSG_LATER="Plus tard"MSG_VISIT_JAVA_DOT_COM="Java by Oracle"MSG_VISIT_ADOPTOPENJDK="Java by AdoptOpenJDK"# German localization
    elif [[ $LANG == de* ]] ; thenMSG_ERROR_LAUNCHING="FEHLER beim Starten von '${CFBundleName}'."MSG_MISSING_MAINCLASS="Die 'MainClass' ist nicht spezifiziert!\nDie Java-Anwendung kann nicht gestartet werden!"MSG_JVMVERSION_REQ_INVALID="Die Syntax der angeforderten Java-Version ist ungültig: %s\nBitte kontaktieren Sie den Entwickler der App."MSG_NO_SUITABLE_JAVA="Es wurde keine passende Java-Version auf Ihrem System gefunden!\nDieses Programm benötigt Java %s"MSG_JAVA_VERSION_OR_LATER="oder neuer"MSG_JAVA_VERSION_LATEST="(neuste Unterversion)"MSG_JAVA_VERSION_MAX="bis %s"MSG_NO_SUITABLE_JAVA_CHECK="Stellen Sie sicher, dass die angeforderte Java-Version installiert ist."MSG_INSTALL_JAVA="Auf Ihrem System muss die 'Java'-Software installiert sein.\nBesuchen Sie java.com für weitere Installationshinweise."MSG_LATER="Später"MSG_VISIT_JAVA_DOT_COM="Java von Oracle"MSG_VISIT_ADOPTOPENJDK="Java von AdoptOpenJDK"# Simplifyed Chinese localization
    elif [[ $LANG == zh* ]] ; thenMSG_ERROR_LAUNCHING="无法启动 '${CFBundleName}'."MSG_MISSING_MAINCLASS="没有指定 'MainClass'!\nJava程序无法启动!"MSG_JVMVERSION_REQ_INVALID="Java版本参数语法错误: %s\n请联系该应用的开发者。"MSG_NO_SUITABLE_JAVA="没有在系统中找到合适的Java版本!\n必须安装Java %s才能够使用该程序!"MSG_JAVA_VERSION_OR_LATER="及以上版本"MSG_JAVA_VERSION_LATEST="(最新版本)"MSG_JAVA_VERSION_MAX="最高为 %s"MSG_NO_SUITABLE_JAVA_CHECK="请确保系统中安装了所需的Java版本"MSG_INSTALL_JAVA="你需要在Mac中安装Java运行环境!\n访问 java.com 了解如何安装。"MSG_LATER="稍后"MSG_VISIT_JAVA_DOT_COM="Java by Oracle"MSG_VISIT_ADOPTOPENJDK="Java by AdoptOpenJDK"# English default localization
    elseMSG_ERROR_LAUNCHING="ERROR launching '${CFBundleName}'."MSG_MISSING_MAINCLASS="'MainClass' isn't specified!\nJava application cannot be started!"MSG_JVMVERSION_REQ_INVALID="The syntax of the required Java version is invalid: %s\nPlease contact the App developer."MSG_NO_SUITABLE_JAVA="No suitable Java version found on your system!\nThis program requires Java %s"MSG_JAVA_VERSION_OR_LATER="or later"MSG_JAVA_VERSION_LATEST="(latest update)"MSG_JAVA_VERSION_MAX="up to %s"MSG_NO_SUITABLE_JAVA_CHECK="Make sure you install the required Java version."MSG_INSTALL_JAVA="You need to have JAVA installed on your Mac!\nVisit java.com for installation instructions..."MSG_LATER="Later"MSG_VISIT_JAVA_DOT_COM="Java by Oracle"MSG_VISIT_ADOPTOPENJDK="Java by AdoptOpenJDK"
    fi# function 'get_java_version_from_cmd()'
    #
    # returns Java version string from 'java -version' command
    # works for both old (1.8) and new (9) version schema
    #
    # @param1  path to a java JVM executable
    # @return  the Java version number as displayed in 'java -version' command
    ################################################################################
    function get_java_version_from_cmd() {# second sed command strips " and -ea from the version stringecho $("$1" -version 2>&1 | awk '/version/{print $3}' | sed -E 's/"//g;s/-ea//g')
    }# function 'extract_java_major_version()'
    #
    # extract Java major version from a version string
    #
    # @param1  a Java version number ('1.8.0_45') or requirement string ('1.8+')
    # @return  the major version (e.g. '7', '8' or '9', etc.)
    ################################################################################
    function extract_java_major_version() {echo $(echo "$1" | sed -E 's/^1\.//;s/^([0-9]+)(-ea|(\.[0-9_.]{1,7})?)(-b[0-9]+-[0-9]+)?[+*]?$/\1/')
    }# function 'get_comparable_java_version()'
    #
    # return comparable version for a Java version number or requirement string
    #
    # @param1  a Java version number ('1.8.0_45') or requirement string ('1.8+')
    # @return  an 8 digit numeral ('1.8.0_45'->'08000045'; '9.1.13'->'09001013')
    ################################################################################
    function get_comparable_java_version() {# cleaning: 1) remove leading '1.'; 2) remove build string (e.g. '-b14-468'); 3) remove 'a-Z' and '-*+' (e.g. '-ea'); 4) replace '_' with '.'local cleaned=$(echo "$1" | sed -E 's/^1\.//g;s/-b[0-9]+-[0-9]+$//g;s/[a-zA-Z+*\-]//g;s/_/./g')# splitting at '.' into an arraylocal arr=( ${cleaned//./ } )# echo a string with left padded version numbersecho "$(printf '%02s' ${arr[0]})$(printf '%03s' ${arr[1]})$(printf '%03s' ${arr[2]})"
    }# function 'is_valid_requirement_pattern()'
    #
    # check whether the Java requirement is a valid requirement pattern
    #
    # supported requirements are for example:
    # - 1.6       requires Java 6 (any update)      [1.6, 1.6.0_45, 1.6.0_88]
    # - 1.6*      requires Java 6 (any update)      [1.6, 1.6.0_45, 1.6.0_88]
    # - 1.6+      requires Java 6 or higher         [1.6, 1.6.0_45, 1.8, 9, etc.]
    # - 1.6.0     requires Java 6 (any update)      [1.6, 1.6.0_45, 1.6.0_88]
    # - 1.6.0_45  requires Java 6u45                [1.6.0_45]
    # - 1.6.0_45+ requires Java 6u45 or higher      [1.6.0_45, 1.6.0_88, 1.8, etc.]
    # - 9         requires Java 9 (any update)      [9.0.*, 9.1, 9.3, etc.]
    # - 9*        requires Java 9 (any update)      [9.0.*, 9.1, 9.3, etc.]
    # - 9+        requires Java 9 or higher         [9.0, 9.1, 10, etc.]
    # - 9.1       requires Java 9.1 (any update)    [9.1.*, 9.1.2, 9.1.13, etc.]
    # - 9.1*      requires Java 9.1 (any update)    [9.1.*, 9.1.2, 9.1.13, etc.]
    # - 9.1+      requires Java 9.1 or higher       [9.1, 9.2, 10, etc.]
    # - 9.1.3     requires Java 9.1.3               [9.1.3]
    # - 9.1.3*    requires Java 9.1.3 (any update)  [9.1.3]
    # - 9.1.3+    requires Java 9.1.3 or higher     [9.1.3, 9.1.4, 9.2.*, 10, etc.]
    # - 10-ea     requires Java 10 (early access release)
    #
    # unsupported requirement patterns are for example:
    # - 1.2, 1.3, 1.9       Java 2, 3 are not supported
    # - 1.9                 Java 9 introduced a new versioning scheme
    # - 6u45                known versioning syntax, but unsupported
    # - 9-ea*, 9-ea+        early access releases paired with */+
    # - 9., 9.*, 9.+        version ending with a .
    # - 9.1., 9.1.*, 9.1.+  version ending with a .
    # - 9.3.5.6             4 part version number is unsupported
    #
    # @param1  a Java requirement string ('1.8+')
    # @return  boolean exit code: 0 (is valid), 1 (is not valid)
    ################################################################################
    function is_valid_requirement_pattern() {local java_req=$1java8pattern='1\.[4-8](\.[0-9]+)?(\.0_[0-9]+)?[*+]?'java9pattern='(9|1[0-9])(-ea|[*+]|(\.[0-9]+){1,2}[*+]?)?'# test matches either old Java versioning scheme (up to 1.8) or new scheme (starting with 9)if [[ ${java_req} =~ ^(${java8pattern}|${java9pattern})$ ]]; thenreturn 0elsereturn 1fi
    }# determine which JVM to use
    ############################################# default Apple JRE plugin path (< 1.6)
    apple_jre_plugin="/Library/Java/Home/bin/java"
    apple_jre_version=$(get_java_version_from_cmd "${apple_jre_plugin}")
    # default Oracle JRE plugin path (>= 1.7)
    oracle_jre_plugin="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java"
    oracle_jre_version=$(get_java_version_from_cmd "${oracle_jre_plugin}")# first check system variable "$JAVA_HOME" -> has precedence over any other System JVM
    stub_logger '[JavaSearch] Checking for $JAVA_HOME ...'
    if [ -n "$JAVA_HOME" ] ; thenstub_logger "[JavaSearch] ... found JAVA_HOME with value $JAVA_HOME"# PR 26: Allow specifying "$JAVA_HOME" relative to "$AppPackageFolder"# which allows for bundling a custom version of Java inside your app!if [[ $JAVA_HOME == /* ]] ; then# if "$JAVA_HOME" starts with a Slash it's an absolute pathJAVACMD="$JAVA_HOME/bin/java"else# otherwise it's a relative path to "$AppPackageFolder"JAVACMD="$AppPackageFolder/$JAVA_HOME/bin/java"fiJAVACMD_version=$(get_comparable_java_version $(get_java_version_from_cmd "${JAVACMD}"))
    elsestub_logger "[JavaSearch] ... didn't found JAVA_HOME"
    fi# check for any other or a specific Java version
    # also if $JAVA_HOME exists but isn't executable
    if [ -z "${JAVACMD}" ] || [ ! -x "${JAVACMD}" ] ; thenstub_logger "[JavaSearch] Checking for JavaVirtualMachines on the system ..."# reset variablesJAVACMD=""JAVACMD_version=""# first check whether JVMVersion string is a valid requirement stringif [ ! -z "${JVMVersion}" ] && ! is_valid_requirement_pattern ${JVMVersion} ; thenMSG_JVMVERSION_REQ_INVALID_EXPANDED=$(printf "${MSG_JVMVERSION_REQ_INVALID}" "${JVMVersion}")# log exit causestub_logger "[EXIT 4] ${MSG_JVMVERSION_REQ_INVALID_EXPANDED}"# display error message with AppleScriptosascript -e "tell application \"System Events\" to display dialog \"${MSG_ERROR_LAUNCHING}\n\n${MSG_JVMVERSION_REQ_INVALID_EXPANDED}\" with title \"${CFBundleName}\" buttons {\" OK \"} default button 1${DialogWithIcon}"# exit with errorexit 4fi# then check whether JVMMaxVersion string is a valid requirement stringif [ ! -z "${JVMMaxVersion}" ] && ! is_valid_requirement_pattern ${JVMMaxVersion} ; thenMSG_JVMVERSION_REQ_INVALID_EXPANDED=$(printf "${MSG_JVMVERSION_REQ_INVALID}" "${JVMMaxVersion}")# log exit causestub_logger "[EXIT 5] ${MSG_JVMVERSION_REQ_INVALID_EXPANDED}"# display error message with AppleScriptosascript -e "tell application \"System Events\" to display dialog \"${MSG_ERROR_LAUNCHING}\n\n${MSG_JVMVERSION_REQ_INVALID_EXPANDED}\" with title \"${CFBundleName}\" buttons {\" OK \"} default button 1${DialogWithIcon}"# exit with errorexit 5fi# find installed JavaVirtualMachines (JDK + JRE)allJVMs=()# read JDK's from '/usr/libexec/java_home -V' commandwhile read -r line; doversion=$(echo $line | awk -F $',' '{print $1;}')path=$(echo $line | awk -F $'" ' '{print $2;}')path+="/bin/java"allJVMs+=("$version:$path")done < <(/usr/libexec/java_home -V 2>&1 | grep '^[[:space:]]')# unset while loop variablesunset version path# add Apple JRE if availableif [ -x "${apple_jre_plugin}" ] ; thenallJVMs+=("$apple_jre_version:$apple_jre_plugin")fi# add Oracle JRE if availableif [ -x "${oracle_jre_plugin}" ] ; thenallJVMs+=("$oracle_jre_version:$oracle_jre_plugin")fi# debug outputfor i in "${allJVMs[@]}"dostub_logger "[JavaSearch] ... found JVM: $i"done# determine JVMs matching the min/max version requirementminC=$(get_comparable_java_version ${JVMVersion})maxC=$(get_comparable_java_version ${JVMMaxVersion})matchingJVMs=()for i in "${allJVMs[@]}"do# split JVM string at ':' delimiter to retain spaces in $path substringIFS=: arr=($i) ; unset IFS# [0] JVM version numberver=${arr[0]}# comparable JVM version numbercomp=$(get_comparable_java_version $ver)# [1] JVM pathpath="${arr[1]}"# construct string item for adding to the "matchingJVMs" arrayitem="$comp:$ver:$path"# pre-requisite: current version number needs to be greater than min version numberif [ "$comp" -ge "$minC" ] ; then# perform max version checks if max version requirement is presentif [ ! -z ${JVMMaxVersion} ] ; then# max version requirement ends with '*' modifierif [[ ${JVMMaxVersion} == *\* ]] ; then# use the '*' modifier from the max version string as wildcard for a 'starts with' comparison# and check whether the current version number starts with the max version wildcard stringif [[ ${ver} == ${JVMMaxVersion} ]]; thenmatchingJVMs+=("$item")# or whether the current comparable version is lower than the comparable max versionelif [ "$comp" -le "$maxC" ] ; thenmatchingJVMs+=("$item")fi# max version requirement ends with '+' modifier -> always add this version if it's greater than $min# because a max requirement with + modifier doesn't make senseelif [[ ${JVMMaxVersion} == *+ ]] ; thenmatchingJVMs+=("$item")# matches 6 zeros at the end of the max version string (e.g. for 1.8, 9)# -> then the max version string should be treated like with a '*' modifier at the end#elif [[ ${maxC} =~ ^[0-9]{2}0{6}$ ]] && [ "$comp" -le $(( ${maxC#0} + 999 )) ] ; then#	matchingJVMs+=("$item")# matches 3 zeros at the end of the max version string (e.g. for 9.1, 10.3)# -> then the max version string should be treated like with a '*' modifier at the end#elif [[ ${maxC} =~ ^[0-9]{5}0{3}$ ]] && [ "$comp" -le "${maxC}" ] ; then#	matchingJVMs+=("$item")# matches standard requirements without modifierelif [ "$comp" -le "$maxC" ]; thenmatchingJVMs+=("$item")fi# no max version requirement:# min version requirement ends with '+' modifier# -> always add the current version because it's greater than $minelif [[ ${JVMVersion} == *+ ]] ; thenmatchingJVMs+=("$item")# min version requirement ends with '*' modifier# -> use the '*' modifier from the min version string as wildcard for a 'starts with' comparison#    and check whether the current version number starts with the min version wildcard stringelif [[ ${JVMVersion} == *\* ]] ; thenif [[ ${ver} == ${JVMVersion} ]] ; thenmatchingJVMs+=("$item")fi# compare the min version against the current version with an additional * wildcard for a 'starts with' comparison# -> e.g. add 1.8.0_44 when the requirement is 1.8elif [[ ${ver} == ${JVMVersion}* ]] ; thenmatchingJVMs+=("$item")fifidone# unset for loop variablesunset arr ver comp path item# debug outputfor i in "${matchingJVMs[@]}"dostub_logger "[JavaSearch] ... ... matches all requirements: $i"done# sort the matching JavaVirtualMachines by version number# https://stackoverflow.com/a/11789688/1128689IFS=$'\n' matchingJVMs=($(sort -nr <<<"${matchingJVMs[*]}"))unset IFS# get the highest matching JVMfor ((i = 0; i < ${#matchingJVMs[@]}; i++));do# split JVM string at ':' delimiter to retain spaces in $path substringIFS=: arr=(${matchingJVMs[$i]}) ; unset IFS# [0] comparable JVM version numbercomp=${arr[0]}# [1] JVM version numberver=${arr[1]}# [2] JVM pathpath="${arr[2]}"# use current value as JAVACMD if it's executableif [ -x "$path" ] ; thenJAVACMD="$path"JAVACMD_version=$compbreakfidone# unset for loop variablesunset arr comp ver path
    fi# log the Java Command and the extracted version number
    stub_logger "[JavaCommand] '$JAVACMD'"
    stub_logger "[JavaVersion] $(get_java_version_from_cmd "${JAVACMD}")${JAVACMD_version:+ / $JAVACMD_version}"if [ -z "${JAVACMD}" ] || [ ! -x "${JAVACMD}" ] ; then# different error messages when a specific JVM was requiredif [ ! -z "${JVMVersion}" ] ; then# display human readable java version (#28)java_version_hr=$(echo ${JVMVersion} | sed -E 's/^1\.([0-9+*]+)$/ \1/g' | sed "s/+/ ${MSG_JAVA_VERSION_OR_LATER}/;s/*/ ${MSG_JAVA_VERSION_LATEST}/")MSG_NO_SUITABLE_JAVA_EXPANDED=$(printf "${MSG_NO_SUITABLE_JAVA}" "${java_version_hr}").if [ ! -z "${JVMMaxVersion}" ] ; thenjava_version_hr=$(extract_java_major_version ${JVMVersion})java_version_max_hr=$(echo ${JVMMaxVersion} | sed -E 's/^1\.([0-9+*]+)$/ \1/g' | sed "s/+//;s/*/ ${MSG_JAVA_VERSION_LATEST}/")MSG_NO_SUITABLE_JAVA_EXPANDED="$(printf "${MSG_NO_SUITABLE_JAVA}" "${java_version_hr}") $(printf "${MSG_JAVA_VERSION_MAX}" "${java_version_max_hr}")"fi# log exit causestub_logger "[EXIT 3] ${MSG_NO_SUITABLE_JAVA_EXPANDED}"# display error message with AppleScriptosascript -e "tell application \"System Events\" to display dialog \"${MSG_ERROR_LAUNCHING}\n\n${MSG_NO_SUITABLE_JAVA_EXPANDED}\n${MSG_NO_SUITABLE_JAVA_CHECK}\" with title \"${CFBundleName}\"  buttons {\" OK \", \"${MSG_VISIT_JAVA_DOT_COM}\", \"${MSG_VISIT_ADOPTOPENJDK}\"} default button 1${DialogWithIcon}" \-e "set response to button returned of the result" \-e "if response is \"${MSG_VISIT_JAVA_DOT_COM}\" then open location \"https://www.java.com/download/\"" \-e "if response is \"${MSG_VISIT_ADOPTOPENJDK}\" then open location \"https://adoptopenjdk.net/releases.html\""# exit with errorexit 3else# log exit causestub_logger "[EXIT 1] ${MSG_ERROR_LAUNCHING}"# display error message with AppleScriptosascript -e "tell application \"System Events\" to display dialog \"${MSG_ERROR_LAUNCHING}\n\n${MSG_INSTALL_JAVA}\" with title \"${CFBundleName}\" buttons {\"${MSG_LATER}\", \"${MSG_VISIT_JAVA_DOT_COM}\", \"${MSG_VISIT_ADOPTOPENJDK}\"} default button 1${DialogWithIcon}" \-e "set response to button returned of the result" \-e "if response is \"${MSG_VISIT_JAVA_DOT_COM}\" then open location \"https://www.java.com/download/\"" \-e "if response is \"${MSG_VISIT_ADOPTOPENJDK}\" then open location \"https://adoptopenjdk.net/releases.html\""# exit with errorexit 1fi
    fi# MainClass check
    ############################################if [ -z "${JVMMainClass}" ]; then# log exit causestub_logger "[EXIT 2] ${MSG_MISSING_MAINCLASS}"# display error message with AppleScriptosascript -e "tell application \"System Events\" to display dialog \"${MSG_ERROR_LAUNCHING}\n\n${MSG_MISSING_MAINCLASS}\" with title \"${CFBundleName}\" buttons {\" OK \"} default button 1${DialogWithIcon}"# exit with errorexit 2
    fi# execute $JAVACMD and do some preparation
    ############################################# enable drag&drop to the dock icon
    export CFProcessPath="$0"# remove Apples ProcessSerialNumber from passthru arguments (#39)
    if [[ "$*" == -psn* ]] ; thenArgsPassthru=()
    elseArgsPassthru=("$@")
    fi# change to Working Directory based upon Apple/Oracle Plist info
    cd "${WorkingDirectory}" || exit 13
    stub_logger "[WorkingDirectory] ${WorkingDirectory}"# execute Java and set
    # - classpath
    # - splash image
    # - dock icon
    # - app name
    # - JVM options / properties (-D)
    # - JVM default options (-X)
    # - main class
    # - main class arguments
    # - passthrough arguments from Terminal or Drag'n'Drop to Finder icon
    stub_logger "[Exec] \"$JAVACMD\" -cp \"${JVMClassPath}\" -splash:\"${ResourcesFolder}/${JVMSplashFile}\" -Xdock:icon=\"${ResourcesFolder}/${CFBundleIconFile}\" -Xdock:name=\"${CFBundleName}\" ${JVMOptionsArr:+$(printf "'%s' " "${JVMOptionsArr[@]}") }${JVMDefaultOptions:+$JVMDefaultOptions }${JVMMainClass}${MainArgsArr:+ $(printf "'%s' " "${MainArgsArr[@]}")}${ArgsPassthru:+ $(printf "'%s' " "${ArgsPassthru[@]}")}"
    exec "${JAVACMD}" \-cp "${JVMClassPath}" \-splash:"${ResourcesFolder}/${JVMSplashFile}" \-Xdock:icon="${ResourcesFolder}/${CFBundleIconFile}" \-Xdock:name="${CFBundleName}" \${JVMOptionsArr:+"${JVMOptionsArr[@]}" }\${JVMDefaultOptions:+$JVMDefaultOptions }\"${JVMMainClass}"\${MainArgsArr:+ "${MainArgsArr[@]}"}\${ArgsPassthru:+ "${ArgsPassthru[@]}"}
    
  10. 保存,关闭,再次点击JD-GUI便可以顺利打开。
  11. 最后我们可以把这个应用程序拖到启动台,这样以后需要的时候就可以打开了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18201.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[免费]Springboot+Vue医疗(医院)挂号管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringbootVue医疗(医院)挂号管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue医疗(医院)挂号管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 在如今社会上&#xff0c;关于信息上…

链表(典型算法思想)—— OJ例题算法解析思路

目录 一、2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 1. 初始化 2. 遍历链表并相加 3. 返回结果 举例说明 二、24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 代码思路 举例说明 初始状…

twisted实现MMORPG 游戏数据库操作封装设计与实现

在设计 MMORPG&#xff08;大规模多人在线角色扮演游戏&#xff09;时&#xff0c;数据库系统是游戏架构中至关重要的一部分。数据库不仅承担了游戏中各种数据&#xff08;如玩家数据、物品数据、游戏世界状态等&#xff09;的存储和管理任务&#xff0c;还必须高效地支持并发访…

lvsDR模式实现

LVS DR模式与NAT模式的优缺点&#xff1a; NAT&#xff1a;优点&#xff1a;配置简单&#xff0c;所需网络环境简单&#xff0c;访问流量的出入都经过LVS服务器&#xff0c;控制流量简单&#xff0c; 缺点&#xff1a;由于访问流量的出入都会经过LVS服务器&#xff0c;所以LVS…

闭源大语言模型的怎么增强:提示工程 检索增强生成 智能体

闭源大语言模型的怎么增强 提示工程 检索增强生成 智能体 核心原理 提示工程:通过设计和优化提示词,引导大语言模型进行上下文学习和分解式思考,激发模型自身的思维和推理能力,使模型更好地理解和生成文本,增强其泛用性和解决问题的能力。检索增强生成:结合检索的准确…

【快速幂算法】快速幂算法讲解及C语言实现(递归实现和非递归实现,附代码)

快速幂算法 快速幂算法可用分治法实现 不难看出&#xff0c;对任意实数a和非负整数n&#xff0c;有&#xff1a; a n { 1 , n 0 , a ≠ 0 0 , a 0 ( a n 2 ) 2 , n > 0 , n 为偶数 ( a n 2 ) 2 ∗ a , n > 0 , n 为奇数 a^n \begin{cases} 1, & n 0, a\neq 0…

大数据SQL调优专题——Hive执行原理

引入 Apache Hive 是基于Hadoop的数据仓库工具&#xff0c;它可以使用SQL来读取、写入和管理存在分布式文件系统中的海量数据。在Hive中&#xff0c;HQL默认转换成MapReduce程序运行到Yarn集群中&#xff0c;大大降低了非Java开发者数据分析的门槛&#xff0c;并且Hive提供命令…

30天开发操作系统 第 20 天 -- API

前言 大家早上好&#xff0c;今天我们继续努力哦。 昨天我们已经实现了应用程序的运行, 今天我们来实现由应用程序对操作系统功能的调用(即API, 也叫系统调用)。 为什么这样的功能称为“系统调用”(system call)呢&#xff1f;因为它是由应用程序来调用(操作)系统中的功能来完…

UE5.2后 Bake Out Materials失效

这个问题出现在5.3&#xff0c;5.4&#xff0c;5.5没有测试 烘焙贴图后会找不到贴图位置&#xff0c; 这个是5.2的正常状态 默认是生成在模型当前目录里&#xff0c;包括新的材质 但是这个bug会让材质和贴图都消失&#xff0c;无法定位 暂时没有办法解决&#xff0c;等官方 …

macOS部署DeepSeek-r1

好奇&#xff0c;跟着网友们的操作试了一下 网上方案很多&#xff0c;主要参考的是这篇 DeepSeek 接入 PyCharm&#xff0c;轻松助力编程_pycharm deepseek-CSDN博客 方案是&#xff1a;PyCharm CodeGPT插件 DeepSeek-r1:1.5b 假设已经安装好了PyCharm PyCharm: the Pyth…

架构设计系列(二):CI/CD

一、概述 CI/CD 是 持续集成&#xff08;Continuous Integration&#xff09; 和 持续交付/持续部署&#xff08;Continuous Delivery/Continuous Deployment&#xff09; 的缩写&#xff0c;是现代软件开发中的一套核心实践和工具链&#xff0c;旨在提高软件交付的效率、质量…

Windows 11 搭建私有知识库(docker、dify、deepseek、ollama)

一、操作系统信息 版本 Windows 11 家庭中文版 版本号 23H2 安装日期 ‎2023/‎8/‎21 操作系统版本 22631.4460二、搭建思路 ollama拉取deepseek、bge-m3模型docker拉取dify的镜像dify链接ollama使用模型&#xff0c;并上传文件搭建知识库&#xff0c;创建应用 三、搭建步骤…

本地部署DeepSeek摆脱服务器繁忙

由于图片和格式解析问题&#xff0c;可前往 阅读原文 最近DeepSeek简直太火了&#xff0c;频频霸榜热搜打破春节的平静&#xff0c;大模型直接开源让全球科技圈都为之震撼&#xff01;再次证明了中国AI的换道超车与崛起 DeepSeek已经成了全民ai&#xff0c;使用量也迅速上去了…

‌CBA认证‌(业务架构师认证)简介---适用人群、考试内容与形式、含金量与职业前景,以及‌CBA、TOGAF认证对比表格

‌CBA认证‌&#xff0c;即业务架构师认证&#xff08;Certified Business Architect&#xff0c;CBA&#xff09;&#xff0c;是由业务架构师协会&#xff08;Business Architecture Institute&#xff09;推出的一项国际认证计划。该认证旨在评估和认证业务架构师的专业能力和…

保姆级GitHub大文件(100mb-2gb)上传教程

GLF&#xff08;Git Large File Storage&#xff09;安装使用 使用GitHub desktop上传大于100mb的文件时报错 The following files are over 100MB. lf you commit these files, you will no longer beable to push this repository to GitHub.com.term.rarWe recommend you a…

使用 Visual Studio Code (VS Code) 开发 Python 图形界面程序

安装Python、VS Code Documentation for Visual Studio Code Python Releases for Windows | Python.org 更新pip >python.exe -m pip install --upgrade pip Requirement already satisfied: pip in c:\users\xxx\appdata\local\programs\python\python312\lib\site-pa…

Python的那些事第二十一篇:Python Web开发的“秘密武器”Flask

基于 Flask 框架的 Python Web 开发研究 摘要 在 Web 开发的江湖里,Python 是一位武林高手,而 Flask 则是它手中那把小巧却锋利的匕首。本文以 Flask 框架为核心,深入探讨了它在 Python Web 开发中的应用。通过幽默风趣的笔触,结合实例和表格,分析了 Flask 的特性、优势以…

Qt开发①Qt的概念+发展+优点+应用+使用

目录 1. Qt的概念和发展 1.1 Qt的概念 1.2 Qt 的发展史&#xff1a; 1.3 Qt 的版本 2. Qt 的优点和应用 2.1 Qt 的优点&#xff1a; 2.2 Qt 的应用场景 2.3 Qt 的应用案例 3. 搭建 Qt 开发环境 3.1 Qt 的开发工具 3.2 Qt SDK 的下载和安装 3.3 Qt 环境变量配置和使…

【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.3 RNN与LSTM在自然语言处理中的应用案例】

咱今天来聊聊在人工智能领域里,特别重要的两个神经网络:循环神经网络(RNN)和长短时记忆网络(LSTM),主要讲讲它们在自然语言处理里的应用。你想想,平常咱们用手机和别人聊天、看新闻、听语音助手说话,背后说不定就有 RNN 和 LSTM 在帮忙呢! 二、RNN 是什么? (一)…

DeepSeek应用——与PyCharm的配套使用

目录 一、配置方法 二、使用方法 三、注意事项 1、插件市场无continue插件 2、无结果返回&#xff0c;且在本地模型报错 记录自己学习应用DeepSeek的过程&#xff0c;使用的是自己电脑本地部署的私有化蒸馏模型...... &#xff08;举一反三&#xff0c;这个不单单是可以用…