Как указать Eclipse/Buildship/Gradle добавить зависимости в Modulepath

Я пытаюсь использовать Eclipse, Buildship, Gradle для разработки приложений java 9.

Eclipse: Oxygen Сборка: 2.2.0 Gradle: 4.3.1

Я ищу способ сообщить Buildship/Gradle о добавлении Project and External Dependencies в Modulepath, а не в Classpath.

Вот представление того, что я вижу, когда настраиваю свой проект Eclipse Путь сборки Java.

Properties for TestMain

Java Build path

Source   |   Projects   |   Libraries   |   Order and Export
                        ---------
Modulepath
   - JRE System Library [JavaSe-9]

Classpath                            
   - Project and External Dependencies
      - Access rules: No rules defined
      - External annotations: (None)
      - Native library location: (None)
         - coreutil-9.4.1.jar
         - slf4j-api-1.7.2.1.jar
         - ...

Когда я пытаюсь сослаться на автоматический модуль coreutil в module-info.java, я получаю сообщение об ошибке coreutil не может быть преобразован в модуль.

Если я вручную добавлю coreutil-9.4.1.jar в путь к модулям, модуль coreutil станет видимым. Однако это проблема, поскольку в некоторых случаях нецелесообразно вручную добавлять более 60 библиотек. Более того, каждый раз, когда я обновляю проект Gradle, все они удаляются из пути к модулям.

Спасибо за помощь.

Гаэтан


person Gaëtan Sheridan    schedule 06.12.2017    source источник
comment
Вы когда-нибудь пробовали это с Buildship 2.2 (совместимость с Java 9 для Плагины сборки)?   -  person howlger    schedule 06.12.2017
comment
Мне придется подождать еще один день (если он снова не будет отложен): Buildship 2.2 Дата выпуска: пятница, 8 декабря 2017 г.   -  person Gaëtan Sheridan    schedule 07.12.2017
comment
К сожалению, Buildship 2.2 ведет себя точно так же.   -  person Gaëtan Sheridan    schedule 11.12.2017


Ответы (1)


После разговора с Donát Csikós в gradle (спасибо, Donát) добавление следующего в файл build.gradle решает проблему:

apply plugin: 'eclipse'

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

boolean isModule(entry) {
    // filter java 9 modules
    entry.kind == 'lib'  // Only libraries can be modules
}
person Gaëtan Sheridan    schedule 14.12.2017
comment
Работает отлично! Искал оооочень долго, пока не нашел этот полезный ответ. :) - person judos; 24.06.2020