java9-modularity / gradle-modules-plugin

This Gradle plugin helps working with the Java Platform Module System
https://javamodularity.com/
MIT License
233 stars 36 forks source link

Dependent project can't find module-info #125

Open aalmiray opened 4 years ago

aalmiray commented 4 years ago

Encountered this particular problem when attempting to solve https://github.com/controlsfx/controlsfx/issues/1195#issuecomment-549027925

The Ikonli project currently provides Java11 only support in its artifacts. All artifacts have a corresponding module-info.java file. Adding modularity.MixedRelease = 8 to certain projects causes the build to fail with

> Task :ikonli-dashicons-pack:compileModuleInfoJava FAILED
/Users/aalmiray/dev/github/ikonli/icon-packs/ikonli-dashicons-pack/src/main/java/module-info.java:19: error: module not found: org.kordamp.iconli.core
    requires org.kordamp.iconli.core;
                               ^
1 error

The multi-release branch contains the failing setup. Please see https://github.com/aalmiray/ikonli/blob/multi-release/build.gradle

The compileJavaSettings task from the Kordamp Plugin Suite shows the following settings for :ikonli-dashicons-pack:compileJava

    $ gw :ikonli-dashicons-pack:compileJavaSettings --task=compileJava --show-paths
> Task :ikonli-dashicons-pack:compileJavaSettings
compileJava:
    excludes:
        module-info.java
    sourceCompatibility: 11
    targetCompatibility: 11
    options:
        compilerArgs:
            --release
            8
        debug: true
        debugOptions:
        deprecation: false
        failOnError: true
        fork: false
        forkOptions:
        incremental: true
        listFiles: false
        verbose: false
        warnings: true
    annotationProcessorPath:
        /Users/aalmiray/.gradle/caches/modules-2/files-2.1/org.kordamp.jipsy/jipsy/0.6.0/d2a24537e77d1573cb0c1b3e18cdde1e3ffcdf68/jipsy-0.6.0.jar
        /Users/aalmiray/.gradle/caches/modules-2/files-2.1/org.kordamp.jipsy/jipsy-annotations/0.6.0/f7875eba05155c0f80433db5c0b09060924c5f17/jipsy-annotations-0.6.0.jar
    classpath:
        /Users/aalmiray/dev/github/ikonli/core/ikonli-core/build/classes/java/main
        /Users/aalmiray/.gradle/caches/modules-2/files-2.1/org.kordamp.jipsy/jipsy/0.6.0/d2a24537e77d1573cb0c1b3e18cdde1e3ffcdf68/jipsy-0.6.0.jar
        /Users/aalmiray/.gradle/caches/modules-2/files-2.1/org.kordamp.jipsy/jipsy-annotations/0.6.0/f7875eba05155c0f80433db5c0b09060924c5f17/jipsy-annotations-0.6.0.jar

Here we can appreciate that the classpath includes a reference to ikonli-core where the org.kordamp.ikonli.core module is located. Inspecting the settings for :ikonli-dashicons-pack:compileModuleInfoJava yields the following

$ gw :ikonli-dashicons-pack:compileJavaSettings --task=compileModuleInfoJava --show-paths
> Task :ikonli-dashicons-pack:compileJavaSettings
compileModuleInfoJava:
    sourceCompatibility: 11
    targetCompatibility: 11
    options:
        compilerArgs:
            --release
            9
        debug: true
        debugOptions:
        deprecation: false
        failOnError: true
        fork: false
        forkOptions:
        incremental: true
        listFiles: false
        verbose: false
        warnings: true
    sourcepath:
        /Users/aalmiray/dev/github/ikonli/icon-packs/ikonli-dashicons-pack/src/main/java

BTW you can get all settings by invoking

$ gw :ikonli-dashicons-pack:javaCompilerSettings --show-paths

Notice that :ikonli-dashicons-pack:compileModuleInfoJava knows nothing of the output from ikonli-core:compileModuleInfoJava which contains the compiled module information. Perhaps this is the cause of the problem?

tlinkowski commented 4 years ago

Thanks for your detailed bug report, Andres!

The issue you report is similar to #107. I hoped I fixed it with #109, but apparently, I haven't (at least not entirely).


I cloned ikonli and tried to build it from multi-release branch. I used --debug flag to see which compileModuleInfoJava dependencies were added by this method: https://github.com/java9-modularity/gradle-modules-plugin/blob/e01508d8f5fe4a59376c9108e2ba8e5b15646a47/src/main/java/org/javamodularity/moduleplugin/internal/CompileModuleInfoHelper.java#L25-L29

