Jorl17 / jar2app

Convert any Java jar to a Mac OS X .App bundle. No external tools needed, no funky parameters, it just works.
GNU General Public License v2.0
413 stars 56 forks source link

Can get the app to run with a bundled JRE. #39

Open abcbarryn opened 4 years ago

abcbarryn commented 4 years ago

I am running: jar2app -r jre1.8.0_221.jre -n TechnicLauncher -d TechnicLauncher -i Icons.icns -b com.amobiledevice.TechnicLauncher TechnicLauncher.jar Where jre1.8.0_221.jre was extracted from jre-8u221-macosx-x64.tar.gz downloaded from Oracle. I have also tried: jar2app -r "/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk" -n TechnicLauncher -d TechnicLauncher -i Icons.icns -b com.amobiledevice.TechnicLauncher TechnicLauncher.jar Both produce the same error:

Screen Shot 2019-08-17 at 5 11 00 AM

Running the command without the -r option works fine, but as soon as I try to bundle a java runtime it breaks.

Lucina commented 4 years ago

The issue appears to stem from two independent JavaAppLauncher issues: -Not being able to use JREs/JDKs that aren't packaged as /Library/Java/JavaVirtualMachines macOS packages (relevant comment) -Not being able to use JREs/JDKs above 1.8 relevant comment from another repo You'll either need to find some stub that somehow supports bundled JREs/JDKs as provided from Oracle or supports JREs/JDKs above 1.8, or install the JavaVirtualMachines variant of the 1.8 JRE or JDK universalJavaApplicationStub seems interesting.

abcbarryn commented 4 years ago

One of the JVMs I tried was jre1.8.0_221.jre which appeared to have the correct directory structure.

