Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8305888

Imports and fully qualified Names behave differently for Annotation Processing

XMLWordPrintable

    • generic
    • generic

      ADDITIONAL SYSTEM INFORMATION :
      Tested under Linux and Windows using multiple Java Releases.
      Linux codespaces-3d7cb7 5.4.0-1105-azure #111~18.04.1-Ubuntu SMP Fri Mar 3 22:47:43 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
      Windows 10 Enterprise Edition

      Tested JDKS 17(Temurin, Coretto and Microsoft), 20, 21-ea (see below)


      The script test-jdks.sh (see Repository below) produces the following Informations with each JDK:

      With Import
          BEGIN Thu Apr 6 09:09:25 UTC 2023
          - - - - - -
          openjdk version "17.0.6" 2023-01-17 LTS
          OpenJDK Runtime Environment Microsoft-7209853 (build 17.0.6+10-LTS)
          OpenJDK 64-Bit Server VM Microsoft-7209853 (build 17.0.6+10-LTS, mixed mode, sharing)
          javac 17.0.6
          src/main/java/module-info.java:2: error: cannot find symbol
          import org.example.bug.BugModule;
                                ^
            symbol: class BugModule
            location: package org.example.bug
          1 error
          - - - - - -
          java version "20" 2023-03-21
          Java(TM) SE Runtime Environment (build 20+36-2344)
          Java HotSpot(TM) 64-Bit Server VM (build 20+36-2344, mixed mode, sharing)
          javac 20
          src/main/java/module-info.java:2: error: cannot find symbol
          import org.example.bug.BugModule;
                                ^
            symbol: class BugModule
            location: package org.example.bug
          1 error
          - - - - - -
          openjdk version "21-ea" 2023-09-19
          OpenJDK Runtime Environment (build 21-ea+16-1326)
          OpenJDK 64-Bit Server VM (build 21-ea+16-1326, mixed mode, sharing)
          javac 21-ea
          src/main/java/module-info.java:2: error: cannot find symbol
          import org.example.bug.BugModule;
                                ^
            symbol: class BugModule
            location: package org.example.bug
          1 error
          - - - - - -
          END Thu Apr 6 09:09:30 UTC 2023

      Without:
          BEGIN Thu Apr 6 09:12:19 UTC 2023
          - - - - - -
          openjdk version "17.0.6" 2023-01-17 LTS
          OpenJDK Runtime Environment Microsoft-7209853 (build 17.0.6+10-LTS)
          OpenJDK 64-Bit Server VM Microsoft-7209853 (build 17.0.6+10-LTS, mixed mode, sharing)
          javac 17.0.6
          java.base@17.0.6
          java.compiler@17.0.6
          java.datatransfer@17.0.6
          java.desktop@17.0.6
          java.instrument@17.0.6
          java.logging@17.0.6
          java.management@17.0.6
          java.management.rmi@17.0.6
          java.naming@17.0.6
          java.net.http@17.0.6
          java.prefs@17.0.6
          java.rmi@17.0.6
          java.scripting@17.0.6
          java.se@17.0.6
          java.security.jgss@17.0.6
          java.security.sasl@17.0.6
          java.smartcardio@17.0.6
          java.sql@17.0.6
          java.sql.rowset@17.0.6
          java.transaction.xa@17.0.6
          java.xml@17.0.6
          java.xml.crypto@17.0.6
          jdk.accessibility@17.0.6
          jdk.attach@17.0.6
          jdk.charsets@17.0.6
          jdk.compiler@17.0.6
          jdk.crypto.cryptoki@17.0.6
          jdk.crypto.ec@17.0.6
          jdk.dynalink@17.0.6
          jdk.editpad@17.0.6
          jdk.hotspot.agent@17.0.6
          jdk.httpserver@17.0.6
          jdk.incubator.foreign@17.0.6
          jdk.incubator.vector@17.0.6
          jdk.internal.ed@17.0.6
          jdk.internal.jvmstat@17.0.6
          jdk.internal.le@17.0.6
          jdk.internal.opt@17.0.6
          jdk.internal.vm.ci@17.0.6
          jdk.internal.vm.compiler@17.0.6
          jdk.internal.vm.compiler.management@17.0.6
          jdk.jartool@17.0.6
          jdk.javadoc@17.0.6
          jdk.jcmd@17.0.6
          jdk.jconsole@17.0.6
          jdk.jdeps@17.0.6
          jdk.jdi@17.0.6
          jdk.jdwp.agent@17.0.6
          jdk.jfr@17.0.6
          jdk.jlink@17.0.6
          jdk.jpackage@17.0.6
          jdk.jshell@17.0.6
          jdk.jsobject@17.0.6
          jdk.jstatd@17.0.6
          jdk.localedata@17.0.6
          jdk.management@17.0.6
          jdk.management.agent@17.0.6
          jdk.management.jfr@17.0.6
          jdk.naming.dns@17.0.6
          jdk.naming.rmi@17.0.6
          jdk.net@17.0.6
          jdk.nio.mapmode@17.0.6
          jdk.random@17.0.6
          jdk.sctp@17.0.6
          jdk.security.auth@17.0.6
          jdk.security.jgss@17.0.6
          jdk.unsupported@17.0.6
          jdk.unsupported.desktop@17.0.6
          jdk.xml.dom@17.0.6
          jdk.zipfs@17.0.6
          bug file:///workspaces/mre-avaje-inject-1/target_manual/
          io.avaje.applog@1.0 file:///home/codespace/.m2/repository/io/avaje/avaje-applog/1.0/avaje-applog-1.0.jar
          io.avaje.inject@9.0 file:///home/codespace/.m2/repository/io/avaje/avaje-inject/9.0/avaje-inject-9.0.jar
          io.avaje.lang@1.1 file:///home/codespace/.m2/repository/io/avaje/avaje-lang/1.1/avaje-lang-1.1.jar
          jakarta.inject@2.0.1 file:///home/codespace/.m2/repository/jakarta/inject/jakarta.inject-api/2.0.1/jakarta.inject-api-2.0.1.jar
          Apr 06, 2023 9:12:21 AM io.avaje.inject.spi.DBeanScope start
          INFO: Wired beans in 19ms
          org.example.bug.TestFactory@6438a396
          - - - - - -
          java version "20" 2023-03-21
          Java(TM) SE Runtime Environment (build 20+36-2344)
          Java HotSpot(TM) 64-Bit Server VM (build 20+36-2344, mixed mode, sharing)
          javac 20
          java.base@20
          java.compiler@20
          java.datatransfer@20
          java.desktop@20
          java.instrument@20
          java.logging@20
          java.management@20
          java.management.rmi@20
          java.naming@20
          java.net.http@20
          java.prefs@20
          java.rmi@20
          java.scripting@20
          java.se@20
          java.security.jgss@20
          java.security.sasl@20
          java.smartcardio@20
          java.sql@20
          java.sql.rowset@20
          java.transaction.xa@20
          java.xml@20
          java.xml.crypto@20
          jdk.accessibility@20
          jdk.attach@20
          jdk.charsets@20
          jdk.compiler@20
          jdk.crypto.cryptoki@20
          jdk.crypto.ec@20
          jdk.dynalink@20
          jdk.editpad@20
          jdk.hotspot.agent@20
          jdk.httpserver@20
          jdk.incubator.concurrent@20
          jdk.incubator.vector@20
          jdk.internal.ed@20
          jdk.internal.jvmstat@20
          jdk.internal.le@20
          jdk.internal.opt@20
          jdk.internal.vm.ci@20
          jdk.internal.vm.compiler@20
          jdk.internal.vm.compiler.management@20
          jdk.jartool@20
          jdk.javadoc@20
          jdk.jcmd@20
          jdk.jconsole@20
          jdk.jdeps@20
          jdk.jdi@20
          jdk.jdwp.agent@20
          jdk.jfr@20
          jdk.jlink@20
          jdk.jpackage@20
          jdk.jshell@20
          jdk.jsobject@20
          jdk.jstatd@20
          jdk.localedata@20
          jdk.management@20
          jdk.management.agent@20
          jdk.management.jfr@20
          jdk.naming.dns@20
          jdk.naming.rmi@20
          jdk.net@20
          jdk.nio.mapmode@20
          jdk.random@20
          jdk.sctp@20
          jdk.security.auth@20
          jdk.security.jgss@20
          jdk.unsupported@20
          jdk.unsupported.desktop@20
          jdk.xml.dom@20
          jdk.zipfs@20
          bug file:///workspaces/mre-avaje-inject-1/target_manual/
          io.avaje.applog@1.0 file:///home/codespace/.m2/repository/io/avaje/avaje-applog/1.0/avaje-applog-1.0.jar
          io.avaje.inject@9.0 file:///home/codespace/.m2/repository/io/avaje/avaje-inject/9.0/avaje-inject-9.0.jar
          io.avaje.lang@1.1 file:///home/codespace/.m2/repository/io/avaje/avaje-lang/1.1/avaje-lang-1.1.jar
          jakarta.inject@2.0.1 file:///home/codespace/.m2/repository/jakarta/inject/jakarta.inject-api/2.0.1/jakarta.inject-api-2.0.1.jar
          Apr 06, 2023 9:12:23 AM io.avaje.inject.spi.DBeanScope start
          INFO: Wired beans in 16ms
          org.example.bug.TestFactory@61e4705b
          - - - - - -
          openjdk version "21-ea" 2023-09-19
          OpenJDK Runtime Environment (build 21-ea+16-1326)
          OpenJDK 64-Bit Server VM (build 21-ea+16-1326, mixed mode, sharing)
          javac 21-ea
          java.base@21-ea
          java.compiler@21-ea
          java.datatransfer@21-ea
          java.desktop@21-ea
          java.instrument@21-ea
          java.logging@21-ea
          java.management@21-ea
          java.management.rmi@21-ea
          java.naming@21-ea
          java.net.http@21-ea
          java.prefs@21-ea
          java.rmi@21-ea
          java.scripting@21-ea
          java.se@21-ea
          java.security.jgss@21-ea
          java.security.sasl@21-ea
          java.smartcardio@21-ea
          java.sql@21-ea
          java.sql.rowset@21-ea
          java.transaction.xa@21-ea
          java.xml@21-ea
          java.xml.crypto@21-ea
          jdk.accessibility@21-ea
          jdk.attach@21-ea
          jdk.charsets@21-ea
          jdk.compiler@21-ea
          jdk.crypto.cryptoki@21-ea
          jdk.crypto.ec@21-ea
          jdk.dynalink@21-ea
          jdk.editpad@21-ea
          jdk.hotspot.agent@21-ea
          jdk.httpserver@21-ea
          jdk.incubator.concurrent@21-ea
          jdk.incubator.vector@21-ea
          jdk.internal.ed@21-ea
          jdk.internal.jvmstat@21-ea
          jdk.internal.le@21-ea
          jdk.internal.opt@21-ea
          jdk.internal.vm.ci@21-ea
          jdk.internal.vm.compiler@21-ea
          jdk.internal.vm.compiler.management@21-ea
          jdk.jartool@21-ea
          jdk.javadoc@21-ea
          jdk.jcmd@21-ea
          jdk.jconsole@21-ea
          jdk.jdeps@21-ea
          jdk.jdi@21-ea
          jdk.jdwp.agent@21-ea
          jdk.jfr@21-ea
          jdk.jlink@21-ea
          jdk.jpackage@21-ea
          jdk.jshell@21-ea
          jdk.jsobject@21-ea
          jdk.jstatd@21-ea
          jdk.localedata@21-ea
          jdk.management@21-ea
          jdk.management.agent@21-ea
          jdk.management.jfr@21-ea
          jdk.naming.dns@21-ea
          jdk.naming.rmi@21-ea
          jdk.net@21-ea
          jdk.nio.mapmode@21-ea
          jdk.random@21-ea
          jdk.sctp@21-ea
          jdk.security.auth@21-ea
          jdk.security.jgss@21-ea
          jdk.unsupported@21-ea
          jdk.unsupported.desktop@21-ea
          jdk.xml.dom@21-ea
          jdk.zipfs@21-ea
          bug file:///workspaces/mre-avaje-inject-1/target_manual/
          io.avaje.applog@1.0 file:///home/codespace/.m2/repository/io/avaje/avaje-applog/1.0/avaje-applog-1.0.jar
          io.avaje.inject@9.0 file:///home/codespace/.m2/repository/io/avaje/avaje-inject/9.0/avaje-inject-9.0.jar
          io.avaje.lang@1.1 file:///home/codespace/.m2/repository/io/avaje/avaje-lang/1.1/avaje-lang-1.1.jar
          jakarta.inject@2.0.1 file:///home/codespace/.m2/repository/jakarta/inject/jakarta.inject-api/2.0.1/jakarta.inject-api-2.0.1.jar
          Apr 06, 2023 9:12:25 AM io.avaje.inject.spi.DBeanScope start
          INFO: Wired beans in 16ms
          org.example.bug.TestFactory@5e8c92f4
          - - - - - -
          END Thu Apr 6 09:12:25 UTC 2023


      A DESCRIPTION OF THE PROBLEM :
      The issue occurs in module-info files in combination with Avaje-Inject.
      Avaje-Inject generates Dependency Injection through Annotation Processing.
      For this to work ServiceLoaders are used. In conjunction with JPMS the generated Implementation has to
      be provided in the module-info. All of which seem to be well within the Specification and do work when using one of the workarounds discovered.

      The issue only exists under the following conditions:
      1. JPMS is used
      2. The generated Module is imported instead of qualified fully

      Once all conditions are met a compilation will fail initially, but the Source File will be generated by javac.
      After that compilation suceeds regardless, because the Type can be resolved.

      Workarounds include:
      1. Fully qualify Modules instead of importing them
      2. Run the compilation step twice

      The only similar, but different issued found were JDK-8236319 and JDK-8235458.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Source Code for the Project is provided here:
      https://github.com/NoonRightsWarriorBehindHovering/mre-avaje-inject-1

      Using Maven and Javac allows to reproduce the issue easily.
      Assuming Java is installed and jdk-20 and jdk-21 has been downloaded.
      Maven allows automatic download of all dependencies (mvn compile, which fails), alternatively the dependencies can be downloaded from maven central and put into the locations specified in javac.sh.

      By default the compilation fails.
      Using the following comand:

      sed '/import org.example.bug.BugModule;/d' src/main/java/module-info.java | sed 's/provides Module with BugModule/provides Module with org.example.bug.BugModule/' | tee src/main/java/module-info.java

      Allows to update the sources to use the fully qualified name, which makes compilation work.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Both Maven(which uses javac internally afaik) and javac compile whether a given Module has been imported or qualified.
      ACTUAL -
      Compilation Errors
          src/main/java/module-info.java:2: error: cannot find symbol
          import org.example.bug.BugModule;
                                ^
            symbol: class BugModule
            location: package org.example.bug
          1 error


      ---------- BEGIN SOURCE ----------
      See https://github.com/NoonRightsWarriorBehindHovering/mre-avaje-inject-1

      Output should have been:
          Apr 06, 2023 9:12:25 AM io.avaje.inject.spi.DBeanScope start
          INFO: Wired beans in 16ms
          org.example.bug.TestFactory@5e8c92f4

      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      See above

      FREQUENCY : always


            jlahoda Jan Lahoda
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated: