8

Does anyone know which compiler/plugin compiles java and groovy code with the java 11 version?

I've tried GMavenPlus, Groovy eclipse compiler, and Maven’s Ant plugin. So far without success.

sepp2k
  • 363,768
  • 54
  • 674
  • 675
Petronella
  • 2,327
  • 1
  • 15
  • 24
  • 1
    Assuming you are running a set, that does not work? – cfrick Dec 17 '18 at 14:40
  • I'm running an application with java and groovy code. If I exclude the groovy code, I can compile with maven compiler 3.8.0, java 11. Adding the groovy ...it's another story, as mentioned. – Petronella Dec 17 '18 at 15:48
  • I need to play with the various options a bit more but I know that we have had some success with Micronaut. You can create a Microservices app using Groovy as your language and Maven as your build environment (it has polyglot support) and that works with some known limitations for edge cases. There is work being done for a better experience in particular working better with Spock but that will likely appear in future releases. I am not suggesting that your scenario necessarily involves microservices but the generated builds may prove useful to look at. – Paul King Dec 18 '18 at 08:14

4 Answers4

14

In the end this worked:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <source>11</source>
        <target>11</target>
        <release>11</release>
    </configuration>
</plugin>

<plugin>
    <groupId>org.codehaus.gmavenplus</groupId>
    <artifactId>gmavenplus-plugin</artifactId>
    <version>1.6.2</version>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>compileTests</goal>
            </goals>
        </execution>
    </executions>
</plugin>

groovy.version: 2.4.12

ernest_k
  • 44,416
  • 5
  • 53
  • 99
Petronella
  • 2,327
  • 1
  • 15
  • 24
4

Here is a typical POM for the groovy-eclipse-compiler adapter:

<project
 xmlns="http://maven.apache.org/POM/4.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                     http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <artifactId>proj-name</artifactId>
  <groupId>org.whatever</groupId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <maven.compiler.fork>true</maven.compiler.fork>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <project.build.sourceEncoding>US-ASCII</project.build.sourceEncoding>
  </properties>

  <pluginRepositories>
    <pluginRepository>
      <id>bintray</id>
      <name>Groovy Bintray</name>
      <url>https://dl.bintray.com/groovy/maven</url>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </pluginRepository>
  </pluginRepositories>

  <dependencies>
    <dependency>
      <groupId>org.codehaus.groovy</groupId>
      <artifactId>groovy</artifactId>
      <version>2.5.5</version>
      <classifier>indy</classifier>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
          <compilerId>groovy-eclipse-compiler</compilerId>
          <compilerArguments>
            <indy/>
          </compilerArguments>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-eclipse-compiler</artifactId>
            <version>3.0.0-01</version>
          </dependency>
          <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-eclipse-batch</artifactId>
            <version>2.5.5-01</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>

</project>

It assumes you have src/main/groovy, src/main/java, src/test/groovy and src/test/java. It is possible to have other source folder configurations with some additional XML. More details here: https://github.com/groovy/groovy-eclipse/wiki/Groovy-Eclipse-Maven-plugin

emilles
  • 1,104
  • 7
  • 14
2

There is a sample gradle project in GitHub that compiles Java and Groovy and uses Java from Groovy and viceversa. With a little changes you can make it work in Java 11. Basically use this build.gradle:

group 'de.jonashavers'
version '1.0.0'

apply plugin: 'groovy'

sourceSets {
    main {
        java { srcDirs = [] }
        groovy { srcDirs << ['src/main/java'] }
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.5.7'
    compile 'javax.xml.bind:jaxb-api:2.3.0'
    compile 'com.sun.xml.bind:jaxb-core:2.3.0.1'
    compile 'com.sun.xml.bind:jaxb-impl:2.3.0.1'
    compile 'javax.activation:activation:1.1.1'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

This must be the file structure:

enter image description here

The Groovy class:

package de.jonashavers.groovierjavacompilation

class PlainGroovy {
    String language = 'groovy'

    static void main(String[] args) {
        String lang = "Groovy"
        println(lang)
    }
}

The Java Class:

package de.jonashavers.groovierjavacompilation;

class JavaExtendingGroovy extends PlainGroovy {
}

And the tests:

Java:

package de.jonashavers.groovierjavacompilation;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class JavaTest {

    @Test
    public void testAccessToGroovy() {
        PlainGroovy plainGroovy = new PlainGroovy();
        assertEquals("groovy", plainGroovy.getLanguage());
    }

    @Test
    public void testAccessToGroovyFromJava() {
        JavaExtendingGroovy groovyFromJava = new JavaExtendingGroovy();
        assertEquals("groovy", groovyFromJava.getLanguage());
    }
}

Groovy:

package de.jonashavers.groovierjavacompilation

class GroovyTest extends GroovyTestCase {

    void testAccessToGroovy() {
        PlainGroovy plainGroovy = new PlainGroovy()
        assertEquals 'groovy', plainGroovy.language
    }

    void testAccessToGroovyFromJava() {
        JavaExtendingGroovy groovyFromJava = new JavaExtendingGroovy()
        assertEquals 'groovy', groovyFromJava.language
    }
}

I forked the project and followed the directions in this link to make it work. Here is the fork that works in Java11, the java11 branch. Hope this helps:

Victor M Perez
  • 2,185
  • 3
  • 19
  • 22
  • Can you give an example comprising of compiling just groovy sources with a `module-info.java` which exports some of the packages? Please and thank you! – smac89 Jul 12 '19 at 18:51
0

upgrading groovy to version 3.0.15 and maven-compiler-plugin to version 3.10.1 solved the issue for me:

<plugin>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>3.10.1</version>
   <configuration>
   <release>${maven.compiler.release}</release>
   </configuration>
</plugin>

where ${maven.compiler.release} = your java version

tonnoz
  • 454
  • 4
  • 12