jre1.8.0_221.jre jre1.8.0_221.jre/Contents jre1.8.0_221.jre/Contents/Home jre1.8.0_221.jre/Contents/Home/man jre1.8.0_221.jre/Contents/Home/man/ja jre1.8.0_221.jre/Contents/Home/man/man1 jre1.8.0_221.jre/Contents/Home/man/man1/jjs.1 jre1.8.0_221.jre/Contents/Home/man/man1/java.1 jre1.8.0_221.jre/Contents/Home/man/man1/keytool.1 jre1.8.0_221.jre/Contents/Home/man/man1/javaws.1 jre1.8.0_221.jre/Contents/Home/man/man1/pack200.1 jre1.8.0_221.jre/Contents/Home/man/man1/orbd.1 jre1.8.0_221.jre/Contents/Home/man/man1/tnameserv.1 jre1.8.0_221.jre/Contents/Home/man/man1/policytool.1 jre1.8.0_221.jre/Contents/Home/man/man1/servertool.1 jre1.8.0_221.jre/Contents/Home/man/man1/unpack200.1 jre1.8.0_221.jre/Contents/Home/man/man1/rmid.1 jre1.8.0_221.jre/Contents/Home/man/man1/rmiregistry.1 jre1.8.0_221.jre/Contents/Home/man/ja_JP.UTF-8 jre1.8.0_221.jre/Contents/Home/man/ja_JP.UTF-8/man1 jre1.8.0_221.jre/Contents/Home/man/ja_JP.UTF-8/man1/jjs.1 jre1.8.0_221.jre/Contents/Home/man/ja_JP.UTF-8/man1/java.1 jre1.8.0_221.jre/Contents/Home/man/ja_JP.UTF-8/man1/keytool.1 jre1.8.0_221.jre/Contents/Home/man/ja_JP.UTF-8/man1/javaws.1 jre1.8.0_221.jre/Contents/Home/man/ja_JP.UTF-8/man1/pack200.1 jre1.8.0_221.jre/Contents/Home/man/ja_JP.UTF-8/man1/orbd.1 jre1.8.0_221.jre/Contents/Home/man/ja_JP.UTF-8/man1/tnameserv.1 jre1.8.0_221.jre/Contents/Home/man/ja_JP.UTF-8/man1/policytool.1 jre1.8.0_221.jre/Contents/Home/man/ja_JP.UTF-8/man1/servertool.1 jre1.8.0_221.jre/Contents/Home/man/ja_JP.UTF-8/man1/unpack200.1 jre1.8.0_221.jre/Contents/Home/man/ja_JP.UTF-8/man1/rmid.1 jre1.8.0_221.jre/Contents/Home/man/ja_JP.UTF-8/man1/rmiregistry.1 jre1.8.0_221.jre/Contents/Home/LICENSE jre1.8.0_221.jre/Contents/Home/bin jre1.8.0_221.jre/Contents/Home/bin/unpack200 jre1.8.0_221.jre/Contents/Home/bin/rmid jre1.8.0_221.jre/Contents/Home/bin/rmiregistry jre1.8.0_221.jre/Contents/Home/bin/java jre1.8.0_221.jre/Contents/Home/bin/servertool jre1.8.0_221.jre/Contents/Home/bin/orbd jre1.8.0_221.jre/Contents/Home/bin/keytool jre1.8.0_221.jre/Contents/Home/bin/policytool jre1.8.0_221.jre/Contents/Home/bin/pack200 jre1.8.0_221.jre/Contents/Home/bin/jjs jre1.8.0_221.jre/Contents/Home/bin/tnameserv jre1.8.0_221.jre/Contents/Home/THIRDPARTYLICENSEREADME.txt jre1.8.0_221.jre/Contents/Home/THIRDPARTYLICENSEREADME-JAVAFX.txt jre1.8.0_221.jre/Contents/Home/release jre1.8.0_221.jre/Contents/Home/README jre1.8.0_221.jre/Contents/Home/Welcome.html jre1.8.0_221.jre/Contents/Home/lib jre1.8.0_221.jre/Contents/Home/lib/libnet.dylib jre1.8.0_221.jre/Contents/Home/lib/libnio.dylib jre1.8.0_221.jre/Contents/Home/lib/libinstrument.dylib jre1.8.0_221.jre/Contents/Home/lib/libjavafx_iio.dylib jre1.8.0_221.jre/Contents/Home/lib/libzip.dylib jre1.8.0_221.jre/Contents/Home/lib/cmm jre1.8.0_221.jre/Contents/Home/lib/cmm/sRGB.pf jre1.8.0_221.jre/Contents/Home/lib/cmm/CIEXYZ.pf jre1.8.0_221.jre/Contents/Home/lib/cmm/PYCC.pf jre1.8.0_221.jre/Contents/Home/lib/cmm/GRAY.pf jre1.8.0_221.jre/Contents/Home/lib/cmm/LINEAR_RGB.pf jre1.8.0_221.jre/Contents/Home/lib/psfontj2d.properties jre1.8.0_221.jre/Contents/Home/lib/fontconfig.properties.src jre1.8.0_221.jre/Contents/Home/lib/libresource.dylib jre1.8.0_221.jre/Contents/Home/lib/logging.properties jre1.8.0_221.jre/Contents/Home/lib/sound.properties jre1.8.0_221.jre/Contents/Home/lib/libjava_crw_demo.dylib jre1.8.0_221.jre/Contents/Home/lib/currency.data jre1.8.0_221.jre/Contents/Home/lib/libjavafx_font_t2k.dylib jre1.8.0_221.jre/Contents/Home/lib/libsplashscreen.dylib jre1.8.0_221.jre/Contents/Home/lib/libdt_socket.dylib jre1.8.0_221.jre/Contents/Home/lib/libj2pkcs11.dylib jre1.8.0_221.jre/Contents/Home/lib/calendars.properties jre1.8.0_221.jre/Contents/Home/lib/jvm.cfg jre1.8.0_221.jre/Contents/Home/lib/hijrah-config-umalqura.properties jre1.8.0_221.jre/Contents/Home/lib/jli jre1.8.0_221.jre/Contents/Home/lib/jli/libjli.dylib jre1.8.0_221.jre/Contents/Home/lib/security jre1.8.0_221.jre/Contents/Home/lib/security/trusted.libraries jre1.8.0_221.jre/Contents/Home/lib/security/blacklisted.certs jre1.8.0_221.jre/Contents/Home/lib/security/java.security jre1.8.0_221.jre/Contents/Home/lib/security/blacklist jre1.8.0_221.jre/Contents/Home/lib/security/java.policy jre1.8.0_221.jre/Contents/Home/lib/security/cacerts jre1.8.0_221.jre/Contents/Home/lib/security/policy jre1.8.0_221.jre/Contents/Home/lib/security/policy/unlimited jre1.8.0_221.jre/Contents/Home/lib/security/policy/unlimited/local_policy.jar jre1.8.0_221.jre/Contents/Home/lib/security/policy/unlimited/US_export_policy.jar jre1.8.0_221.jre/Contents/Home/lib/security/policy/limited jre1.8.0_221.jre/Contents/Home/lib/security/policy/limited/local_policy.jar jre1.8.0_221.jre/Contents/Home/lib/security/policy/limited/US_export_policy.jar jre1.8.0_221.jre/Contents/Home/lib/libjfxmedia_avf.dylib jre1.8.0_221.jre/Contents/Home/lib/jfr jre1.8.0_221.jre/Contents/Home/lib/jfr/default.jfc jre1.8.0_221.jre/Contents/Home/lib/jfr/profile.jfc jre1.8.0_221.jre/Contents/Home/lib/images jre1.8.0_221.jre/Contents/Home/lib/images/cursors jre1.8.0_221.jre/Contents/Home/lib/images/cursors/cursors.properties jre1.8.0_221.jre/Contents/Home/lib/images/cursors/motif_LinkDrop32x32.gif jre1.8.0_221.jre/Contents/Home/lib/images/cursors/motif_CopyDrop32x32.gif jre1.8.0_221.jre/Contents/Home/lib/images/cursors/motif_LinkNoDrop32x32.gif jre1.8.0_221.jre/Contents/Home/lib/images/cursors/invalid32x32.gif jre1.8.0_221.jre/Contents/Home/lib/images/cursors/motif_MoveNoDrop32x32.gif jre1.8.0_221.jre/Contents/Home/lib/images/cursors/motif_CopyNoDrop32x32.gif jre1.8.0_221.jre/Contents/Home/lib/images/cursors/motif_MoveDrop32x32.gif jre1.8.0_221.jre/Contents/Home/lib/libjfr.dylib jre1.8.0_221.jre/Contents/Home/lib/libhprof.dylib jre1.8.0_221.jre/Contents/Home/lib/libosxkrb5.dylib jre1.8.0_221.jre/Contents/Home/lib/net.properties jre1.8.0_221.jre/Contents/Home/lib/rt.jar jre1.8.0_221.jre/Contents/Home/lib/javafx.properties jre1.8.0_221.jre/Contents/Home/lib/libosxui.dylib jre1.8.0_221.jre/Contents/Home/lib/libglib-lite.dylib jre1.8.0_221.jre/Contents/Home/lib/tzdb.dat jre1.8.0_221.jre/Contents/Home/lib/ext jre1.8.0_221.jre/Contents/Home/lib/ext/sunec.jar jre1.8.0_221.jre/Contents/Home/lib/ext/nashorn.jar jre1.8.0_221.jre/Contents/Home/lib/ext/cldrdata.jar jre1.8.0_221.jre/Contents/Home/lib/ext/jfxrt.jar jre1.8.0_221.jre/Contents/Home/lib/ext/dnsns.jar jre1.8.0_221.jre/Contents/Home/lib/ext/localedata.jar jre1.8.0_221.jre/Contents/Home/lib/ext/sunjce_provider.jar jre1.8.0_221.jre/Contents/Home/lib/ext/meta-index jre1.8.0_221.jre/Contents/Home/lib/ext/sunpkcs11.jar jre1.8.0_221.jre/Contents/Home/lib/ext/jaccess.jar jre1.8.0_221.jre/Contents/Home/lib/ext/zipfs.jar jre1.8.0_221.jre/Contents/Home/lib/libjdwp.dylib jre1.8.0_221.jre/Contents/Home/lib/management jre1.8.0_221.jre/Contents/Home/lib/management/jmxremote.access jre1.8.0_221.jre/Contents/Home/lib/management/snmp.acl.template jre1.8.0_221.jre/Contents/Home/lib/management/management.properties jre1.8.0_221.jre/Contents/Home/lib/management/jmxremote.password.template jre1.8.0_221.jre/Contents/Home/lib/libsunec.dylib jre1.8.0_221.jre/Contents/Home/lib/libawt_lwawt.dylib jre1.8.0_221.jre/Contents/Home/lib/libfxplugins.dylib jre1.8.0_221.jre/Contents/Home/lib/jfr.jar jre1.8.0_221.jre/Contents/Home/lib/libt2k.dylib jre1.8.0_221.jre/Contents/Home/lib/server jre1.8.0_221.jre/Contents/Home/lib/server/libjvm.dylib jre1.8.0_221.jre/Contents/Home/lib/server/Xusage.txt jre1.8.0_221.jre/Contents/Home/lib/server/libjsig.dylib jre1.8.0_221.jre/Contents/Home/lib/jsse.jar jre1.8.0_221.jre/Contents/Home/lib/applet jre1.8.0_221.jre/Contents/Home/lib/libglass.dylib jre1.8.0_221.jre/Contents/Home/lib/jfxswt.jar jre1.8.0_221.jre/Contents/Home/lib/libmlib_image.dylib jre1.8.0_221.jre/Contents/Home/lib/libjavafx_font.dylib jre1.8.0_221.jre/Contents/Home/lib/libmanagement.dylib jre1.8.0_221.jre/Contents/Home/lib/libjaas_unix.dylib jre1.8.0_221.jre/Contents/Home/lib/libgstreamer-lite.dylib jre1.8.0_221.jre/Contents/Home/lib/libjsound.dylib jre1.8.0_221.jre/Contents/Home/lib/libjfxwebkit.dylib jre1.8.0_221.jre/Contents/Home/lib/charsets.jar jre1.8.0_221.jre/Contents/Home/lib/resources.jar jre1.8.0_221.jre/Contents/Home/lib/libnpt.dylib jre1.8.0_221.jre/Contents/Home/lib/libbci.dylib jre1.8.0_221.jre/Contents/Home/lib/libj2pcsc.dylib jre1.8.0_221.jre/Contents/Home/lib/libjsig.dylib jre1.8.0_221.jre/Contents/Home/lib/jvm.hprof.txt jre1.8.0_221.jre/Contents/Home/lib/libjawt.dylib jre1.8.0_221.jre/Contents/Home/lib/libattach.dylib jre1.8.0_221.jre/Contents/Home/lib/libprism_common.dylib jre1.8.0_221.jre/Contents/Home/lib/content-types.properties jre1.8.0_221.jre/Contents/Home/lib/libprism_es2.dylib jre1.8.0_221.jre/Contents/Home/lib/libfontmanager.dylib jre1.8.0_221.jre/Contents/Home/lib/fontconfig.bfc jre1.8.0_221.jre/Contents/Home/lib/jspawnhelper jre1.8.0_221.jre/Contents/Home/lib/meta-index jre1.8.0_221.jre/Contents/Home/lib/management-agent.jar jre1.8.0_221.jre/Contents/Home/lib/libjpeg.dylib jre1.8.0_221.jre/Contents/Home/lib/jce.jar jre1.8.0_221.jre/Contents/Home/lib/flavormap.properties jre1.8.0_221.jre/Contents/Home/lib/libdecora_sse.dylib jre1.8.0_221.jre/Contents/Home/lib/libjsdt.dylib jre1.8.0_221.jre/Contents/Home/lib/liblcms.dylib jre1.8.0_221.jre/Contents/Home/lib/libAppleScriptEngine.dylib jre1.8.0_221.jre/Contents/Home/lib/libverify.dylib jre1.8.0_221.jre/Contents/Home/lib/psfont.properties.ja jre1.8.0_221.jre/Contents/Home/lib/libj2gss.dylib jre1.8.0_221.jre/Contents/Home/lib/libdcpr.dylib jre1.8.0_221.jre/Contents/Home/lib/libsaproc.dylib jre1.8.0_221.jre/Contents/Home/lib/fonts jre1.8.0_221.jre/Contents/Home/lib/fonts/LucidaSansRegular.ttf jre1.8.0_221.jre/Contents/Home/lib/fonts/LucidaTypewriterRegular.ttf jre1.8.0_221.jre/Contents/Home/lib/fonts/fonts.dir jre1.8.0_221.jre/Contents/Home/lib/fonts/LucidaBrightDemiBold.ttf jre1.8.0_221.jre/Contents/Home/lib/fonts/LucidaSansDemiBold.ttf jre1.8.0_221.jre/Contents/Home/lib/fonts/LucidaBrightRegular.ttf jre1.8.0_221.jre/Contents/Home/lib/fonts/LucidaBrightItalic.ttf jre1.8.0_221.jre/Contents/Home/lib/fonts/LucidaBrightDemiItalic.ttf jre1.8.0_221.jre/Contents/Home/lib/fonts/LucidaTypewriterBold.ttf jre1.8.0_221.jre/Contents/Home/lib/classlist jre1.8.0_221.jre/Contents/Home/lib/libjava.dylib jre1.8.0_221.jre/Contents/Home/lib/libawt.dylib jre1.8.0_221.jre/Contents/Home/lib/libunpack.dylib jre1.8.0_221.jre/Contents/Home/lib/libosx.dylib jre1.8.0_221.jre/Contents/Home/lib/libjfxmedia.dylib jre1.8.0_221.jre/Contents/Home/lib/libprism_sw.dylib jre1.8.0_221.jre/Contents/Home/lib/libosxapp.dylib jre1.8.0_221.jre/Contents/Home/COPYRIGHT jre1.8.0_221.jre/Contents/MacOS jre1.8.0_221.jre/Contents/MacOS/libjli.dylib jre1.8.0_221.jre/Contents/Info.plist

