Search code examples
javamavenjava-9java-platform-module-systemimmutables-library

Immutables don't generate code with java 9 with modules


Using immutables-library works fine with java 9 until I add a module-info.java to the project, Immutables*.java will no longer be generated.

To the module-info I add 'requires value' as suggested by IntelliJ.

What am I missing, is it a immutables-library issue or something else I need to set up in order for javac to find the annotation processing.

I am using maven with the maven-compiler-plugin:3.7.0configured for target/source = 9.


Solution

  • The problem you have is that you haven't configured the Immutable part as a annotation processor which should be done like this:

    <?xml version="1.0" encoding="UTF-8"?>
    <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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>example</groupId>
        <artifactId>jigsaw</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>org.immutables</groupId>
                <artifactId>value</artifactId>
                <version>2.5.6</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    
        <build>
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.7.0</version>
              <configuration>
                <source>9</source>
                <target>9</target>
                <annotationProcessorPaths>
                  <dependency>
                      <groupId>org.immutables</groupId>
                      <artifactId>value</artifactId>
                      <version>2.5.6</version>
                  </dependency>
                </annotationProcessorPaths>
              </configuration>
            </plugin>
          </plugins>
        </build>
    </project>
    

    Apart from hints about encoding which simply can be fixed by defining the encoding like this:

    <?xml version="1.0" encoding="UTF-8"?>
    <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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>example</groupId>
        <artifactId>jigsaw</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.immutables</groupId>
                <artifactId>value</artifactId>
                <version>2.5.6</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    
        <build>
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.7.0</version>
              <configuration>
                <source>9</source>
                <target>9</target>
                <annotationProcessorPaths>
                  <dependency>
                      <groupId>org.immutables</groupId>
                      <artifactId>value</artifactId>
                      <version>2.5.6</version>
                  </dependency>
                </annotationProcessorPaths>
              </configuration>
            </plugin>
          </plugins>
        </build>
    </project>
    

    If you build via the above configuration you will get all the things you need:

    .
    ├── pom.xml
    ├── src
    │   └── main
    │       └── java
    │           ├── example
    │           │   └── Some.java
    │           └── module-info.java
    └── target
        ├── classes
        │   ├── example
        │   │   ├── ImmutableSome$1.class
        │   │   ├── ImmutableSome$Builder.class
        │   │   ├── ImmutableSome.class
        │   │   └── Some.class
        │   └── module-info.class
        ├── generated-sources
        │   └── annotations
        │       └── example
        │           └── ImmutableSome.java
        ├── jigsaw-1.0-SNAPSHOT.jar
        ├── maven-archiver
        │   └── pom.properties
        └── maven-status
            └── maven-compiler-plugin
                └── compile
                    └── default-compile
                        ├── createdFiles.lst
                        └── inputFiles.lst