Настройка IntelliJ 2017 для работы с Gradle 4.2 и последней версией Play Framework 2.6

Я пытаюсь настроить IntelliJ 2017.2 для работы с моим приложением Play 2.6 с помощью Gradle 4.2.1.

У меня также установлен плагин Scala для IntelliJ.

После нескольких часов просмотра различных блогов и руководств я создал файл build.gradle, который выглядит так, что должно было помочь:

plugins {
    id 'play'
    id 'idea'
}

model {
    components {
        play {
            platform play: '2.6.6', scala: '2.11'
            injectedRoutesGenerator = true
        } 
    }
}

idea {
    module {
        sourceDirs += project.file('app')
        testSourceDirs += project.file('test')

        project.file("${project.buildDir}/src/play/binary").listFiles().each {
            if (it.name.endsWith('ScalaSources')) {
                sourceDirs += it
                generatedSourceDirs += it
            }
        }

        outputDir = project.file("${project.buildDir}/playBinary/classes")
        testOutputDir = project.file("${project.buildDir}/playBinary/testClasses")

        scopes.COMPILE = [plus: [configurations.play], minus: []]
        scopes.RUNTIME = [plus: [configurations.playRun], minus:[configurations.play]]
        scopes.TEST = [plus: [configurations.playTest], minus: [configurations.playRun]]

        sourceDirs += project.file('conf')
        testSourceDirs += project.file('test/resources')
    }
}

dependencies {
    // dependencies...
}

Основная проблема, с которой я сталкиваюсь, заключается в том, что IntelliJ не может правильно найти все мои источники.

Если я попытаюсь вручную добавить что-то в настройки проекта (скажем, для каталога «приложение»), мои изменения будут сброшены при обновлении Gradle.

Я также пробовал играть с конфигурациями Gradle, такими как «Создать отдельный модуль для каждого исходного набора», но это не очень помогло.

Я знаю, что это не типичная установка, так как большинство людей используют SBT с Play, но, к сожалению, пока мы застряли на этом, поскольку Gradle является стандартом в работе. Кому-нибудь повезло с этой настройкой IntelliJ 2017, Gradle 4.2 и Play 2.6?


person Luis Medina    schedule 25.10.2017    source источник


Ответы (1)


Я обнаружил, что Intellij 2017 на самом деле не поддерживает плагин Gradle play. Я использую IDEA 2017 3.5 и Gradle 4.6, и простой импорт проекта Gradle из build.gradle не будет работать. IDEA становится немного больше, чем Блокнот при работе с исходными файлами.

Я думаю, что происходит то, что IDEA жестко запрограммирована специально для поиска конфигураций и исходных наборов подключаемого модуля Java. Конфигурация вашей области может делать то же самое, но сначала я добавил две конфигурации:

// IDEA will not use the dependencies unless it finds these particular configurations.

configurations.create(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME, configuration -> {
    configuration.extendsFrom(configurations.findByName(PlayPluginConfigurations.COMPILE_CONFIGURATION));
    configuration.setTransitive(true);
});

configurations.create(JavaPlugin.TEST_COMPILE_CLASSPATH_CONFIGURATION_NAME, configuration -> {
    configuration.extendsFrom(configurations.findByName(PlayPluginConfigurations.TEST_COMPILE_CONFIGURATION));
    configuration.setTransitive(true);
});

Это позволяет IDEA распознавать зависимости gradle, но они не будут отображаться в IDE, если они не привязаны к источникам модулей структуры проекта IDEA, поэтому я затем добавляю два исходных набора, которые существуют с единственной целью запуска IDEA для распознавания зависимостей, а не для того, чтобы IDEA использовала их при создании чего-либо. (Я применяю плагин «java-base» и использую наборы источников объекта JavaPluginConvention.)

    sourceSets.create("main", sourceSet -> {
        sourceSet.getJava().setSrcDirs(Collections.singletonList("app"));
        sourceSet.getJava().setOutputDir(fileResolver.resolve("build/playBinary/classes"));
        sourceSet.getResources().setSrcDirs(Collections.singletonList("conf"));
        sourceSet.getResources().setOutputDir(fileResolver.resolve("build/playBinary/resources"));
    });

    sourceSets.create("test", sourceSet -> {
        sourceSet.getJava().setSrcDirs(Collections.singletonList("test"));
        sourceSet.getJava().setOutputDir(fileResolver.resolve("build/playBinary/classes"));
        sourceSet.getResources().setSrcDirs(Collections.singletonList("test/resources"));
        sourceSet.getResources().setOutputDir(fileResolver.resolve("build/playBinary/resources"));
    });

Мне все еще не хватает некоторых деталей. Если есть кто-нибудь, кто может добавить подробности, я был бы рад поделиться своим плагином, из которого взято вышеизложенное. Я не использую плагин «идея» — я просто применяю плагин «играть» в одиночку, применяю вышеуказанные исправления и импортирую проект как проект Gradle. Задачи Gradle отлично работают в IDE, и зависимости отображаются правильно, и все преимущества IDE, включая навигацию по исходному коду с помощью кликов, возвращаются к жизни.

person Jim Flood    schedule 29.03.2018