Lucina commented 4 years ago

Might have luck building this fork of appbundler and using the resultant JavaAppLauncher binary. Still needs the old Apple format but source looks like there's support for 9+.

abcbarryn commented 4 years ago

Where are the build instructions for that code?

Lucina commented 4 years ago

It's designed to be built with ant.

abcbarryn commented 4 years ago

Ok, I built it’s test-plugin, but it failed to run:

$ ant test-plugin Buildfile: /Users/barryn/Downloads/appbundler-master/build.xml

compile:

package: [jar] Building jar: /Users/barryn/Downloads/appbundler-master/appbundler/bin/appbundler-1.0ea.jar

test-plugin: [bundleapp] Creating app bundle: TestPlugin

BUILD SUCCESSFUL Total time: 1 second $ open TestPlugin.app LSOpenURLsWithRole() failed with error -10810 for the file /Users/barryn/Downloads/appbundler-master/TestPlugin.app. $ ./TestPlugin.app/Contents/MacOS/JavaAppLauncher Unrecognized option: -m Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. $

On Aug 17, 2019, at 5:07 PM, Lucina notifications@github.com wrote:

It's designed to be built with ant.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/Jorl17/jar2app/issues/39?email_source=notifications&email_token=ADKDE4KYDUBQEINYDMUWXILQFBR7JA5CNFSM4IMO25T2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD4QTPEY#issuecomment-522270611, or mute the thread https://github.com/notifications/unsubscribe-auth/ADKDE4K5GX67AT2KVKEOP53QFBR7JANCNFSM4IMO25TQ.

