首页/新闻资讯/正文详情

Play Framework 应用目录结构完全指南:从 Play 标准布局到默认 sbt 布局

发布时间:2026/9/23 23:57:26 来源:云帆数科 栏目:资讯中心
Play Framework 应用目录结构完全指南:从 Play 标准布局到默认 sbt 布局
后端Web框架【免费下载链接】playframeworkThe Community Maintained High Velocity Web Framework For Java and Scala.项目地址https://gitcode.com/gh_mirrors/pl/playframework点击查看免费下载本文以 Play Framework 官方文档《Anatomy of a Play application》为骨架系统讲解一个 Play 应用中每个目录与文件的职责从app/、conf/、public/三大核心目录到target/构建产物、.gitignore最佳实践以及如何通过PlayLayoutPlugin切换到 sbt/Maven 默认布局。读完本文你将能完全读懂一个 Play 项目的目录组织知道每种文件该放哪里、构建时它们去了哪里并能在两种布局之间自由切换。为什么 Play 需要标准化的目录布局Play Framework 的目录布局是标准化的目的是让事情尽可能简单keep things as simple as possible无论你使用 Play Scala 还是 Play Java无论团队中有多少人协作大家拿到一个 Play 项目都能立刻找到控制器、模板、路由和配置文件。更重要的是这个布局不只是约定——它直接由 sbt 插件在构建层面强制落地。Play 的 sbt 插件内置了一个名为PlayLayoutPlugin的 AutoPlugin源码位于 PlayLayoutPlugin.scala它负责把 sbt 默认的 Maven 风格目录重定向到 Play 的传统 Web 应用布局。它由PlayWeb插件自动触发override def trigger allRequirements因此只要是 Web 应用项目无需任何额外配置即可生效。Play 应用的标准布局总览在第一次成功编译之后一个 Play 项目的结构如下这是官方文档给出的标准形态app → 应用源码 └ assets → 需要编译的静态资源源码 └ stylesheets → 通常是 LESS CSS 源码 └ javascripts → 通常是 CoffeeScript 源码 └ controllers → 应用控制器 └ models → 应用业务层 └ views → 模板 build.sbt → 应用构建脚本 conf → 配置文件及其他不参与编译的资源位于 classpath └ application.conf → 主配置文件 └ routes → 路由定义 dist → 需要打进项目发行包的任意文件 public → 公共静态资源 └ stylesheets → CSS 文件 └ javascripts → JavaScript 文件 └ images → 图片文件 project → sbt 配置文件 └ build.properties → sbt 项目标记 └ plugins.sbt → sbt 插件声明包括 Play 插件自身 lib → 非托管的库依赖 logs → 日志目录 └ application.log → 默认日志文件 target → 构建生成物 └ resolution-cache → 依赖解析信息 └ scala-2.13 └ api → 生成的 API 文档 └ classes → 编译后的 class 文件 └ routes → 由路由文件生成的源码 └ twirl → 由模板生成的源码 └ universal → 应用打包产物 └ web → 编译后的 Web 静态资源 test → 单元测试或功能测试源码注意target/scala-2.13中的scala-2.13是当前项目使用的 Scala 二进制版本。Play 目前支持 Scala 2.12、2.13 与 3.x见 Versions.scala如2.13.18、3.9.0等该目录名会随你所选的 Scala 版本变化。app/目录所有可执行代码的所在地app目录包含所有可执行工件Java 与 Scala 源码、模板以及需要编译的静态资源源码。按照 MVC 架构模式app下默认有三个包一一对应 MVC 的三个组件app/controllers—— 控制器层app/models—— 业务模型层app/views—— 视图模板层你完全可以添加自己的包例如app/services。并且需要注意在 Play 中controllers、models、views这些包名只是约定convention不是强制规定。如果愿意你可以给所有包加上公司前缀如com.yourcompany.controllers构建系统同样能正常工作——因为 Play 的路由与模板编译并不依赖固定的包名而是读取你配置的包声明。此外app下还有一个可选的app/assets目录用于存放需要预编译的静态资源例如 LESS CSS 源码和 CoffeeScript 源码。从源码层面看PlayLayoutPlugin.scala 明确将Assets / sourceDirectory指向app/assets、TestAssets / sourceDirectory指向test/assets这些资源会经由 sbt-web 管线编译后输出到target/web。public/目录无需编译的静态资源存放在public目录中的资源是静态资源由 Web 服务器直接对外提供不经过任何编译管线。该目录按惯例拆分为三个子目录分别存放图片、CSS 样式表和 JavaScript 文件。官方建议所有 Play 应用都按此方式组织静态资源以保持项目之间的一致性public/ ├── stylesheets/ → CSS 文件 ├── javascripts/ → JavaScript 文件 └── images/ → 图片文件在新建的应用中/public目录默认映射到/assetsURL 路径即浏览器访问/assets/...即可命中public下的文件。这个映射是可配置的你可以轻松更改它甚至配置多个目录来提供静态资源。从构建角度讲Assets / resourceDirectory被指向public见 PlayLayoutPlugin.scala也就是说public中的文件会作为 Web 资源参与打包与发布。conf/目录配置文件与非编译资源conf目录存放应用的配置文件它在构建时会被放入 classpath因此运行时可以通过application.conf被框架加载。其中有两个核心文件application.conf—— 应用的主配置文件采用 HOCON 格式详见 ConfigFile.md涵盖注释、键值分隔、include 合并、变量替换、时长/字节大小格式与系统属性覆盖等完整语法特性。Play 的运行端口、数据库连接、日志级别、HTTP 服务器参数等全部在此配置。routes—— 路由定义文件声明 HTTP 方法、URL 模式与对应控制器方法的映射。如果你需要添加应用特有的配置项直接在application.conf中增加条目即可如果某个第三方库需要独立的配置文件惯例也是放在conf目录下让它可以随 classpath 被加载。路由与模板编译两个目录被生成到哪conf/routes和app/views里的模板并不会直接运行而是在编译期被生成源码。路由编译器RoutesCompiler.scala会为每个 routes 文件生成三类产物见 RoutesCompiler.scala 中的RoutesCompilerTask定义正向路由器forwards router把请求 URL 分发到控制器反向路由器reverse router在代码中按方法调用生成 URLJS 反向路由器JS reverse router供前端 JavaScript 使用的 URL 生成器。这些生成源码被输出到target/scala-2.13/routes/同理app/views下的 Twirl 模板由模板引擎生成 Scala 源码输出到target/scala-2.13/twirl/。lib/目录非托管的 JAR 依赖lib目录是可选的用于存放非托管unmanaged库依赖——也就是你想脱离构建系统手工管理的 JAR 文件。只要把 JAR 丢进这个目录它们就会被自动加入应用的 classpath。当某些私有 JAR 无法发布到 Maven 仓库、又不适合作为源码引入时这是一个简单直接的兜底方案。build.sbt与project/目录构建定义build.sbt—— 位于项目根目录是项目的主要构建声明文件。这里声明项目名称、Scala 版本、依赖如guice、play-slick等、以及启用的插件如PlayScala、PlayJava。project/—— 存放 sbt 构建定义本身plugins.sbt声明本项目使用的 sbt 插件其中包含对 Play 插件本身的声明如addSbtPlugin(org.playframework % sbt-plugin % ...)build.properties指定用于构建本应用的 sbt 版本marker 文件例如sbt.version1.12.15对应 Versions.scala 中的SbtVersions.sbt1。target/目录构建生成的everythingtarget目录包含构建系统生成的一切产物。了解这里的结构对日常开发调试很有帮助classes/—— 所有编译后的 class 文件Java 与 Scala 源码的编译结果classes_managed/—— 仅由框架管理的 class 文件例如路由器与模板系统生成的类。在 IDE 中把它添加为外部 class 目录可以方便地调试或查看框架生成代码resource_managed/—— 生成的资源典型代表是 LESS CSS 与 CoffeeScript 的编译结果src_managed/—— 生成的源码例如模板系统生成的 Scala 源码web/—— 经过 sbt-web 处理的资源覆盖app/assets与public两处来源的处理结果。此外还有target/universal/应用打包产物与target/resolution-cache/依赖解析信息。Play 的默认布局把target固定在项目根目录这一点同样由 PlayLayoutPlugin.scala 控制。典型的.gitignore文件所有生成物目录都不应提交到版本控制。这是官方推荐的一个 Play 应用.gitignore模板logs project/project project/target target tmp dist .bsp .cache RUNNING_PID逐行说明logs、tmp—— 运行时产生的日志与临时文件project/project、project/target—— sbt 构建自身的生成物注意project/project是元构建的嵌套目录target—— 主项目的构建生成物对应上文全部classes/、src_managed/等内容dist—— 发行包目录.bsp—— Build Server Protocol 工作目录IDE 与构建服务器通信用.cache—— 各类缓存RUNNING_PID—— Play 在启动时写下的进程 ID 文件用于优雅停机。切换到默认的 sbt 布局Maven 风格除了 Play 标准布局你还可以选择使用sbt 与 Maven 的默认布局。做法是在build.sbt中禁用PlayLayoutPlugin并为 Twirl 模板设置显式的源码目录监控。完整的配置见 anatomy.sbtlazy val root: Project (project in file(.)) .enablePlugins(PlayScala) // Use sbt default layout .disablePlugins(PlayLayoutPlugin)禁用PlayLayoutPlugin之后Play 不再覆盖 sbt 的默认目录设置项目将呈现 Maven 风格的标准布局build.sbt → 应用构建脚本 src → 应用源码 └ main → 主源码集 └ java → Java 源码 └ controllers → Java 控制器 └ models → Java 业务层 └ scala → Scala 源码 └ controllers → Scala 控制器 └ models → Scala 业务层 └ resources → 配置文件及其他非编译资源位于 classpath └ application.conf → 主配置文件 └ routes → 路由定义 └ twirl └ views → 模板 └ assets → 需要编译的静态资源源码 └ css → 通常是 LESS CSS 源码 └ js → 通常是 CoffeeScript 源码 └ public → 公共静态资源 └ css → CSS 文件 └ js → JavaScript 文件 └ images → 图片文件 └ test → 单元测试或功能测试 └ java → Java 测试源码 └ scala → Scala 测试源码 └ resources → 测试资源 └ universal → 需要打进发行包的任意文件 project → sbt 配置文件 └ build.properties → sbt 项目标记 └ plugins.sbt → sbt 插件声明包括 Play 插件 lib → 非托管库依赖 logs → 日志目录 └ application.log → 默认日志文件 target → 构建生成物 └ scala-2.13 └ cache └ classes → 编译后的 class 文件 └ classes_managed → 受管理的 class 文件模板等 └ resource_managed → 受管理的资源LESS 等 └ src_managed → 生成的源码模板等两种布局的本质区别谁在搬动目录两种布局之间的差异完全由 PlayLayoutPlugin.scala 中的几个 sbt 键决定理解这些映射你就掌握了布局切换的全部秘密sbt 键Play 标准布局默认 sbt 布局禁用插件后Compile / sourceDirectoryappsrc/mainCompile / resourceDirectoryconfsrc/main/resourcesCompile / scalaSource/javaSourceappsrc/main/scala/src/main/javaTwirlKeys.compileTemplates / sourceDirectoriesapp含test需显式指向src/main/twirlAssets / sourceDirectoryapp/assetssrc/main/assetsAssets / resourceDirectorypublicsrc/main/publicUniversal / sourceDirectorydistsrc/universaltarget项目根目录下的targetsbt 默认位置特别要注意的一点在默认布局下必须为 Twirl 模板设置显式的源码目录监控即上面anatomy.sbt中enablePlugins(PlayScala)之后模板编译所需的目录配置因为PlayLayoutPlugin原本负责把模板源目录指向app禁用之后这一映射也随之消失。仓库中的 sbt 脚本测试 maven-layout-twirl-reload/build.sbt 正是对这一场景的回归验证——它在disablePlugins(PlayLayoutPlugin)的前提下启动应用并断言模板渲染结果确保 Maven 布局下 Twirl 模板的重载与渲染依然正确工作。小结从文件放哪到构建去哪把整篇文章浓缩成一张心智地图你写的代码app/控制器、模型、视图模板、assets预编译资源、test/测试你提供的配置conf/application.confroutes进入 classpath你直接发布的静态文件public/映射到/assetsURL可配置你手工管理的 JARlib/构建系统本身build.sbtproject/plugins.sbt声明 Play 插件、build.properties锁定 sbt 版本构建产物全部落入target/classes、routes/twirl 生成源码、web 资源、universal 打包并应通过.gitignore排除布局切换disablePlugins(PlayLayoutPlugin)即可切换到 sbt/Maven 默认布局代价是需要为 Twirl 模板显式配置源码目录。无论采用哪种布局Play 的构建管线路由编译、模板编译、资源处理、打包都只认 sbt 键指向的目录——布局插件只是帮你把这些键搬到约定位置。理解了这一点你就能在两种布局之间自由迁移也能在遇到文件放错了地方的构建错误时第一时间定位是哪个 sbt 键没有指向预期的目录。赞分享后端Web框架【免费下载链接】playframeworkThe Community Maintained High Velocity Web Framework For Java and Scala.项目地址https://gitcode.com/gh_mirrors/pl/playframework点击查看免费下载相关推荐Play Framework 的 sbt Settings 指南理解 build.sbt 与 PlayJava/PlayScala 默认设置Play Framework 的 sbt Settings 指南理解 build.sbt 与 PlayJava/PlayScala 默认设置 导读 本指南围绕后端Web框架iTerm2 WebExtensions Framework 扩展包结构完全指南从 manifest.json 到目录布局的实战解析iTerm2 WebExtensions Framework 扩展包结构完全指南从 manifest.json 到目录布局的实战解析 本篇指南聚焦 iTerm桌面应用AI 应用终极 SecureSocial 指南为 Play Framework 应用打造安全高效的认证系统终极 SecureSocial 指南为 Play Framework 应用打造安全高效的认证系统 SecureSocial 是一款强大的认证模块专为 Pla后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

