jetty-project / jetty-alpn

Implementation of ALPN (Application Layer Protocol Negotiation) Specification for OpenJDK 7 or greater
48 stars 27 forks source link

Create ubuntu_version_mapping.properties #24

Open abarsov opened 6 years ago

abarsov commented 6 years ago

Separate mapping from ubuntu builds to alpn-boot jars See https://github.com/eclipse/jetty.project/issues/3100 and https://github.com/jetty-project/jetty-alpn/issues/22

sbordet commented 6 years ago

@abarsov the format of the file should be:

<System.getProperty("java.version")>=<alpn-boot-version>

I doubt that calling System.getProperty("java.version") in the ubuntu JDK you get back "8u181-b13-0ubuntu0.16.04.1".

Where do you get that string "8u181-b13-0ubuntu0.16.04.1" from?

The goal of the file is that a Java program could download it, read its lines, and match the key of a line with some system property (or some other API call) that returns the Ubuntu specific version.

abarsov commented 6 years ago

We can't use java.version

System.getProperty("java.version") is equal to 1.8.0_181 for ubuntu openjdk as well.

8u181-b13-1ubuntu0.16.04.1 is a version of package https://launchpad.net/ubuntu/xenial/amd64/openjdk-8-jdk-headless/8u181-b13-1ubuntu0.16.04.1

Though jvm option java.runtime.version can be used for distinguishing ubuntu openjdk builds

For instance, for package 8u181-b13-1ubuntu0.16.04.1, System.getProperty("java.runtime.version") = 1.8.0_181-8u181-b13-1ubuntu0.16.04.1-b13 (this way package version from mapping is included into java.runtime.version as a substring).

Btw, there are several packages for other ubuntu versions released at the same date: (see https://launchpad.net/ubuntu/+source/openjdk-8), but i have not tested them for compatibility with alpn-boot.

sbordet commented 5 years ago

@abarsov I'm happy to have the Ubuntu file map java.runtime.version to ALPN boot versions for Ubuntu, but you need to be sure that A) the java.runtime.version is unique and B) that it is compatible with a ALPN boot version.

abarsov commented 5 years ago

@sbordet

A) java.runtime.version is unique within vendor jre updates and looks to be unique globally due to included token ubuntu and concise version of the package.

B) I have tested that

Although there is no guarantee that further updates of package Ubuntu openjdk 8u181 (if any) will be be still compatible with alpn-boot-8.1.13.v20181017

To the moment I have come up with the following code resolving alpn-boot version for java:

notes:

    final String javaVersion = System.getProperty("java.version");
    final String alpnBootVersion ;
    if ("1.8.0_181".equals(javaVersion)) {
      final String javaRuntimeVersion = System.getProperty("java.runtime.version");
      if (javaRuntimeVersion != null && javaRuntimeVersion.contains("ubuntu")) {
        if (javaRuntimeVersion.equals("1.8.0_181-8u181-b13-0ubuntu0.16.04.1-b13")) {
          alpnBootVersion = versionMap.get(javaVersion);
        } else if (javaRuntimeVersion.equals("1.8.0_181-8u181-b13-1ubuntu0.16.04.1-b13")) {
          alpnBootVersion = versionMap.get("1.8.0_191");
        } else {
          // Assuming that all further updates of Ubuntu openjdk package 8u181 still will be compatible with alpn-boot compiled against Oracle java 1.8.0_191.
          // That is no guarantee that this would happen, but there are good chances for.
          alpnBootVersion = versionMap.get("1.8.0_191");
        }
      } else if (javaRuntimeVersion != null && javaRuntimeVersion.contains("~deb")) {
        if (javaRuntimeVersion.equals("1.8.0_181-8u181-b13-1~deb9u1-b13")) {
          alpnBootVersion = versionMap.get(javaVersion);
        } else {
          // Maintainers of openjdk packages for Debian have back-ported changes made in Oracle 8u191 to their 8u181 releases, and published updated versions of 8u181 package as "1.8.0_181-8u181-b13-2~deb9u1-b13"
          // That package is incompatible with all versions of alpn-boot jar
          System.out.println(String.format("WARN: Incompatible openjdk package %s is detected. Skip adding alpn-boot jar to java bootstrap classpath...", javaRuntimeVersion));
          alpnBootVersion = null;
        }
      } else {
        alpnBootVersion = versionMap.get(javaVersion);
      }
    } else if (versionMap.containsKey(javaVersion)) {
      alpnBootVersion = versionMap.get(javaVersion);
    } else if (javaVersion.startsWith("1.8.")) {
      alpnBootVersion = getAlpnBootForLatestJre8();
    } else {
      alpnBootVersion = null;
    }
abarsov commented 5 years ago

@sbordet I am sorry, but I have finally found broken compatibility in openjdk update 1.8.0_181-8u181-b13-1ubuntu0.16.04.1-b13. So proposed mapping is incorrect, the only valid record is 8u181-b13-0ubuntu0.16.04.1=8.1.12.v20180117

Entry 8u181-b13-1ubuntu0.16.04.1=8.1.13.v20181017 is invalid.

This way the code that resolve appropriate alpn-boot mapping can be simplified to

    final String javaVersion = System.getProperty("java.version");
    final String alpnBootVersion ;
    if ("1.8.0_181".equals(javaVersion)) {
      final String javaRuntimeVersion = System.getProperty("java.runtime.version");
      if (javaRuntimeVersion != null && javaRuntimeVersion.contains("ubuntu")) {
        if (javaRuntimeVersion.equals("1.8.0_181-8u181-b13-0ubuntu0.16.04.1-b13")) {
          alpnBootVersion = versionMap.get(javaVersion);
        } else {
        // Maintainers of openjdk packages for Ubuntu have back-ported changes made in Oracle 8u191 to their 8u181 releases  and published updated versions of 8u181 package as "1.8.0_181-8u181-b13-1ubuntu0.16.04.1-b13")
        // That package is incompatible with all versions of alpn-boot jar
        System.out.println(String.format("WARN: Incompatible openjdk package %s is detected. Skip adding alpn-boot jar to java bootstrap classpath...", javaRuntimeVersion));
        alpnBootVersion = null;
       }
      } else if (javaRuntimeVersion != null && javaRuntimeVersion.contains("~deb")) {
        if (javaRuntimeVersion.equals("1.8.0_181-8u181-b13-1~deb9u1-b13")) {
          alpnBootVersion = versionMap.get(javaVersion);
        } else {
          // Maintainers of openjdk packages for Debian have back-ported changes made in Oracle 8u191 to their 8u181 releases, and published updated versions of 8u181 package as "1.8.0_181-8u181-b13-2~deb9u1-b13"
          // That package is incompatible with all versions of alpn-boot jar
          System.out.println(String.format("WARN: Incompatible openjdk package %s is detected. Skip adding alpn-boot jar to java bootstrap classpath...", javaRuntimeVersion));
          alpnBootVersion = null;
        }
      } else {
        alpnBootVersion = versionMap.get(javaVersion);
      }
    } else if (versionMap.containsKey(javaVersion)) {
      alpnBootVersion = versionMap.get(javaVersion);
    } else if (javaVersion.startsWith("1.8.")) {
      alpnBootVersion = getAlpnBootForLatestJre8();
    } else {
      alpnBootVersion = null;
    }