derek-baxter commented 4 years ago

@abcbarryn Were you ever able to get your program to work? I am running into the same issue. I want to use a custom jre but keep getting unable to load runtime environment

abcbarryn commented 4 years ago

I used this shell script from hell and bundled the jre manually...

!/bin/sh

dir=dirname "$0" cd "$dir" dir=pwd cd ../.. export APP_ROOT=pwd cd "$dir/../Java" export JAVAROOT=pwd cd "$dir" jarfile=ls "$JAVAROOT" | head -1 JVM=/usr/libexec/PlistBuddy -c 'Print JVMRuntime' ../Info.plist 2>/dev/null if [ -n "$JVM" ] then cwd=pwd cd "$dir/../PlugIns/$JVM/Contents/Home" export JAVA_HOME=pwd cd "$dir/../PlugIns/$JVM/Contents/MacOS" JVMMacOS=pwd cd "$cwd" export PATH="$JAVA_HOME/bin:$PATH" export libpath="$JAVA_HOME/lib:$JVMMacOS" fi jarpath="$JAVAROOT/$jarfile" userdir=/usr/libexec/PlistBuddy -c 'Print JVMOptions' ../Info.plist | sed 's/^Array.*{//' | tr -d '}' | sed 's/^ *//' | grep -e '-Duser.dir=' | sed "s%\\\$APP_ROOT%$APP_ROOT%" | grep -v '^$' | tr '\n' ' ' | sed 's/ *$//' ; echo options=/usr/libexec/PlistBuddy -c 'Print JVMOptions' ../Info.plist | sed 's/^Array.*{//' | tr -d '}' | sed 's/^ *//' | grep -v -e '-Duser.dir=' | grep -v -e '-Xdock:name=' | grep -v '^$' | sed 's/ *$//' | tr '\n' ' ' | sed 's/ *$//' ; echo jvmarguments=/usr/libexec/PlistBuddy -c 'Print JVMArguments' ../Info.plist 2>/dev/null | sed 's/^Array.*{//' | tr -d '}' | grep -v '^$' | tr '\n' ' ' ; echo mainclass=/usr/libexec/PlistBuddy -c 'Print JVMMainClassName' ../Info.plist 2>/dev/null dockname=/usr/libexec/PlistBuddy -c 'Print CFBundleName' ../Info.plist 2>/dev/null dockicon=/usr/libexec/PlistBuddy -c 'Print CFBundleIconFile' ../Info.plist 2>/dev/null cd ../../.. export DYLD_FALLBACK_LIBRARY_PATH="$libpath" libpath="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib:$HOME/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.:$libpath"

