[jboss-jira] [JBoss JIRA] (WFCORE-4329) The launcher API may incorrectly assume the JVM is a non-modular JVM

James Perkins (Jira) issues at jboss.org
Wed Feb 13 12:06:00 EST 2019


James Perkins created WFCORE-4329:
-------------------------------------

             Summary: The launcher API may incorrectly assume the JVM is a non-modular JVM
                 Key: WFCORE-4329
                 URL: https://issues.jboss.org/browse/WFCORE-4329
             Project: WildFly Core
          Issue Type: Bug
          Components: Launcher
            Reporter: James Perkins
            Assignee: James Perkins


The launcher API checks the {{$JAVA_HOME/jmods}} directory and if missing assumes it's a non-modular JVM, e.g. Java 8 or lower. In some cases this directory does not exist. We need a better way to determine the JVM version.

It's done in the wildfly-maven-plugin like:
{code}
    /**
     * Checks to see if the {@code javaHome} is a modular JVM.
     *
     * @param javaHome the Java Home if {@code null} an attempt to discover the Java Home will be done
     *
     * @return {@code true} if this is a modular environment
     */
    public static boolean isModularJvm(final Path javaHome) {
        boolean result;
        final List<String> cmd = new ArrayList<>();
        cmd.add(getJavaCommand(javaHome));
        cmd.add("--add-modules=java.se");
        cmd.add("-version");
        final ProcessBuilder builder = new ProcessBuilder(cmd);
        Process process = null;
        Path stdout = null;
        try {
            // Create a temporary file for stdout
            stdout = Files.createTempFile("stdout", ".txt");
            process = builder.redirectErrorStream(true)
                    .redirectOutput(stdout.toFile()).start();

            if (process.waitFor(1, TimeUnit.SECONDS)) {
                result = process.exitValue() == 0;
            } else {
                if (LOGGER.isDebugEnabled()) {
                    LOGGER.debug(getStdoutMessage("The process timed out waiting for the response.", stdout));
                }
                result = false;
            }
        } catch (IOException | InterruptedException e) {
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug(getStdoutMessage("The process ended in error.", stdout), e);
            }
            result = false;
        } finally {
            if (process != null && process.isAlive()) {
                process.destroyForcibly();
            }
            if (stdout != null) {
                try {
                    Files.deleteIfExists(stdout);
                } catch (IOException ignore) {
                }
            }
        }
        return result;
    }
{code}

This works, however requires a new process to be created and launched which is not ideal.

It does look like there might be a {{$JAVA_HOME/release}} file which looks like a properties file with the {{JAVA_VERSION}} property. However we need to determine if all vendors include this file.



--
This message was sent by Atlassian Jira
(v7.12.1#712002)


More information about the jboss-jira mailing list