如何使gradle / intellij / play框架协同工作?

时间:2015-12-25 13:26:52

标签: scala intellij-idea gradle playframework

这是一个建议使用Play框架的Gradle构建here

plugins {
  id 'play'
  id 'idea'
}

repositories {
  jcenter()
  maven {
    name "typesafe-maven-release"
    url "https://repo.typesafe.com/typesafe/maven-releases"
  }
  ivy {
    name "typesafe-ivy-release"
    url "https://repo.typesafe.com/typesafe/ivy-releases"
    layout "ivy"
  }
}

在从命令行构建,启动等时它工作正常但是一旦项目在intellij中导入(想法的项目文件由gradle idea生成),依赖项(来自播放插件)就不会显示在项目视图/外部库中(即使在gradle面板中点击“刷新所有gradle项目”之后)。

谢谢:)

PS :intellij 15.0.2 / gradle 2.6 / play plugin

enter image description here

3 个答案:

答案 0 :(得分:5)

回答here。显然,gradle idea插件需要明确告知如何连接依赖项。

总结一下:

  1. 创建典型的游戏布局
  2. 添加build.gradle(如下所示)
  3. 输入gradle idea以生成构思的项目文件
  4. 在intellij中打开项目

    plugins {
        id 'play'
        id 'idea'
    }
    
    repositories {
        jcenter()
        maven {
            name "typesafe-maven-release"
            url "https://repo.typesafe.com/typesafe/maven-releases"
        }
        ivy {
            name "typesafe-ivy-release"
            url "https://repo.typesafe.com/typesafe/ivy-releases"
            layout "ivy"
        }
    }  
    
    idea {
        module {
            sourceDirs += file("app")
            testSourceDirs += file("test")
            scopes.COMPILE = [plus: [configurations.play], minus: []]
            scopes.RUNTIME = [plus: [configurations.playRun], minus:[configurations.play]]
            scopes.TEST = [plus: [configurations.playTest], minus: [configurations.playRun]]
         }
    }
    
  5. PS:使用intellij 15.0.2 / gradle 2.10 / gradle play plugin测试

答案 1 :(得分:4)

我使用的是Intellij(2017年和2018年),Gradle(4.6)和Play(2.5)。其中三个不会开箱即用。

在没有帮助的情况下,IDEA不会识别依赖关系,并且只会记事本 - 没有代码完成,没有导航。这是因为IDEA查看了Java插件的配置模型,但是' play'插件使用" new"软件模型。我不认为任何一方都会改变这种状态以便很快与其他人相遇。

这个想法'插件写入基于文件的项目文件,这些文件不能很好地工作,必须手动刷新。我建议你不要使用这个想法'插件。

使用' java'并且'玩'插件,你可以帮助IDEA了解你想要的东西:

(1) 移动您的Play源文件,以遵循' java'插件:

  • app - >的src /主/ JAVA
  • 测试 - >的src /测试/ JAVA

您可以创建从./test到src / test / java的符号链接,或者使用带有插件代码的播放模型进行muck。路径./test在' play'中被硬编码(!)。插件,但我发现IDEA在src / test / java中找到它会更好。

(2) 配置播放插件以从Java插件源目录获取其输入。像这样:

model {
    components {
        play {
            sources {
                java {
                    source.setSrcDirs files("src/main/java")
                }
                resources {
                    source.setSrcDirs files("src/main/resources")
                }
                routes {
                    // leave in ./conf
                }
            }
        }
    }
}

(3) 配置java插件将其输出放在播放插件输出目录中。像这样:

sourceSets {
    main {
        java.outputDir = file('build/playBinary/classes')
    }
    test {
        java.outputDir = file('build/playBinary/testClasses')
    }
}

(4) 给IDEA更多的帮助来解决这个问题:

configurations {
    compile.extendsFrom(play)
    testCompile.extendsFrom(playTest)
    implementation.extendsFrom(playRun)
    implementation.extendsFrom(playPlatform)
}

