Opened 6 years ago
Last modified 2 years ago
#58098 new enhancement
Install openjdk8 as default JVM
Reported by: | giansalvo (gians) | Owned by: | |
---|---|---|---|
Priority: | Normal | Milestone: | |
Component: | ports | Version: | 2.5.4 |
Keywords: | Cc: | breun (Nils Breunese), cooljeanius (Eric Gallager) | |
Port: | openjdk8 |
Description
I'm trying to port a java based application (Arduino IDE) to MacPorts.
The Arduino application is built correctly and Arduino.app get installed to /Applications/MacPorts folder.
However when I launch Arduino.app I get "Unable to load Java Runtime Environment".
I installed openjdk8 with sudo 'port install openjdk8'.
I have another JVM installed that looks like the default JVM (see attached files):
$ls /Library/Java/JavaVirtualMachines/ jdk1.8.0_131.jdk openjdk8
What is (if it's possible) the clean way to install openjdk8 as the default JVM?
Attachments (4)
Change History (20)
Changed 6 years ago by giansalvo (gians)
Attachment: | Schermata 2019-02-18 alle 21.35.56.png added |
---|
Changed 6 years ago by giansalvo (gians)
Attachment: | Schermata 2019-02-18 alle 21.40.33.png added |
---|
comment:1 Changed 6 years ago by ryandesign (Ryan Carsten Schmidt)
comment:2 follow-up: 5 Changed 6 years ago by jmroot (Joshua Root)
Cc: | breun added |
---|
Are you just wanting to get this one port to use a specified JRE? That's different to setting it as the default.
comment:3 follow-up: 4 Changed 6 years ago by breun (Nils Breunese)
The standard way of setting your default JVM is by setting the JAVA_HOME
environment variable.
When you install the openjdk8
port this message is displayed explaining this:
If you have more than one JDK installed you can make JDK 8 the default by adding the following line to your Bash shell profile (~/.bash_profile): export JAVA_HOME=/Library/Java/JavaVirtualMachines/openjdk8/Contents/Home
You can check the value of JAVA_HOME
by running echo $JAVA_HOME
. On my machine I get this:
$ echo $JAVA_HOME /Library/Java/JavaVirtualMachines/openjdk8/Contents/Home
What do you get on your machine?
You can run /usr/libexec/java_home -V
to get a list of all JVM's on your machine (as long as they're installed under /Library/Java/JavaVirtualMachines
).
Another method is using /usr/libexec/java_home
to find a JVM matching the desired Java major version like this:
$ /usr/libexec/java_home -v 1.8 /Library/Java/JavaVirtualMachines/openjdk8/Contents/Home
You could use that command in your Bash profile like this:
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
Although I prefer to set JAVA_HOME
to an explicit location myself.
Changed 6 years ago by giansalvo (gians)
Attachment: | Schermata 2019-02-19 alle 18.01.56.png added |
---|
comment:4 Changed 6 years ago by giansalvo (gians)
Replying to breun:
The standard way of setting your default JVM is by setting the
JAVA_HOME
environment variable.When you install the
openjdk8
port this message is displayed explaining this:If you have more than one JDK installed you can make JDK 8 the default by adding the following line to your Bash shell profile (~/.bash_profile): export JAVA_HOME=/Library/Java/JavaVirtualMachines/openjdk8/Contents/Home
Yes I know. This is true for java applications that you launch from the terminal/shell. But I need to "link" the JVM with a macOS bundled java application (Arduino.app in the /Applications
folder). As far as I could see the JAVA_HOME
shell variable set in the Bash profile configuration file doesn't affect the .app application.
Furthermore as you can see from the third attached image, the .app file contains already the entire openjdk8
JRE.
comment:5 Changed 6 years ago by giansalvo (gians)
Replying to jmroot:
Are you just wanting to get this one port to use a specified JRE? That's different to setting it as the default.
I actually would like to link this specific port to openjdk8 JRE (which is already contained in the .app file). At worst I'd like to try setting it for the all system.
comment:6 follow-up: 8 Changed 6 years ago by breun (Nils Breunese)
If the app already contains an entire JRE, then I think it won't be necessary to have the openjdk8
port installed. I'm not very familiar with macOS GUI apps that use Java, but I guess the .app must contain some kind of start script that starts the java
process with the correct arguments (using the java
binary from the included JRE). Maybe you can take a look at the package contents of another macOS GUI app on how to do this. Dealing with the JAVA_HOME
environment variable indeed shouldn't be necessary in this case.
comment:7 Changed 6 years ago by kencu (Ken)
Alternatively there is a way to set environment variables using the plist
file in the bundle that might be of use for this. You could set it to a specific JAVA_HOME
perhaps.
<https://superuser.com/questions/476752/setting-environment-variables-in-os-x-for-gui-applications>
comment:8 Changed 6 years ago by giansalvo (gians)
Replying to breun:
If the app already contains an entire JRE, then I think it won't be necessary to have the
openjdk8
port installed.
The app was built WITH openjdk8
and should contain it but somehow it isn't recognized or something like that.
Replying to breun:
I'm not very familiar with macOS GUI apps that use Java, but I guess the .app must contain some kind of start script that starts the
java
process with the correct arguments (using thejava
binary from the included JRE). Maybe you can take a look at the package contents of another macOS GUI app on how to do this.
It's exactly what I thought but I couldn't find any macOS GUI Java app already ported in MacPorts. Do you know any?
Changed 6 years ago by giansalvo (gians)
Attachment: | Info-openjdk.plist added |
---|
this is Info.plist file found inside the macOS app bundle
comment:9 Changed 6 years ago by breun (Nils Breunese)
I'm not familiar with macOS GUI Java apps, but that Info.plist
contains references to $JVM_RUNTIME
. I don't know if that has a value and if so, where it would come from. The screen shot you attached also shows the openjdk8
dir to be in Contents/PlugIns/openjdk8
, while the plist references $JVM_RUNTIME/Contents/Java
(I don't know what's in there). If the JRE really is contained in the .app, then I don't think you'd need an environment variable like $JVM_RUNTIME
, but should just be able to point to the Java directory inside the .app directly. I don't really think this is really a MacPorts question actually, maybe a place with people who know how to create a macOS .app with a JRE inside will be able to help you better.
comment:10 Changed 6 years ago by giansalvo (gians)
I was able to fix the problem using /usr/libexec/java_home
to set JAVA_HOME
environment variable.
comment:11 Changed 6 years ago by breun (Nils Breunese)
That method will not use the included JRE though, because /usr/libexec/java_home
won't find that, so then users will need to have a separate Java installation.I guess it should be possible to point JAVA_HOME
to the included JRE instead.
comment:12 Changed 4 years ago by zeddit (Dai Zhang)
I had the same issue.
I installed the openjdk8
from macports, and set the $JAVA_HOME
following the notes. After that, I have checked that java
can run in the terminal.
However, macOS application cannot load java runtime environment thus fail to run.
I uninstalled the openjdk8
, and reinstall jdk from the java homepage's jdk8.dmg
. This time, macOS application can run properly.
I checked the position where jdk8.dmg
installs binaries, which is /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
, that is different from one macports installs.
I wonder if the mismatch of binary paths causes the macOS application cannot find JRE, and is there any method to fix this issue.
P.S. the macOS application I tested is VOSviewer.
comment:13 follow-up: 14 Changed 4 years ago by breun (Nils Breunese)
/Library/Internet Plug-Ins
is for browser plugins and the Java plugin for browsers has been discontinued a long time ago as far as I know. Are you trying to load a Java applet in your browser?
The openjdk8
also has a couple of variants that enable extra capabilities (see port variants openjdk8
). Maybe the app you are trying to run needs one or more of those. The error messages so far don’t give me enough information to know what could be wrong. Is the java
binary from the MacPorts port actually called, or maybe not even found by the app?
comment:14 Changed 4 years ago by zeddit (Dai Zhang)
Replying to breun:
/Library/Internet Plug-Ins
is for browser plugins and the Java plugin for browsers has been discontinued a long time ago as far as I know. Are you trying to load a Java applet in your browser?
/usr/libexec/java_home
return /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
. So I thought the jdk8.dmg
installs binaries into this folder, and I have checked that the executable files under this folder are actually executable binaries instead of link files.
I am trying to start a macOS application, not a applet in browser. But I'm not sure if the application is implemented with inside browser and applet.
The application I tested is [VOSviewer](https://www.vosviewer.com/download) .dmg
for macOS system.
The
openjdk8
also has a couple of variants that enable extra capabilities (seeport variants openjdk8
). Maybe the app you are trying to run needs one or more of those. The error messages so far don’t give me enough information to know what could be wrong. Is thejava
binary from the MacPorts port actually called, or maybe not even found by the app?
I have tried to install openjdk8 with all variants, i.e. port install openjdk8 +Applets +BundledApp +JNI +WebStart
, but the application still reports 'cannot load java runtime environment'.
I am not familiar with Java, so I am not certain if the application finds the JRE or there are some other issues.
However, when installed with jdk8.dmg
, everything work fine, so I guess the app cannot find the java.
Maybe you could download the app and have a test. Thanks.
comment:15 Changed 4 years ago by breun (Nils Breunese)
I downloaded both the versions for Mac OS X and the one for 'other systems'.
Running VOSviewer.app
indeed shows a dialog saying Unable to load Java Runtime Environment.
and then quits.
The download for 'other systems' is just a JAR file and that one works fine (although it does log an error message about CoreSVG):
~ % echo $JAVA_HOME /Library/Java/JavaVirtualMachines/openjdk8/Contents/Home ~ % java -jar Downloads/VOSviewer_1.6.16_jar/VOSviewer.jar
So, I guess there might be a bug in the logic in VOSviewer.app
that tries to locate the Java Runtime Environment. This might be something to report to the developer.
comment:16 Changed 2 years ago by cooljeanius (Eric Gallager)
Cc: | cooljeanius added |
---|
I don't know.
My understanding is ports should use the java 1.0 portgroup to indicate what JDK they want.