Package: javatools Severity: wishlist Tags: patch User: ubuntu-de...@lists.ubuntu.com Usertags: origin-ubuntu mantic ubuntu-patch X-Debbugs-Cc: vladimir.pe...@canonical.com
Dear Maintainer, Java 21 retires release level 7 and requires release level 8. This patch allows to set release level to 8 if Java is 21 or later. Changes: * jh_build: check Java version to set the minimum release level. * d/control: javahelper now depends on jarwrapper to check Java version. * d/rules: use release level 8. Thanks for considering the patch. -- System Information: Debian Release: bookworm/sid APT prefers lunar-updates APT policy: (500, 'lunar-updates'), (500, 'lunar-security'), (500, 'lunar'), (100, 'lunar-backports') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 6.2.0-24-generic (SMP w/32 CPU threads; PREEMPT) Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE=en Shell: /bin/sh linked to /usr/bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled
diff -Nru javatools-0.78/debian/control javatools-0.78ubuntu1/debian/control --- javatools-0.78/debian/control 2021-02-05 00:05:53.000000000 +1300 +++ javatools-0.78ubuntu1/debian/control 2023-05-04 19:27:54.000000000 +1200 @@ -36,6 +36,7 @@ Package: javahelper Architecture: all Depends: + jarwrapper, bsdextrautils | bsdmainutils, dctrl-tools, debhelper-compat (= 13), diff -Nru javatools-0.78/debian/rules javatools-0.78ubuntu1/debian/rules --- javatools-0.78/debian/rules 2021-02-05 00:05:53.000000000 +1300 +++ javatools-0.78ubuntu1/debian/rules 2023-05-04 19:27:54.000000000 +1200 @@ -14,7 +14,7 @@ override_dh_auto_build: jh_lib.sh mkdir -p target/classes - javac -d target/classes -source 7 -target 7 src/main/java/org/debian/javatools/CheckProperty.java + javac -d target/classes -source 8 -target 8 src/main/java/org/debian/javatools/*.java jar -cvf target/javatools.jar -C target/classes/ . mkdir tmp tmp.jarwrapper diff -Nru javatools-0.78/jh_build javatools-0.78ubuntu1/jh_build --- javatools-0.78/jh_build 2021-02-05 00:07:26.000000000 +1300 +++ javatools-0.78ubuntu1/jh_build 2023-05-04 19:27:54.000000000 +1200 @@ -10,9 +10,7 @@ use warnings; use Cwd qw(realpath); use List::Util qw(any); - -# Value to pass to -source/-target by default -use constant DEFAULT_JAVA_RELEASE => '1.7'; +use File::Temp qw(tempfile); use Debian::Debhelper::Dh_Lib; use Debian::Javahelper::Java qw(write_manifest_fd); @@ -115,7 +113,7 @@ my @JH_JAR_EXTRA; my $build_javadoc = 1; my (@javac_opts, @javadoc_opts, $main_class, $do_clean); -my (@JAVAC, @JAVADOC, @JAR, @builds); +my (@JAVAC, @JAVA, @JAVADOC, @JAR, @builds); $CLASSPATH =~ tr/:/ /; @JH_JAR_EXTRA = split(' ', $ENV{'JH_JAR_EXTRA'}) if defined $ENV{'JH_JAR_EXTRA'}; @@ -150,6 +148,17 @@ exit(0); } +# Value to pass to -source/-target by default +sub get_min_release { + if (doit_noerror(@JAVA, "-cp", "/usr/share/java/javatools.jar", "org.debian.javatools.CheckIntProperty", "java.specification.version", "gte", "21")) { + warning('Java machine does not support --release 7, using --release 8'); + return "8"; + } + # when the specification version is less than 21 or an error occured + # default to 7 + return "7"; +} + sub _has_java_option { my ($opt_ref, $option_name) = @_; for my $arg (@{$opt_ref}) { @@ -171,27 +180,6 @@ return; } -# Use ISO8859-1 as the default encoding to avoid unmappable character errors -_default_java_option(\@javac_opts, '-encoding', 'ISO8859-1'); -_default_java_option(\@javadoc_opts, '-encoding', 'ISO8859-1'); - -if (not _has_java_option(\@javac_opts, '--release') and not _has_java_option(\@javac_opts, '-source')) { - # If neither --release nor -source is set, then set -source (and -target if also absent) - if (not _has_java_option(\@javac_opts, '-target')) { - push(@javac_opts, '-source', DEFAULT_JAVA_RELEASE, '-target', DEFAULT_JAVA_RELEASE); - } else { - push(@javac_opts, '-source', DEFAULT_JAVA_RELEASE); - } -} - -if (not _has_java_option(\@javadoc_opts, '--release')) { - _default_java_option(\@javadoc_opts, '-source', DEFAULT_JAVA_RELEASE); -} - -_default_java_option(\@javadoc_opts, '-notimestamp'); -_default_java_option(\@javadoc_opts, '-Xdoclint:none'); - - sub do_build { my ($jarfile, @sources) = @_; my (@srcdirs, @srcfiles); @@ -275,8 +263,33 @@ error('Cannot find any JAVA_HOME: aborting'); } @JAVAC = ("${JAVA_HOME}/bin/javac"); + @JAVA = ("${JAVA_HOME}/bin/java"); + @JAVADOC = ("${JAVA_HOME}/bin/javadoc", '-locale', 'en_US'); @JAR = ("${JAVA_HOME}/bin/jar"); + + my $default_java_release = get_min_release(); + + # Use ISO8859-1 as the default encoding to avoid unmappable character errors + _default_java_option(\@javac_opts, '-encoding', 'ISO8859-1'); + _default_java_option(\@javadoc_opts, '-encoding', 'ISO8859-1'); + + if (not _has_java_option(\@javac_opts, '--release') and not _has_java_option(\@javac_opts, '-source')) { + # If neither --release nor -source is set, then set -source (and -target if also absent) + if (not _has_java_option(\@javac_opts, '-target')) { + push(@javac_opts, '-source', $default_java_release, '-target', $default_java_release); + } else { + push(@javac_opts, '-source', $default_java_release); + } + } + + if (not _has_java_option(\@javadoc_opts, '--release')) { + _default_java_option(\@javadoc_opts, '-source', $default_java_release); + } + + _default_java_option(\@javadoc_opts, '-notimestamp'); + _default_java_option(\@javadoc_opts, '-Xdoclint:none'); + for my $build (@builds) { do_build(@{$build}); } diff -Nru javatools-0.78/src/main/java/org/debian/javatools/CheckIntProperty.java javatools-0.78ubuntu1/src/main/java/org/debian/javatools/CheckIntProperty.java --- javatools-0.78/src/main/java/org/debian/javatools/CheckIntProperty.java 1970-01-01 12:00:00.000000000 +1200 +++ javatools-0.78ubuntu1/src/main/java/org/debian/javatools/CheckIntProperty.java 2023-05-04 19:27:54.000000000 +1200 @@ -0,0 +1,77 @@ +/* + * Copyright 2023 Canonical Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.debian.javatools; + +/** + * Check the value of a system property from the command line. + * + * Syntax: + * + * java org.debian.javatools.CheckIntProperty <propertyName> <condition> <expectedValue> + * + * <condition>: + * - gte - greater or equal + * - lte - less than or equal + * - gt - greater than + * - lt - less than + * + * The program exits with the status code 0 if the condition is true, and 1 otherwise. + */ +public class CheckIntProperty { + + private static boolean check(String operation, int actualValue, int expectedValue){ + switch (operation) { + case "gt": return actualValue > expectedValue; + case "gte": return actualValue >= expectedValue; + case "lte": return actualValue <= expectedValue; + case "lt": return actualValue < expectedValue; + default: return false; + } + } + + private static boolean IsVerbose() { + try + { + return Integer.parseInt(System.getenv("DH_VERBOSE")) != 0; + } + catch (NumberFormatException ex) + { + } + return false; + } + + public static void main(String[] args) { + boolean verbose = IsVerbose(); + String propertyName = args[0]; + String operation = args[1]; + try { + int expectedValue = Integer.parseInt(args[2]); + int actualValue = Integer.parseInt(System.getProperty(propertyName)); + if (check(operation, actualValue, expectedValue)) { + if (IsVerbose()) + System.out.println("OK: " + propertyName + " " + actualValue + " " + operation + " " + expectedValue); + System.exit(0); + } + } + catch (Exception e) { + e.printStackTrace(); + } + if (IsVerbose()) + System.out.println("FAILED: " + propertyName + " " + System.getProperty(propertyName) + " " + operation + " " + args[2]); + System.exit(1); + } +}