Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dependent project can't find module-info #125

Open
aalmiray opened this issue Nov 2, 2019 · 4 comments
Open

Dependent project can't find module-info #125

aalmiray opened this issue Nov 2, 2019 · 4 comments
Labels
bug Something isn't working help wanted Extra attention is needed

Comments

@aalmiray
Copy link
Contributor

aalmiray commented Nov 2, 2019

Encountered this particular problem when attempting to solve controlsfx/controlsfx#1195 (comment)

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
Copy link
Collaborator

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:

public static void dependOnOtherCompileModuleInfoJavaTasks(JavaCompile javaCompile) {
dependentCompileModuleInfoJavaTaskStream(javaCompile.getProject())
.peek(compileModuleInfoJava -> LOGGER.debug("{}.dependsOn({})", javaCompile, compileModuleInfoJava))
.forEach(javaCompile::dependsOn);
}

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:

  • build/module-info directory should either get onto the classpath of :ikonli-dashicons-pack
  • or build/module-info/module-info.class should get copied to build/java
    • perhaps you can introduce a workaround here: an extra task that would hook into :ikonli-core:compileModuleInfoJava using isFinalizedBy and that would copy this single file

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).

@tlinkowski tlinkowski added the bug Something isn't working label Nov 3, 2019
@aalmiray
Copy link
Contributor Author

aalmiray commented Nov 3, 2019

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.

aalmiray pushed a commit to kordamp/ikonli that referenced this issue Nov 3, 2019
@tlinkowski
Copy link
Collaborator

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
Copy link

vipcxj commented Dec 23, 2020

Any news?

@big-andy-coates big-andy-coates added the help wanted Extra attention is needed label Feb 20, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

4 participants