【问题标题】:Setting up IntelliJ 2017 to work with Gradle 4.2 and the latest Play Framework 2.6设置 IntelliJ 2017 以使用 Gradle 4.2 和最新的 Play Framework 2.6
【发布时间】:2018-04-06 23:50:27
【问题描述】:

我正在尝试设置 IntelliJ 2017.2 以使用 Gradle 4.2.1 与我的 Play 2.6 应用程序一起使用。

我还安装了 IntelliJ 的 Scala 插件。

经过数小时筛选各种博客和指南后,我创建了一个如下所示的 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 无法正确找到我的所有来源。

如果我尝试在项目设置中手动添加内容(比如“app”目录),我的更改会在 Gradle 刷新时重置。

我也尝试过使用 Gradle 配置,例如“为每个源集创建单独的模块”,但并没有太大帮助。

我知道这不是典型的设置,因为大多数人将 SBT 与 Play 一起使用,但不幸的是,由于 Gradle 是工作中的标准,我们暂时坚持使用此设置。有没有人对 IntelliJ 2017、Gradle 4.2 和 Play 2.6 的设置感到幸运?

【问题讨论】:

    标签: scala intellij-idea gradle playframework playframework-2.6


    【解决方案1】:

    我发现 Intellij 2017 并不真正支持 Gradle play 插件。我正在运行 IDEA 2017 3.5 和 Gradle 4.6,从 build.gradle 简单导入 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。)

        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"));
        });
    

    我仍然缺少一些细节。如果有人可以添加详细信息,我很乐意分享我的插件,上面来自。我没有使用“idea”插件——我只是单独应用“play”插件,并应用上述修复,并将项目作为 Gradle 项目导入。 gradle 任务在 IDE 中运行良好,并且依赖项显示正确,并且 IDE 的所有优点,只要通过点击来导航源,就恢复了活力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 2018-01-19
      • 2018-02-23
      相关资源
      最近更新 更多