Java AppBundler application pointing to JRE defined by JAVA_HOME

前端 未结 2 1478
春和景丽
春和景丽 2021-01-01 03:49

I have been using Java Application Bundler to pack a Java application as .app. I have managed to run the application if I pack the JRE7 inside of the .app bundle. Is it poss

相关标签:
2条回答
  • 2021-01-01 04:28
    usr/libexec/java_home -V
    

    Matching Java Virtual Machines (2): 1.8.271.09 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home 1.8.0_271 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home

    I was facing similar issue, that when I set my java_home as

    echo export "JAVA_HOME=\$(/usr/libexec/java_home)" >> ~/.bash_profile
    

    it got set to /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home

    so I did it like echo export "JAVA_HOME="Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home" >> ~/.bash_profile

    It result's into

    Admins-MacBook-Pro:carot arun$ echo $JAVA_HOME
    

    /Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home

    You can also edit it in future if required go to your user, in my case arun folder press command + shift + . to see hidden files open .bash_profile in any of your favourite editor

    0 讨论(0)
  • 2021-01-01 04:45

    appbundler applications can use either an embedded Java 7 JRE inside the app bundle, or the Java 7 JRE installed in /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home (the same one used by the web browser plugin). They can't use a JDK installed under /Library/Java/JavaVirtualMachines (or anywhere else, for that matter) and they definitely can't use Java 6.

    What you can do, however, is not use appbundler and instead build the bundle by hand, with the main executable being a shell script that runs the java command line tool from JAVA_HOME (maybe falling back to the /Library/Internet Plug-Ins JRE if JAVA_HOME is not set). Such a script will be able to support both Java 6 and 7.

    You would use something like this as YourApp.app/Contents/MacOS/YourApp:

    #!/bin/sh
    
    PRG=$0
    
    while [ -h "$PRG" ]; do
        ls=`ls -ld "$PRG"`
        link=`expr "$ls" : '^.*-> \(.*\)$' 2>/dev/null`
        if expr "$link" : '^/' 2> /dev/null >/dev/null; then
            PRG="$link"
        else
            PRG="`dirname "$PRG"`/$link"
        fi
    done
    
    progdir=`dirname "$PRG"`
    
    if [ -n "$JAVA_HOME" ]; then
      JAVACMD="$JAVA_HOME/bin/java"
    elif [ -x /usr/libexec/java_home ]; then
      JAVACMD="`/usr/libexec/java_home`/bin/java"
    else
      JAVACMD="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java"
    fi
    
    exec "$JAVACMD" -classpath "$progdir/../Resources/Jars/*" \
           -Dapple.laf.useScreenMenuBar=true \
           my.pkg.MainClass
    

    Then put your application's JAR files in YourApp.app/Contents/Resources/Jars, the icon in YourApp.app/Contents/Resources/icon.icns, and the following in YourApp.app/Contents/Info.plist:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
            <key>CFBundleDevelopmentRegion</key>
            <string>English</string>
            <key>CFBundleExecutable</key>
            <string>YourApp</string><!-- relative to Contents/MacOS -->
            <key>CFBundleGetInfoString</key>
            <string>My clever application</string>
            <key>CFBundleIconFile</key>
            <string>icon.icns</string><!-- relative to Contents/Resources -->
            <key>CFBundleInfoDictionaryVersion</key>
            <string>8.0</string>
            <key>CFBundleName</key>
            <string>YourApp</string>
            <key>CFBundlePackageType</key>
            <string>APPL</string>
            <key>CFBundleSignature</key>
            <string>????</string>
            <key>CFBundleVersion</key>
            <string>8.0</string>
    </dict>
    </plist>
    

    See the GATE Developer launcher for full details, though note that this is a slightly more convoluted case as the .app script delegates to another script, which in turn loads the JAR files from a location that is outside the .app bundle. The principle remains the same however.

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