Kurztipp: Eclipse Gradle und der Modulpath

Eclipse und der Modulepath

Mit Java 9 wurden die Module neu eingeführt (Projekt Jigsaw). Wenn man ein Projekt mit Modulen baut, dann müssen die Module auch in dem Modulepath vorhanden sein.

Das Buildship-Plugin von Eclipse setzt leider nicht alle Module automatisch auf den Modulepath, sodass bei jeder Änderung am gradle.build Skript man von Hand die Einträge im Buildpath Konfigurationsdialog verschieben muss.

Folgendes kleines Skript erledigt die Aufgabe für uns, wenn der Gradle Task eclipse ausgeführt wird.

//
// Will be executed when gradle Task Eclipse was called
//

eclipse {
    project {
        natures 'org.eclipse.buildship.core.gradleprojectnature'
    }

    classpath {
        file {
            whenMerged {
                entries.findAll { isModule(it) }.each {
                    it.entryAttributes['module'] = 'true'
                }

                entries.findAll { isSource(it) && isTestScope(it) }.each {
                    it.entryAttributes['test'] = 'true'
                }

                entries.findAll { isLibrary(it) && isTestScope(it) }.each {
                    it.entryAttributes['test'] = 'true'
                }
            }
        }

        defaultOutputDir = file('build')
        downloadSources = true
        downloadJavadoc = true
    }
}

boolean isLibrary(entry) { return entry.properties.kind.equals('lib') }
boolean isTestScope(entry) { return entry.entryAttributes.get('gradle_used_by_scope').equals('test'); }
boolean isModule(entry) { isLibrary(entry) && !isTestScope(entry); }
boolean isSource(entry) { return entry.properties.kind.equals('src'); }