Added better checks to see if javaFX is in use. Added system property to enable javaFX, to bypass reflection checks if wanted
This commit is contained in:
parent
713d05eeaf
commit
f0e5f85eeb
|
@ -41,6 +41,9 @@ class JavaFx {
|
||||||
// We cannot use getToolkit(), because if JavaFX is not being used, calling getToolkit() will initialize it...
|
// We cannot use getToolkit(), because if JavaFX is not being used, calling getToolkit() will initialize it...
|
||||||
// see: https://bugs.openjdk.java.net/browse/JDK-8090933
|
// see: https://bugs.openjdk.java.net/browse/JDK-8090933
|
||||||
|
|
||||||
|
String fullJavaVersion = System.getProperty("java.version", "");
|
||||||
|
boolean isJava8 = fullJavaVersion.startsWith("1.") && fullJavaVersion.charAt(2) == '8';
|
||||||
|
|
||||||
Class<?> javaFxLoggerClass = AccessController.doPrivileged(new PrivilegedAction<Class<?>>() {
|
Class<?> javaFxLoggerClass = AccessController.doPrivileged(new PrivilegedAction<Class<?>>() {
|
||||||
@Override
|
@Override
|
||||||
public
|
public
|
||||||
|
@ -57,16 +60,41 @@ class JavaFx {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
boolean isJavaFxLoaded_ = false;
|
boolean isJavaFxLoaded_ = false;
|
||||||
try {
|
try {
|
||||||
if (javaFxLoggerClass != null) {
|
if (javaFxLoggerClass != null) {
|
||||||
// this is important to use reflection, because if JavaFX is not being used, calling getToolkit() will initialize it...
|
// try to avoid using reflection!
|
||||||
Method m = ClassLoader.class.getDeclaredMethod("findLoadedClass", String.class);
|
|
||||||
m.setAccessible(true);
|
|
||||||
ClassLoader cl = ClassLoader.getSystemClassLoader();
|
|
||||||
|
|
||||||
isJavaFxLoaded_ = (null != m.invoke(cl, "com.sun.javafx.tk.Toolkit")) || (null != m.invoke(cl, "javafx.application.Application"));
|
// first, walk the stack to see if any JavaFX classes are used (which indicate that we are running with JavaFX)
|
||||||
|
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
||||||
|
for (int i = 0; i < stackTrace.length; i++) {
|
||||||
|
if (stackTrace[i].getClassName().contains("javafx")) {
|
||||||
|
isJavaFxLoaded_ = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// this is important to use reflection, because if JavaFX is not being used, calling getToolkit() will initialize it...
|
||||||
|
if (!isJavaFxLoaded_) {
|
||||||
|
// stack walking failed, resort to using a property (emit a warning)
|
||||||
|
String usingJavFx = System.getProperty("usingJavaFx", "false");
|
||||||
|
if (!usingJavFx.equals("false")) {
|
||||||
|
// if it is set to ANYTHING other than exactly "false", then we are using javaFX. Skip reflection testing
|
||||||
|
isJavaFxLoaded_ = true;
|
||||||
|
} else {
|
||||||
|
// stack walking and property check failed, resort to using reflection.
|
||||||
|
// WE DON'T always want to do this BECAUSE Java9+ really doesn't like reflection!
|
||||||
|
LoggerFactory.getLogger(JavaFx.class).debug("Using reflection to detect if JavaFX is loaded.\n" +
|
||||||
|
"To avoid using reflection, set the system property \"usingJavaFx\" to \"true\" before your application starts. " +
|
||||||
|
"For example: System.setProperty(\"usingJavaFx\", \"true\");");
|
||||||
|
|
||||||
|
Method m = ClassLoader.class.getDeclaredMethod("findLoadedClass", String.class);
|
||||||
|
m.setAccessible(true);
|
||||||
|
ClassLoader cl = ClassLoader.getSystemClassLoader();
|
||||||
|
|
||||||
|
isJavaFxLoaded_ = (null != m.invoke(cl, "com.sun.javafx.tk.Toolkit")) || (null != m.invoke(cl, "javafx.application.Application"));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
LoggerFactory.getLogger(JavaFx.class).debug("Error detecting if JavaFX is loaded", e);
|
LoggerFactory.getLogger(JavaFx.class).debug("Error detecting if JavaFX is loaded", e);
|
||||||
|
@ -85,8 +113,7 @@ class JavaFx {
|
||||||
|
|
||||||
// https://github.com/teamfx/openjfx-9-dev-rt/blob/master/modules/javafx.graphics/src/main/java/com/sun/glass/ui/gtk/GtkApplication.java
|
// https://github.com/teamfx/openjfx-9-dev-rt/blob/master/modules/javafx.graphics/src/main/java/com/sun/glass/ui/gtk/GtkApplication.java
|
||||||
|
|
||||||
String fullJavaVersion = System.getProperty("java.version", "");
|
if (isJava8) {
|
||||||
if (fullJavaVersion.startsWith("1.") && fullJavaVersion.charAt(2) == '8') {
|
|
||||||
// JavaFX from Oracle Java 8 is GTK2 only. Java9 can have it be GTK3 if -Djdk.gtk.version=3 is specified
|
// JavaFX from Oracle Java 8 is GTK2 only. Java9 can have it be GTK3 if -Djdk.gtk.version=3 is specified
|
||||||
// see http://mail.openjdk.java.net/pipermail/openjfx-dev/2016-May/019100.html
|
// see http://mail.openjdk.java.net/pipermail/openjfx-dev/2016-May/019100.html
|
||||||
isJavaFxGtk3_ = false;
|
isJavaFxGtk3_ = false;
|
||||||
|
|
Loading…
Reference in New Issue