I got the following dependencies on :ikonli-core:compileModuleInfoJava:

16:57:19.662 [...] task ':ikonli-ligaturesymbols-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:19.717 [...] task ':ikonli-maki-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:19.805 [...] task ':ikonli-maki2-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:19.875 [...] task ':ikonli-mapicons-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:19.947 [...] task ':ikonli-material-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:20.050 [...] task ':ikonli-materialdesign-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:20.133 [...] task ':ikonli-metrizeicons-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:20.212 [...] task ':ikonli-octicons-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:20.272 [...] task ':ikonli-openiconic-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:20.305 [...] task ':ikonli-paymentfont-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:20.340 [...] task ':ikonli-runestroicons-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:20.373 [...] task ':ikonli-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:20.406 [...] task ':ikonli-themify-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:20.437 [...] task ':ikonli-typicons-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:20.473 [...] task ':ikonli-weathericons-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:20.507 [...] task ':ikonli-websymbols-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:20.540 [...] task ':ikonli-zondicons-pack:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')

and the following dependencies on other tasks:

16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-dashicons-pack:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-devicons-pack:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-entypo-pack:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-elusive-pack:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-feather-pack:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-fontawesome-pack:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-fontawesome5-pack:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-fontelico-pack:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-foundation-pack:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-hawconsfilled-pack:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-hawconsstroke-pack:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-icomoon-pack:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-ionicons-pack:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-ionicons4-pack:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-ligaturesymbols-pack:compileModuleInfoJava')
16:57:20.574 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-maki-pack:compileModuleInfoJava')
16:57:20.575 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-maki2-pack:compileModuleInfoJava')
16:57:20.575 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-mapicons-pack:compileModuleInfoJava')
16:57:20.575 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-material-pack:compileModuleInfoJava')
16:57:20.575 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-materialdesign-pack:compileModuleInfoJava')
16:57:20.575 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-metrizeicons-pack:compileModuleInfoJava')
16:57:20.575 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-octicons-pack:compileModuleInfoJava')
16:57:20.575 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-openiconic-pack:compileModuleInfoJava')
16:57:20.575 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-paymentfont-pack:compileModuleInfoJava')
16:57:20.575 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-runestroicons-pack:compileModuleInfoJava')
16:57:20.575 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-themify-pack:compileModuleInfoJava')
16:57:20.575 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-typicons-pack:compileModuleInfoJava')
16:57:20.575 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-weathericons-pack:compileModuleInfoJava')
16:57:20.575 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-websymbols-pack:compileModuleInfoJava')
16:57:20.575 [...] task ':sampler-javafx:compileJava'.dependsOn(task ':ikonli-zondicons-pack:compileModuleInfoJava')
16:57:20.611 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-core:compileModuleInfoJava')
16:57:20.611 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-swing:compileModuleInfoJava')
16:57:20.611 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-dashicons-pack:compileModuleInfoJava')
16:57:20.611 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-devicons-pack:compileModuleInfoJava')
16:57:20.611 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-elusive-pack:compileModuleInfoJava')
16:57:20.611 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-entypo-pack:compileModuleInfoJava')
16:57:20.611 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-feather-pack:compileModuleInfoJava')
16:57:20.611 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-fontawesome-pack:compileModuleInfoJava')
16:57:20.611 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-fontawesome5-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-fontelico-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-foundation-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-hawconsfilled-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-hawconsstroke-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-icomoon-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-ionicons-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-ionicons4-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-ligaturesymbols-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-maki-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-maki2-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-mapicons-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-material-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-materialdesign-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-metrizeicons-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-octicons-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-openiconic-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-paymentfont-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-runestroicons-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-typicons-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-themify-pack:compileModuleInfoJava')
16:57:20.612 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-weathericons-pack:compileModuleInfoJava')
16:57:20.613 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-websymbols-pack:compileModuleInfoJava')
16:57:20.613 [...] task ':sampler-swing:compileModuleInfoJava'.dependsOn(task ':ikonli-zondicons-pack:compileModuleInfoJava')

Unfortunately, many subprojects (incl. ikonli-dashicons-pack) aren't in the first part, and I honestly don't know why.