OpenSpec:规范驱动开发(Spec-Driven)的契约编译器与双向同步实践
OpenSpec:规范驱动开发(Spec-Driven)的契约编译器与双向同步实践

1. OpenSpec 是什么?它不是另一个 CLI 工具,而是一套重构开发流程的 Spec 驱动范式OpenSpec 不是 npm 上随便一个带“open”前缀的玩具库,也不是某个公司包装出来的营销概念。我第一次在 Fission AI 的技术分享会上听到它时,主讲人… · 2026/9/23 23:57:19

TVAPM水声模型在便携设备上的实战:水平变化环境传播损失计算
TVAPM水声模型在便携设备上的实战:水平变化环境传播损失计算

简介:TVAPM.zip围绕水声学中的声波传播与仿真建模,面向水声研究人员、工程师及具备MATLAB基础的学习者。压缩包共23个文件,包含18个.m脚本、4个.dat数据文件和1个pdf说明文档,整体仅406KB。MATLAB代码覆盖海面/海底边界处理、声速… · 2026/9/23 23:57:19

nuqs 测试模式完全指南:从单元测试到端到端回归的工程实践
nuqs 测试模式完全指南:从单元测试到端到端回归的工程实践

前端状态管理 【免费下载链接】next-usequerystate Type-safe search params state manager for React frameworks - Like useState, but stored in the URL query string. 项目地址: https://gitcode.com/gh_mirrors/ne/next-usequerystate 点击查看 免费下载 导读… · 2026/9/23 23:57:19

