diff --git a/pom.xml b/pom.xml
index 57360870..ea7fff8b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.codehaus.gmavenplus
gmavenplus-plugin
maven-plugin
- 5.0.1-SNAPSHOT
+ 5.1.0-SNAPSHOT
UTF-8
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractCompileMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractCompileMojo.java
index fd4e510d..822e1c21 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractCompileMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractCompileMojo.java
@@ -78,8 +78,10 @@ public abstract class AbstractCompileMojo extends AbstractGroovySourcesMojo {
* Using 23 requires Groovy > 4.0.21 or Groovy > 5.0.0-alpha-8.
* Using 24 requires Groovy > 4.0.24 or Groovy > 5.0.0-alpha-11.
* Using 25 requires Groovy > 4.0.27 or Groovy > 5.0.0-alpha-13.
+ * If unset, this uses maven.compiler.release, then maven.compiler.target,
+ * then 1.8.
*/
- @Parameter(property = "maven.compiler.target", defaultValue = "1.8")
+ @Parameter
protected String targetBytecode;
/**
@@ -216,7 +218,7 @@ protected synchronized void doCompile(final Set sources, final List classp
configuration.setParameters(parameters);
configuration.setPreviewFeatures(previewFeatures);
configuration.setSourceEncoding(sourceEncoding);
- configuration.setTargetBytecode(targetBytecode);
+ configuration.setTargetBytecode(resolveTargetBytecode(targetBytecode));
Toolchain toolchain = toolchainManager.getToolchainFromBuildContext("jdk", session);
if (toolchain != null) {
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGenerateStubsMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGenerateStubsMojo.java
index 3845b529..5af94fcd 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGenerateStubsMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGenerateStubsMojo.java
@@ -74,10 +74,12 @@ public abstract class AbstractGenerateStubsMojo extends AbstractGroovyStubSource
* Using 23 requires Groovy > 4.0.21 or Groovy > 5.0.0-alpha-8.
* Using 24 requires Groovy > 4.0.24 or Groovy > 5.0.0-alpha-11.
* Using 25 requires Groovy > 4.0.27 or Groovy > 5.0.0-alpha-13.
+ * If unset, this uses maven.compiler.release, then maven.compiler.target,
+ * then 1.8.
*
* @since 1.0-beta-3
*/
- @Parameter(property = "maven.compiler.target", defaultValue = "1.8")
+ @Parameter
protected String targetBytecode;
/**
@@ -174,7 +176,7 @@ protected synchronized void doStubGeneration(final Set stubSources, final
configuration.setWarningLevel(warningLevel);
configuration.setTolerance(tolerance);
configuration.setSourceEncoding(sourceEncoding);
- configuration.setTargetBytecode(targetBytecode);
+ configuration.setTargetBytecode(resolveTargetBytecode(targetBytecode));
org.apache.maven.toolchain.Toolchain toolchain = toolchainManager.getToolchainFromBuildContext("jdk", session);
if (toolchain != null) {
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojo.java
index 9b8a01e3..fdf1638d 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojo.java
@@ -10,10 +10,12 @@
import org.codehaus.gmavenplus.model.IncludeClasspath;
import org.codehaus.gmavenplus.model.internal.Version;
import org.codehaus.gmavenplus.util.ClassWrangler;
+import org.codehaus.gmavenplus.util.GroovyCompiler;
import java.io.File;
import java.net.MalformedURLException;
import java.util.List;
+import java.util.Properties;
import static java.util.Collections.emptyList;
@@ -35,6 +37,12 @@ public abstract class AbstractGroovyMojo extends AbstractMojo {
*/
protected static final String JAVA_SOURCES_PATTERN = "**" + File.separator + "*.java";
+ protected static final String DEFAULT_TARGET_BYTECODE = "1.8";
+
+ private static final String MAVEN_COMPILER_RELEASE = "maven.compiler.release";
+
+ private static final String MAVEN_COMPILER_TARGET = "maven.compiler.target";
+
/**
* Java 1.7 version.
*/
@@ -218,6 +226,41 @@ protected boolean isGroovyIndy() {
return classWrangler.isGroovyIndy();
}
+ protected static String resolveTargetBytecode(String targetBytecode, String release, String compilerTarget) {
+ if (!isBlank(targetBytecode)) {
+ return targetBytecode;
+ } else if (!isBlank(release)) {
+ return GroovyCompiler.translateJavacTargetToTargetBytecode(release);
+ } else if (!isBlank(compilerTarget)) {
+ return GroovyCompiler.translateJavacTargetToTargetBytecode(compilerTarget);
+ }
+ return DEFAULT_TARGET_BYTECODE;
+ }
+
+ protected String resolveTargetBytecode(String targetBytecode) {
+ return resolveTargetBytecode(targetBytecode, getMavenProperty(MAVEN_COMPILER_RELEASE), getMavenProperty(MAVEN_COMPILER_TARGET));
+ }
+
+ private String getMavenProperty(String propertyName) {
+ String propertyValue = getProperty(session != null ? session.getUserProperties() : null, propertyName);
+ if (!isBlank(propertyValue)) {
+ return propertyValue;
+ }
+ propertyValue = getProperty(session != null ? session.getSystemProperties() : null, propertyName);
+ if (!isBlank(propertyValue)) {
+ return propertyValue;
+ }
+ return getProperty(project != null ? project.getProperties() : null, propertyName);
+ }
+
+ private static String getProperty(Properties properties, String propertyName) {
+ return properties != null ? properties.getProperty(propertyName) : null;
+ }
+
+ private static boolean isBlank(String value) {
+ return value == null || value.trim().isEmpty();
+ }
+
/**
* Instantiate a ClassWrangler.
*
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojoTest.java
index df553dff..1fad53d0 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojoTest.java
@@ -1,14 +1,20 @@
package org.codehaus.gmavenplus.mojo;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.project.MavenProject;
import org.codehaus.gmavenplus.model.internal.Version;
import org.junit.Before;
import org.junit.Test;
+import java.lang.reflect.Field;
+import java.util.Properties;
+
import static org.junit.Assert.*;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
-
/**
* Unit tests for the AbstractGroovyMojo class.
*
@@ -52,6 +58,108 @@ public void testIsJavaSupportPreviewFeaturesNo() {
assertFalse(testMojo.isJavaSupportPreviewFeatures());
}
+ @Test
+ public void testTargetBytecodeWinsOverRelease() {
+ assertEquals("11", TestGroovyMojo.resolveTargetBytecode("11", "17", "21"));
+ }
+
+ @Test
+ public void testReleaseIsUsedWhenTargetBytecodeIsUnset() {
+ assertEquals("17", TestGroovyMojo.resolveTargetBytecode(null, "17", "21"));
+ }
+
+ @Test
+ public void testReleaseWinsOverMavenCompilerTarget() {
+ assertEquals("17", TestGroovyMojo.resolveTargetBytecode(null, "17", "11"));
+ }
+
+ @Test
+ public void testMavenCompilerTargetIsUsedWhenTargetBytecodeAndReleaseAreUnset() {
+ assertEquals("11", TestGroovyMojo.resolveTargetBytecode(null, null, "11"));
+ }
+
+ @Test
+ public void testReleaseIsTranslatedFromJavacTargetFormat() {
+ assertEquals("1.8", TestGroovyMojo.resolveTargetBytecode(null, "8", null));
+ }
+
+ @Test
+ public void testMavenCompilerTargetIsTranslatedFromJavacTargetFormat() {
+ assertEquals("1.8", TestGroovyMojo.resolveTargetBytecode(null, null, "8"));
+ }
+
+ @Test
+ public void testDefaultTargetBytecodeIsUsedWhenTargetBytecodeAndReleaseAreUnset() {
+ assertEquals("1.8", TestGroovyMojo.resolveTargetBytecode(null, null, null));
+ }
+
+ @Test
+ public void testBlankTargetBytecodeFallsBackToRelease() {
+ assertEquals("17", TestGroovyMojo.resolveTargetBytecode(" ", "17", "21"));
+ }
+
+ @Test
+ public void testMavenCompilerPropertiesAreNotExposedAsMojoParameters() {
+ assertFalse(isMojoParameter(AbstractCompileMojo.class, "release"));
+ assertFalse(isMojoParameter(AbstractCompileMojo.class, "compilerRelease"));
+ assertFalse(isMojoParameter(AbstractCompileMojo.class, "compilerTarget"));
+ assertFalse(isMojoParameter(AbstractGenerateStubsMojo.class, "release"));
+ assertFalse(isMojoParameter(AbstractGenerateStubsMojo.class, "compilerRelease"));
+ assertFalse(isMojoParameter(AbstractGenerateStubsMojo.class, "compilerTarget"));
+ }
+
+ @Test
+ public void testResolveTargetBytecodeUsesMavenProperties() {
+ Properties projectProperties = new Properties();
+ projectProperties.setProperty("maven.compiler.release", "17");
+ projectProperties.setProperty("maven.compiler.target", "11");
+ testMojo.project = mock(MavenProject.class);
+ doReturn(projectProperties).when(testMojo.project).getProperties();
+
+ assertEquals("17", testMojo.resolveTargetBytecode(null));
+ }
+
+ @Test
+ public void testResolveTargetBytecodeUsesUserPropertyBeforeSystemAndProjectProperties() {
+ Properties userProperties = new Properties();
+ userProperties.setProperty("maven.compiler.release", "23");
+ Properties systemProperties = new Properties();
+ systemProperties.setProperty("maven.compiler.release", "21");
+ Properties projectProperties = new Properties();
+ projectProperties.setProperty("maven.compiler.release", "17");
+ testMojo.session = mock(MavenSession.class);
+ doReturn(userProperties).when(testMojo.session).getUserProperties();
+ doReturn(systemProperties).when(testMojo.session).getSystemProperties();
+ testMojo.project = mock(MavenProject.class);
+ doReturn(projectProperties).when(testMojo.project).getProperties();
+
+ assertEquals("23", testMojo.resolveTargetBytecode(null));
+ }
+
+ @Test
+ public void testResolveTargetBytecodeUsesSystemPropertyBeforeProjectProperty() {
+ Properties systemProperties = new Properties();
+ systemProperties.setProperty("maven.compiler.release", "21");
+ Properties projectProperties = new Properties();
+ projectProperties.setProperty("maven.compiler.release", "17");
+ testMojo.session = mock(MavenSession.class);
+ doReturn(new Properties()).when(testMojo.session).getUserProperties();
+ doReturn(systemProperties).when(testMojo.session).getSystemProperties();
+ testMojo.project = mock(MavenProject.class);
+ doReturn(projectProperties).when(testMojo.project).getProperties();
+
+ assertEquals("21", testMojo.resolveTargetBytecode(null));
+ }
+
+ private static boolean isMojoParameter(Class> mojoClass, String fieldName) {
+ try {
+ Field field = mojoClass.getDeclaredField(fieldName);
+ return field.isAnnotationPresent(Parameter.class);
+ } catch (NoSuchFieldException e) {
+ return false;
+ }
+ }
+
public static class TestGroovyMojo extends AbstractGroovyMojo {
@Override
public void execute() {
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/CompileMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/CompileMojoTest.java
index 8a1094f7..52a77a15 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/CompileMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/CompileMojoTest.java
@@ -5,16 +5,22 @@
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.shared.model.fileset.FileSet;
+import org.apache.maven.toolchain.ToolchainManager;
+import org.codehaus.gmavenplus.model.GroovyCompileConfiguration;
import org.codehaus.gmavenplus.model.internal.Version;
import org.codehaus.gmavenplus.util.ClassWrangler;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.ArgumentCaptor;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
+import java.util.Collections;
+import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;
@@ -44,6 +50,7 @@ public void setup() {
doReturn(true).when(compileMojo).groovyVersionSupportsAction();
compileMojo.classWrangler = mock(ClassWrangler.class);
doReturn(new Version(1, 5, 0)).when(compileMojo.classWrangler).getGroovyVersion();
+ compileMojo.toolchainManager = mock(ToolchainManager.class);
}
@Test
@@ -105,4 +112,21 @@ public void testGroovyVersionSupportsActionFalse() {
assertFalse(compileMojo.groovyVersionSupportsAction());
}
+ @Test
+ public void testReleaseWinsOverCompilerTargetWhenSettingCompileTargetBytecode() throws Exception {
+ Set sources = new TreeSet<>();
+ sources.add(mock(File.class));
+ Properties properties = new Properties();
+ properties.setProperty("maven.compiler.release", "17");
+ properties.setProperty("maven.compiler.target", "11");
+ doReturn(properties).when(compileMojo.project).getProperties();
+ doNothing().when(compileMojo).performInProcessCompilation(any(GroovyCompileConfiguration.class), anyList());
+
+ compileMojo.doCompile(sources, Collections.emptyList(), mock(File.class));
+
+ ArgumentCaptor configurationCaptor = ArgumentCaptor.forClass(GroovyCompileConfiguration.class);
+ verify(compileMojo).performInProcessCompilation(configurationCaptor.capture(), anyList());
+ Assert.assertEquals("17", configurationCaptor.getValue().getTargetBytecode());
+ }
+
}
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/GenerateStubsMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/GenerateStubsMojoTest.java
index 5566b92f..fab60c0c 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/GenerateStubsMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/GenerateStubsMojoTest.java
@@ -5,16 +5,23 @@
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.shared.model.fileset.FileSet;
+import org.apache.maven.toolchain.ToolchainManager;
+import org.codehaus.gmavenplus.model.GroovyStubConfiguration;
import org.codehaus.gmavenplus.model.internal.Version;
import org.codehaus.gmavenplus.util.ClassWrangler;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
+import org.mockito.ArgumentCaptor;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
+import java.util.Collections;
+import java.util.Properties;
+import java.util.Set;
import java.util.TreeSet;
import static org.junit.Assert.assertFalse;
@@ -41,6 +48,7 @@ public void setup() {
doReturn(mock(Build.class)).when(generateStubsMojo.project).getBuild();
generateStubsMojo.classWrangler = mock(ClassWrangler.class);
doReturn(new Version(1, 8, 2)).when(generateStubsMojo.classWrangler).getGroovyVersion();
+ generateStubsMojo.toolchainManager = mock(ToolchainManager.class);
}
@Test
@@ -104,4 +112,21 @@ public void testGroovyVersionSupportsActionFalse() {
assertFalse(generateStubsMojo.groovyVersionSupportsAction());
}
+ @Test
+ public void testReleaseWinsOverCompilerTargetWhenSettingStubTargetBytecode() throws Exception {
+ Set sources = new TreeSet<>();
+ sources.add(mock(File.class));
+ Properties properties = new Properties();
+ properties.setProperty("maven.compiler.release", "17");
+ properties.setProperty("maven.compiler.target", "11");
+ doReturn(properties).when(generateStubsMojo.project).getProperties();
+ doNothing().when(generateStubsMojo).performInProcessStubGeneration(any(GroovyStubConfiguration.class), anyList());
+
+ generateStubsMojo.doStubGeneration(sources, Collections.emptyList(), mock(File.class));
+
+ ArgumentCaptor configurationCaptor = ArgumentCaptor.forClass(GroovyStubConfiguration.class);
+ verify(generateStubsMojo).performInProcessStubGeneration(configurationCaptor.capture(), anyList());
+ Assert.assertEquals("17", configurationCaptor.getValue().getTargetBytecode());
+ }
+
}