As a workaround, I wanted to suggest adding the following lines to build.gradle on line 116:

        if (subproj.name.endsWith('-pack')) {
            subproj.compileModuleInfoJava.dependsOn project(':ikonli-core').compileModuleInfoJava
        }

However, for a reason that escapes me, it still doesn't help (although, to the best of my knowledge, it should). In other words, Gradle still tries to execute :ikonli-dashicons-pack:compileModuleInfoJava before :ikonli-core:compileModuleInfoJava (which obviously can't work).


After some more digging, I discovered something interesting. When I tried to clean the build, and then run :assemble again, I got:

> Task :ikonli-core:compileModuleInfoJava FROM-CACHE

Interestingly, module-info.class indeed is present in ikonli-core/build/module-info/module-info.class (but not in ikonli-core/build/java directory).

To sum up, it's certainly a bug in this plugin, and it seems related to #99, where this module-info directory was related. AFAIU:

Hope it helps (however far from perfect this is, but I'm afraid I won't find resources in any foreseeable future to try and fix this bug).

aalmiray commented 4 years ago

Thanks for the suggestion @tlinkowski. The following snippet allows projects to compile

        subproj.modularity.mixedJavaRelease 8
        subproj.tasks.classes.doLast {
            copy {
                into subproj.sourceSets.main.output.classesDirs.files[0]
                from(subproj.tasks.compileModuleInfoJava.destinationDir) {
                    include 'module-info.class'
                }
            }
        }

However the generated JAR files are wrong as they include duplicate entries

Archive:  ikonli-core-12.0.0-SNAPSHOT.jar
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  11-03-2019 20:42   META-INF/
       25  11-03-2019 20:35   META-INF/MANIFEST.MF
    10174  09-13-2019 17:34   META-INF/LICENSE
        0  11-03-2019 20:42   META-INF/maven/
        0  11-03-2019 20:42   META-INF/maven/org.kordamp.ikonli/
        0  11-03-2019 20:42   META-INF/maven/org.kordamp.ikonli/ikonli-core/
      601  11-03-2019 20:35   META-INF/maven/org.kordamp.ikonli/ikonli-core/pom.xml
      102  11-03-2019 20:35   META-INF/maven/org.kordamp.ikonli/ikonli-core/pom.properties
        0  11-03-2019 20:35   org/
        0  11-03-2019 20:35   org/kordamp/
        0  11-03-2019 20:35   org/kordamp/ikonli/
      180  11-03-2019 20:35   org/kordamp/ikonli/Ikon.class
     1061  11-03-2019 20:35   org/kordamp/ikonli/IkonliIkonResolver.class
     1892  11-03-2019 20:35   org/kordamp/ikonli/Ikonli.class
      608  11-03-2019 20:35   org/kordamp/ikonli/AbstractIkonHandler.class
      391  11-03-2019 20:35   org/kordamp/ikonli/IkonHandler.class
      277  11-03-2019 20:42   module-info.class
        0  11-03-2019 20:35   META-INF/resources/
        0  11-03-2019 20:35   META-INF/resources/ikonli/
        0  11-03-2019 20:35   META-INF/resources/ikonli/0.0.0/
        0  11-03-2019 20:35   META-INF/resources/ikonli/0.0.0/fonts/
     1240  11-03-2019 20:35   META-INF/resources/ikonli/0.0.0/fonts/ikonli.ttf
        0  11-03-2019 20:35   META-INF/services/
       37  11-03-2019 20:35   META-INF/services/org.kordamp.ikonli.IkonHandler
      180  11-03-2019 20:35   org/kordamp/ikonli/Ikon.class
     1061  11-03-2019 20:35   org/kordamp/ikonli/IkonliIkonResolver.class
     2182  11-03-2019 20:35   org/kordamp/ikonli/Ikonli.class
      608  11-03-2019 20:35   org/kordamp/ikonli/AbstractIkonHandler.class
      391  11-03-2019 20:35   org/kordamp/ikonli/IkonHandler.class
      277  11-03-2019 20:35   module-info.class
---------                     -------
    21287                     30 files

I'm afraid this may be related to the mergeClasses task added by default.

tlinkowski commented 4 years ago

Eh, something is really broken in this plugin 😕 E.g. as far as I remember, build/module-info should contain only module-info.class, and it contains other Java classes too.

So I bet the current problem with the JAR occurs because both build/java and build/module-info dirs get included in the JAR. Excluding any (preferably, build/module-info) from jar task should help (however dirty it is).

vipcxj commented 3 years ago

Any news?