Bug#895619: plexus-compiler: use --release instead of -source/-target for jdk9+ when setting defaults

Emmanuel Bourg ebourg at apache.org
Mon Apr 30 13:02:43 BST 2018


Hi Tiago,

Le 14/04/2018 à 03:11, Tiago Daitx a écrit :

> Please review the new debdiff attached in this email.

Thank you fo the update. I'm attaching the revised patch since it wasn't
sent to the bug log.

I suggest also setting the -release parameter when the VM is forked.
Since the plexus-compiler package is only used to build Debian packages
with the default JDK there is no risk of calling a JDK that doesn't
support the new parameter.

Also no need to print the deprecation message for the source/target
parameters, this is Debian specific and we aren't going to reconfigure
all upstream projects ourself anyway.

Emmanuel Bourg
-------------- next part --------------
diff -Nru plexus-compiler-2.8.2/debian/changelog plexus-compiler-2.8.2/debian/changelog
--- plexus-compiler-2.8.2/debian/changelog	2017-09-18 10:31:35.000000000 -0300
+++ plexus-compiler-2.8.2/debian/changelog	2018-04-12 11:35:44.000000000 -0300
@@ -1,3 +1,10 @@
+plexus-compiler (2.8.2-6) UNRELEASED; urgency=medium
+
+  * Use a default --release instead of defaults -source/-target in order to
+    have the right bootclasspath set as per JEP 247. (Closes: #895619)
+
+ -- Tiago Stürmer Daitx <tiago.daitx at ubuntu.com>  Thu, 12 Apr 2018 14:35:44 +0000
+
 plexus-compiler (2.8.2-5) unstable; urgency=medium
 
   * Team upload.
diff -Nru plexus-compiler-2.8.2/debian/patches/auto-adjust-language-level.patch plexus-compiler-2.8.2/debian/patches/auto-adjust-language-level.patch
--- plexus-compiler-2.8.2/debian/patches/auto-adjust-language-level.patch	2017-07-04 03:58:08.000000000 -0300
+++ plexus-compiler-2.8.2/debian/patches/auto-adjust-language-level.patch	2018-04-12 11:35:44.000000000 -0300
@@ -3,40 +3,114 @@
 Forwarded: not-needed
 --- a/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java
 +++ b/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java
-@@ -339,12 +339,20 @@
+@@ -100,6 +100,16 @@ public class JavacCompiler
+ 
+     private static final String JAVAC_CLASSNAME = "com.sun.tools.javac.Main";
+ 
++    private static final String JAVA_CLASS_VERSION = System.getProperty( "java.class.version", "0" );
++
++    private static final java.util.List<String> unsupportedLanguageLevels = java.util.Collections.unmodifiableList(java.util.Arrays.asList(new String[]{"1.1", "1.2", "1.3", "1.4", "1.5", "5"}));
++
++    private static final String DEFAULT_SOURCE_VERSION = "1.7";
++
++    private static final String DEFAULT_TARGET_VERSION = "1.7";
++
++    private static final String DEFAULT_RELEASE_VERSION = "7";
++
+     private static volatile Class<?> JAVAC_CLASS;
+ 
+     private List<Class<?>> javaccClasses = new CopyOnWriteArrayList<Class<?>>();
+@@ -195,6 +205,23 @@ public class JavacCompiler
+         }
+     }
+ 
++    protected static boolean supportsReleaseFlag()
++    {
++        return getCurrentJvmClassVersion() >= 53;
++    }
++
++    protected static int getCurrentJvmClassVersion()
++    {
++        try
++        {
++            return Float.valueOf( JAVA_CLASS_VERSION ).intValue();
++        }
++        catch (Exception e)
++        {
++            return 0;
++        }
++    }
++
+     public String[] createCommandLine( CompilerConfiguration config )
+         throws CompilerException
+     {
+@@ -339,30 +366,55 @@ public class JavacCompiler
          }
          else
          {
-+            List<String> unsupportedLanguageLevels = java.util.Arrays.asList(new String[]{"1.1", "1.2", "1.3", "1.4", "1.5", "5"});
++            boolean useDefaultSource = true;
++            boolean useDefaultTarget = true;
 +
              // TODO: this could be much improved
-             if ( StringUtils.isEmpty( config.getTargetVersion() ) )
+-            if ( StringUtils.isEmpty( config.getTargetVersion() ) )
+-            {
+-                // Required, or it defaults to the target of your JDK (eg 1.5)
+-                args.add( "-target" );
+-                args.add( "1.1" );
+-            }
+-            else
++            if ( !StringUtils.isEmpty( config.getTargetVersion() ) && !unsupportedLanguageLevels.contains( config.getTargetVersion() ) )
              {
-                 // Required, or it defaults to the target of your JDK (eg 1.5)
++                if ( supportsReleaseFlag() )
++                {
++                    System.err.println( "Use of maven-compiler-plugin's 'target' option is no longer recommended, consider using 'release' instead" );
++                }
++                useDefaultTarget = false;
                  args.add( "-target" );
--                args.add( "1.1" );
-+                args.add( "1.7" );
-+            }
-+            else if ( unsupportedLanguageLevels.contains( config.getTargetVersion() ) )
-+            {
-+                System.err.println( "Use of target " + config.getTargetVersion() + " is no longer supported, switching to 1.7" );
-+                args.add( "-target" );
-+                args.add( "1.7" );
+                 args.add( config.getTargetVersion() );
++
              }
-             else
-             {
-@@ -356,7 +364,13 @@
+ 
+-            if ( !suppressSource( config ) && StringUtils.isEmpty( config.getSourceVersion() ) )
++            if ( !suppressSource( config ) && !StringUtils.isEmpty( config.getSourceVersion() ) && !unsupportedLanguageLevels.contains( config.getSourceVersion() ) )
              {
-                 // If omitted, later JDKs complain about a 1.1 target
+-                // If omitted, later JDKs complain about a 1.1 target
++                if ( supportsReleaseFlag() )
++                {
++                    System.err.println( "Use of maven-compiler-plugin's 'source' option is no longer recommended, consider using 'release' instead" );
++                }
++                useDefaultSource = false;
                  args.add( "-source" );
 -                args.add( "1.3" );
-+                args.add( "1.7" );
-+            }
-+            else if ( !suppressSource( config ) && unsupportedLanguageLevels.contains( config.getSourceVersion() ) )
-+            {
-+                 System.err.println( "Use of source " + config.getSourceVersion() + " is no longer supported, switching to 1.7" );
-+                args.add( "-source" );
-+                args.add( "1.7" );
++                args.add( config.getSourceVersion() );
              }
-             else if ( !suppressSource( config ) )
+-            else if ( !suppressSource( config ) )
++
++            // when forking we can't tell javac's version so it's better
++            // to avoid replacing -source/target with --release
++            if ( !config.isFork() && useDefaultTarget && useDefaultSource && supportsReleaseFlag() )
              {
+-                args.add( "-source" );
+-                args.add( config.getSourceVersion() );
+-            }            
++                args.add( "--release" );
++                args.add( DEFAULT_RELEASE_VERSION );
++            }
++            else
++            {
++                if ( useDefaultTarget )
++                {
++                    System.err.println( "Use of target " + config.getTargetVersion() + " is no longer supported, switching to " + DEFAULT_TARGET_VERSION );
++                    args.add( "-target" );
++                    args.add( DEFAULT_TARGET_VERSION );
++                }
++                if ( useDefaultSource )
++                {
++                    System.err.println( "Use of source " + config.getSourceVersion() + " is no longer supported, switching to " + DEFAULT_SOURCE_VERSION );
++                    args.add( "-source" );
++                    args.add( DEFAULT_SOURCE_VERSION );
++                }
++            }
+         }
+ 
+ 


More information about the pkg-java-maintainers mailing list