深入解析 SpaceX-API v4 payloads 端点:载荷数据获取、字段模型与查询实践
深入解析 SpaceX-API v4 payloads 端点:载荷数据获取、字段模型与查询实践

后端API设计 【免费下载链接】SpaceX-API :rocket: Open Source REST API for SpaceX launch, rocket, core, capsule, starlink, launchpad, and landing pad data. 项目地址: https://gitcode.com/gh_mirrors/spa/SpaceX-API 点击查看 免费下载 导读 /v4/payloa… · 2026/9/24 0:40:16

攻克 mal 实现难点:Hints 指南中的时间戳、函数引用、I/O 与 Reader 设计
攻克 mal 实现难点:Hints 指南中的时间戳、函数引用、I/O 与 Reader 设计

示例工程 【免费下载链接】mal mal - Make a Lisp 项目地址: https://gitcode.com/gh_mirrors/ma/mal 点击查看 免费下载 mal(Make a Lisp)是一个用数十种语言逐步实现 Lisp 解释器的教学项目。在编写 step0 到 stepA 的过程中,实… · 2026/9/24 0:40:16

大数据入门学习顺序:Hadoop、Hive、Spark、Flink等九大组件最小链路搭建指南
大数据入门学习顺序:Hadoop、Hive、Spark、Flink等九大组件最小链路搭建指南

