diff --git a/README.md b/README.md index f1267af0..8790fbcd 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,11 @@ Configurable system properties: Alternative to retrolambda.classpath for avoiding the command line length limit. The file must list one file per line with UTF-8 encoding. + retrolambda.fixJava8Classpath + Whether to replace occurrences of classpath entries ending in /classes + with entries ending in /classes-java8 if such directory is available. + Disabled by default. Enable by setting to "true" + retrolambda.includedFiles List of files to process, instead of processing all files. This is useful for a build tool to support incremental compilation. diff --git a/retrolambda-api/src/main/java/net/orfjackal/retrolambda/api/RetrolambdaApi.java b/retrolambda-api/src/main/java/net/orfjackal/retrolambda/api/RetrolambdaApi.java index 7276b978..d727d5ae 100644 --- a/retrolambda-api/src/main/java/net/orfjackal/retrolambda/api/RetrolambdaApi.java +++ b/retrolambda-api/src/main/java/net/orfjackal/retrolambda/api/RetrolambdaApi.java @@ -17,4 +17,5 @@ public class RetrolambdaApi { public static final String DEFAULT_METHODS = PREFIX + "defaultMethods"; public static final String BYTECODE_VERSION = PREFIX + "bytecodeVersion"; public static final String JAVAC_HACKS = PREFIX + "javacHacks"; + public static final String FIX_JAVA8_CLASSPATH = PREFIX + "fixJava8Classpath"; } diff --git a/retrolambda-maven-plugin/src/main/java/net/orfjackal/retrolambda/maven/ProcessClassesMojo.java b/retrolambda-maven-plugin/src/main/java/net/orfjackal/retrolambda/maven/ProcessClassesMojo.java index 122decd6..b0580fa8 100644 --- a/retrolambda-maven-plugin/src/main/java/net/orfjackal/retrolambda/maven/ProcessClassesMojo.java +++ b/retrolambda-maven-plugin/src/main/java/net/orfjackal/retrolambda/maven/ProcessClassesMojo.java @@ -107,6 +107,14 @@ abstract class ProcessClassesMojo extends AbstractMojo { @Parameter(defaultValue = "false") public boolean fork; + /** + * Whether to replace occurrences of classpath entries ending in {@code /classes} + * with entries ending in {@code /classes-java8} if such directory is available. + * @since 2.5.8 + */ + @Parameter(defaultValue = "false", property = "fixJava8Classpath", required = false) + public boolean fixJava8Classpath; + protected abstract File getInputDir(); protected abstract File getOutputDir(); @@ -126,6 +134,7 @@ public void execute() throws MojoExecutionException { config.setProperty(RetrolambdaApi.OUTPUT_DIR, getOutputDir().getAbsolutePath()); config.setProperty(RetrolambdaApi.CLASSPATH, getClasspath()); config.setProperty(RetrolambdaApi.JAVAC_HACKS, "" + javacHacks); + config.setProperty(RetrolambdaApi.FIX_JAVA8_CLASSPATH, "" + fixJava8Classpath); if (fork) { processClassesInForkedProcess(config); diff --git a/retrolambda/src/main/java/net/orfjackal/retrolambda/Config.java b/retrolambda/src/main/java/net/orfjackal/retrolambda/Config.java index e5d2c983..2f66411b 100644 --- a/retrolambda/src/main/java/net/orfjackal/retrolambda/Config.java +++ b/retrolambda/src/main/java/net/orfjackal/retrolambda/Config.java @@ -24,4 +24,6 @@ public interface Config { boolean isJavacHacksEnabled(); boolean isQuiet(); + + boolean isFixJava8Classpath(); } diff --git a/retrolambda/src/main/java/net/orfjackal/retrolambda/Retrolambda.java b/retrolambda/src/main/java/net/orfjackal/retrolambda/Retrolambda.java index 07d292f0..9f643bd9 100644 --- a/retrolambda/src/main/java/net/orfjackal/retrolambda/Retrolambda.java +++ b/retrolambda/src/main/java/net/orfjackal/retrolambda/Retrolambda.java @@ -38,6 +38,21 @@ public static void run(Config config) throws Throwable { } else { Log.INFO(); } + + if (config.isFixJava8Classpath()) { + List classpathNew = new ArrayList<>(); + for(Path p : classpath) { + if (p.toString().endsWith("/classes") && Files.isDirectory(p)) { + Path p2 = p.getParent().resolve("classes-java8"); + if (Files.isDirectory(p2)) { + p = p2; + } + } + classpathNew.add(p); + } + classpath = classpathNew; + } + Log.info("Bytecode version: " + bytecodeVersion + " (" + Bytecode.getJavaVersion(bytecodeVersion) + ")"); Log.info("Default methods: " + defaultMethodsEnabled); Log.info("Input directory: " + inputDir); @@ -47,6 +62,7 @@ public static void run(Config config) throws Throwable { Log.info("JVM version: " + System.getProperty("java.version")); Log.info("Agent enabled: " + Agent.isEnabled()); Log.info("javac hacks: " + isJavacHacksEnabled); + Log.info("Fix classpath: " + config.isFixJava8Classpath()); if (!Files.isDirectory(inputDir)) { Log.info("Nothing to do; not a directory: " + inputDir); diff --git a/retrolambda/src/main/java/net/orfjackal/retrolambda/SystemPropertiesConfig.java b/retrolambda/src/main/java/net/orfjackal/retrolambda/SystemPropertiesConfig.java index 18afb719..9388c268 100644 --- a/retrolambda/src/main/java/net/orfjackal/retrolambda/SystemPropertiesConfig.java +++ b/retrolambda/src/main/java/net/orfjackal/retrolambda/SystemPropertiesConfig.java @@ -132,6 +132,20 @@ public Path getOutputDir() { "length limit. The file must list one file per line with UTF-8 encoding."); } + + // fix Java 8 classpath + + static { + optionalParameterHelp(FIX_JAVA8_CLASSPATH, + "Whether to replace occurrences of classpath entries ending in /classes", + "with entries ending in /classes-java8 if such directory is available.", + "Disabled by default. Enable by setting to \"true\""); + } + + @Override + public boolean isFixJava8Classpath() { + return Boolean.parseBoolean(p.getProperty(FIX_JAVA8_CLASSPATH, "false")); + } @Override public List getClasspath() { String classpath = p.getProperty(CLASSPATH);