exec java -Xdock:icon="$dir/../Resources/$dockicon" -Xdock:name="$dockname" $options -Djava.library.path="$libpath" -cp "$classpath" "$mainclass"

exec java -Xdock:icon="$dir/../Resources/$dockicon" -Xdock:name="$dockname" $options "$userdir" -Djava.library.path="$libpath" -jar "$jarpath" $jvmarguments

derek-baxter commented 4 years ago

I made this shell script, Not sure if it would work for your needs but it fixed most of my problems

JAVA_HOME=\`/usr/libexec/java_home -v 1.8\`

javapackager \
  -deploy \
  -Bruntime=/Library/Java/JavaVirtualMachines/openjdk11.jre/Contents/Home \
  -BjvmOptions="--module-path lib/javafx/libsMac --add-modules=javafx.controls,javafx.swing,javafx.fxml --add-exports javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED --add-exports javafx.graphics/com.sun.javafx.stage=ALL-UNNAMED --add-exports javafx.graphics/com.sun.javafx.scene=ALL-UNNAMED --add-exports javafx.graphics/com.sun.javafx.scene.traversal=ALL-UNNAMED --add-exports javafx.graphics/com.sun.javafx.tk=ALL-UNNAMED --add-exports javafx.graphics/com.sun.glass.ui=ALL-UNNAMED --add-exports java.desktop/sun.awt=ALL-UNNAMED --add-exports javafx.graphics/com.sun.javafx.stage=ALL-UNNAMED -Djava.library.path=lib/nativeMac/RBA_SDK.framework" \
  -native image \
  -srcdir . \
  -srcfiles MyJar.jar \
  -srcfiles lib/ \
  -outdir release \
  -outfile MyApp.app \
  -appclass com.name.app \
  -name "Test App" \
  -title "Test App" \
  -nosign \
  -v

The only problem is the .framework files get messed up. I have to manually add the RBA_SDK framework into my app. otherwise it works as expected