简介:这是一份面向大数据初学者与转行开发者的系统入门资料包,围绕Hadoop、Hive、Spark、Storm、Flink、HBase、Kafka、Zookeeper、Flume等主流组件展开,覆盖学习路线、技术栈思维导图、常用软件安装指南,以及环境搭建、命令实操、… · 2026/9/24 0:40:04

CodeBurn 中 OpenCode 用量追踪:数据目录解析、双代存储格式与计费路由实战指南
CodeBurn 中 OpenCode 用量追踪:数据目录解析、双代存储格式与计费路由实战指南

【免费下载链接】codeburn Free, local tool to track AI coding token usage and cost across 37 tools and agents (Claude Code, Cursor, Codex, Gemini and more), by model, project, and task. npx codeburn 项目地址: https://gitcode.com/gh_mirrors/co/cod… · 2026/9/24 0:40:04

Java服务端发丝级抠图:ONNX Runtime部署matting模型实战
Java服务端发丝级抠图:ONNX Runtime部署matting模型实战

简介:该资源是一套基于ONNX模型的发丝级人像抠图与背景替换Java实现源码,面向希望将深度学习模型集成到Java应用中的开发者,以及研究图像分割与高精度抠图的技术人员。项目以Java为核心语言,借助ONNX实现跨框架模型加载与推理&… · 2026/9/24 0:39:58

基于PCD小样本数据集的PCB元器件缺陷检测:YOLOv8训练与产线落地实践
基于PCD小样本数据集的PCB元器件缺陷检测:YOLOv8训练与产线落地实践

简介:PCD表面元器件缺陷检测数据集面向从事工业质检、电子制造与目标检测算法实践的开发者与研究者,用于训练和验证PCB表面元器件缺陷识别模型。数据集包含超过600张标注图像,已统一处理为YOLO格式并完成数据增强,可直接用于YOLO全… · 2026/9/24 0:39:52

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码