如果这样做,您可以直接将Gradle项目导入IDEA,使用Gradle runner进行测试,并随时刷新gradle项目。

我意识到这个答案已经很晚了,但是没有太多的信息,这个答案可能会帮助人们在遥远的未来继续寻找这个。

+ - + - + - + - + - + - + - + -

编辑:我已经停止使用上述方法,因为它太不可靠了。相反,我编写了自己的插件来复制旋转并路由sbt的编译步骤,然后只使用传统的scala(使用java)gradle插件,还使用groovy(用于spock测试)。我使用应用程序插件来构建发行版。我将其导入为Intellij中的gradle构建,并且所有内容都可以正常运行"。我建议不要使用' play'插件

使用直接的gradle插件。避免这个想法'并且'玩'插件。将项目作为gradle构建导入Intellij - 即使是传统的JUnit运行器也能正常工作。远离"新"插件中的gradle软件模型。直接从Intellij运行和调试,就像任何其他Java应用程序一样。

这意味着放弃"开发模式" sbt,并且始终运行" ProdServerStart" main(但你仍然可以在dev或test"模式" Play中运行)。但我并不缺少sbt。 :^)例如,在运行ProdServerStart时,总是会耗尽带有传统类路径的jar。您需要从" changeme"中更改应用程序密钥,您必须将资产jar放在类路径上。这是所有直接的JVM,没有任何秘密调料(其他旋转和路线编译器)。

我现在回过头来了解更多详情: @TaskAction public void generate() { getSource().forEach(sourceFile -> { TwirlCompiler.compile(sourceFile, getAppDir(), getDestinationDir(), FORMATTER, ADDITIONAL_IMPORTS, Codec.UTF8(), false, false); }); }

@TaskAction public void generate() { getSource().forEach(sourceFile -> { RoutesCompiler.RoutesCompilerTask routesCompilerTask = new RoutesCompiler.RoutesCompilerTask(sourceFile, ADDITIONAL_IMPORTS, true, true, false); RoutesCompiler.compile(routesCompilerTask, INJECTED_ROUTES_GENERATOR, getDestinationDir()); }); }

如果你习惯用Java编写gradle插件,那么

应该可以帮到你。

答案 2 :(得分:1)

首先,您必须根据gradle play插件更改项目。 here是链接,如何将sbt项目更改为gradle并确保您可以从命令提示符或终端执行所有必需的命令(build,clean,runPlayBinary等)。如果能够成功构建,则可以导入Intellj IDE。这是您必须遵循的步骤。在 build.gradle 文件中添加想法插件并按照配置进行想法源配置。

plugins {
     ....
    id 'idea'
}
..
idea {
    module {
        sourceDirs += file("app")
        testSourceDirs += file("test")
        scopes.COMPILE = [plus: [configurations.play], minus: []]
        scopes.RUNTIME = [plus: [configurations.playRun], minus:[configurations.play]]
        scopes.TEST = [plus: [configurations.playTest], minus: [configurations.playRun]]
     }
}
...
  • 键入“ ./gradlew idea”以生成想法的必要项目文件
  • 用intellj打开项目(不导入)
  • 从项目结构中设置sdk(java)
  • 在底部的IDE中,您将看到诸如“未链接的Gradle项目?导入Gradle项目,这也将启用Gradle Tool Window。不要再次看到该项目的消息:按此处。”的消息。
    • 点击此消息,为该项目启用gradle并为gradle设置gradle home和JVM(不是project jvm)

要运行(运行配置)

  • 打开运行配置窗口
  • 单击(+)并选择Gradle
  • 名称:根据需要
  • 分级项目:您的根项目或根项目的位置
  • 任务:runPlayBinary

转到智能偏好设置

  • 转到[构建,执行和部署]部分
  • 选择构建工具作为gradle
  • 设置“服务目录路径”,例如:“ / Users /.../ gradle / gradle-4.10.2”
  • 取消选中“离线工作”`

通过IntelliJ IDEA 2018.3.2(Ultimate Edition)snd Play 2.5.2级4.10.2测试