重要的是要注意,這不是權威指南,而是我在處理自己的模塊時所使用的信息和技術的集合。
我將假設您已經安裝了Play 2,如果沒有,請直接訪問http://www.playframework.org/documentation/2.0/Installing ,以獲取有關如何進行設置的詳細信息。
在第一部分中,我們將介紹創建和發布模塊以及添加示例應用程序的基礎知識。 接下來的兩部分將更深入地介紹插件,攔截器,標簽和其他有用的工具。
首先,簡要介紹一下模塊和庫之間的區別。 在Play 1.x中,使用“ play new-module”創建了一個模塊,并通過模塊存儲庫進行分發。 在Play 1.1之前,模塊都是通過application.conf條目控制的,并且庫是在本地添加的。 從Play 1.2開始,模塊和庫都通過基于Ivy的依賴關系管理機制進行控制。 不過,在這兩種情況下,都有一個明確的模塊概念(與Play緊密集成,遵循Play的封裝結構等約定)和一個庫(一個通用的第三方庫)。
在播放2中,線條模糊到一定程度。 現在,通過Ivy或Maven,模塊以與庫相同的方式分發,并且包結構可以是任意的,因此您可以擁有傳統的com.example.whatever結構。 從這個角度來看,模塊和庫之間的唯一真正區別是模塊直接使用Play API。
其次,關于語言的說明。 由于Play 2本身支持Java和Scala,因此您可以使用任何一種語言來實現模塊。 如果模塊具有自己的應用程序可以使用的API,則Java和Scala之間的出色互操作性意味著-在大多數情況下,您所選擇的語言與使用API??的應用程序無關。
1.入門
作為簡單的介紹,我們將創建一個基本的日志記錄模塊,該模塊遵循行業最佳實踐,將輸出寫入控制臺窗口。 這個模塊稱為mylogger,因為它是星期一,而我現在并不覺得很有創意。 該模塊(主要)將用Java編寫。
您可以將Play 2模塊視為是Play 2應用程序,其中缺少一些文件。 因此,您可以按照與應用程序相同的方式來創建模塊。 轉到或創建用于保存項目的目錄,然后使用“播放新的Mylogger”創建應用。 出現提示時選擇選項2,以創建一個簡單的Java應用程序。
steve@hex:/tmp$ play new mylogger_ __ __ | | __ _ _ _| |
| '_ \| |/ _' | || |_|
| __/|_|\____|\__ (_)
|_| |__/play! 2.0, http://www.playframework.orgThe new application will be created in /tmp/myloggerWhat is the application name?
> myloggerWhich template do you want to use for this new application?1 - Create a simple Scala application2 - Create a simple Java application3 - Create an empty project> 2OK, application mylogger is created.Have fun!
因為我們將在模塊旁邊有一個示例應用程序,所以我們將稍微更改目錄結構。 目前,它看起來像這樣:
mylogger
– app
– conf
– project
– public
– target
– .gitignore
– README
在mylogger目錄中,創建兩個新目錄,項目代碼和示例。 將上面列出的所有文件復制到項目代碼目錄中。 您現在應該擁有
mylogger
– samples
– project-code– app– conf– project– public– target– .gitignore– README
conf目錄包含兩個文件-路由和application.conf。
– Play必須存在application.conf才能將mylogger /項目代碼識別為Play應用程序,因此我們無法刪除它,但可以刪除其中包含的所有內容。 模塊需要的任何配置都應添加到“實際”應用程序的application.conf中。
–必須刪除路由*。 如果您不這樣做,它可能/將取代使用該應用程序的任何應用程序的路由文件,這是一件不好的事情(主要是因為什么都不起作用)。
清空application.conf并刪除路由后,在項目代碼中鍵入“ play”以啟動Play控制臺。
steve@hex:/tmp/mylogger/project-code$ play
[info] Loading project definition from /tmp/mylogger/project-code/project
[info] Set current project to mylogger (in build file://tmp/mylogger/project-code/)_ __ __ | | __ _ _ _| |
| '_ \| |/ _' | || |_|
| __/|_|\____|\__ (_)
|_| |__/play! 2.0, http://www.playframework.org> Type "help play" or "license" for more information.
> Type "exit" or use Ctrl+D to leave this console.[mylogger] $
現在,我們有了一個有效的Play 2模塊(請注意,它什么也不做)。
如果您使用的是IDE,那么現在是創建項目的好時機-本教程與IDE無關,因此,如果需要,您可以使用位于http://www.playframework.org/documentation/2.0/IDE的指南。去做這個。
2.添加一些功能
如上所述,Play 2模塊可以具有更傳統的com.example.package包結構,但是默認的Play應用程序具有傳統的app / controllers,app / models等結構。 我們現在將其保留,并在本教程的后面部分進行更改。
2.1刀耕火種
在app文件夾中,我們具有“ play new”命令為我們創建的以下結構:
app
– controllers– Application.java
– views– index.scala.html– main.scala.html
對于此模塊的初始迭代,我們不需要任何視圖,因此您可以刪除視圖包。
您也可以刪除Application.java,因為我們是從頭開始編寫的。
2.2添加一些模塊代碼
在controllers包中,創建一個名為MyLogger.java的新類。 它不需要擴展或實現任何東西,它包含一個方法:
package controllers;/*** @author Steve Chaloner*/
public class MyLogger
{public static void log(String message){System.out.println("MyLogger: " + message);}
}
2.3喝啤酒
您剛剛編寫了一個模塊。 去喝啤酒。
2.4啤酒后實現
當您凝視著現在空蕩蕩的杯子,充滿創造力的喜悅和即將來臨的行業聲譽時,您可能會意識到,實際上沒有人能夠進入您的模塊,因為它位于您的計算機上。 您需要發布它。
3.發布并受到譴責
對于此示例,我們將要發布到您的本地存儲庫。 在Play安裝的根目錄中,有一個存儲庫目錄,這是您首先推送模塊的位置。
發布之前,請始終確保已運行“干凈”,否則,從源樹中刪除的某些類/文件可能仍以編譯形式存在,并最終出現在模塊jar文件中。 如果該類與您實際應用程序中的類匹配,則可以在您的實際類中代替它。 真爛
在Play控制臺中,使用“ clean”,然后使用“ publish-local”打包您的模塊,并將其發布到本地倉庫:
[mylogger] $ publish-local
[info] Updating {file:/tmp/mylogger/project-code/}mylogger...
[info] Packaging /tmp/mylogger/project-code/target/scala-2.9.1/mylogger_2.9.1-1.0-SNAPSHOT-sources.jar ...
[info] Done packaging.
[info] Wrote /tmp/mylogger/project-code/target/scala-2.9.1/mylogger_2.9.1-1.0-SNAPSHOT.pom
[info] Done updating.
[info] :: delivering :: mylogger#mylogger_2.9.1;1.0-SNAPSHOT :: 1.0-SNAPSHOT :: release :: Mon Mar 19 20:57:26 CET 2012
[info] delivering ivy file to /tmp/mylogger/project-code/target/scala-2.9.1/ivy-1.0-SNAPSHOT.xml
[info] Compiling 1 Java source to /tmp/mylogger/project-code/target/scala-2.9.1/classes...
[info] Generating API documentation for main sources...
model contains 4 documentable templates
[info] Packaging /tmp/mylogger/project-code/target/scala-2.9.1/mylogger_2.9.1-1.0-SNAPSHOT.jar ...
[info] Done packaging.
[info] API documentation generation successful.
[info] Packaging /tmp/mylogger/project-code/target/scala-2.9.1/mylogger_2.9.1-1.0-SNAPSHOT-javadoc.jar ...
[info] Done packaging.
[info] published mylogger_2.9.1 to /home/steve/development/play/play-2.0/framework/../repository/local/mylogger/mylogger_2.9.1/1.0-SNAPSHOT/poms/mylogger_2.9.1.pom
[info] published mylogger_2.9.1 to /home/steve/development/play/play-2.0/framework/../repository/local/mylogger/mylogger_2.9.1/1.0-SNAPSHOT/jars/mylogger_2.9.1.jar
[info] published mylogger_2.9.1 to /home/steve/development/play/play-2.0/framework/../repository/local/mylogger/mylogger_2.9.1/1.0-SNAPSHOT/srcs/mylogger_2.9.1-sources.jar
[info] published mylogger_2.9.1 to /home/steve/development/play/play-2.0/framework/../repository/local/mylogger/mylogger_2.9.1/1.0-SNAPSHOT/docs/mylogger_2.9.1-javadoc.jar
[info] published ivy to /home/steve/development/play/play-2.0/framework/../repository/local/mylogger/mylogger_2.9.1/1.0-SNAPSHOT/ivys/ivy.xml
[success] Total time: 4 s, completed Mar 19, 2012 8:57:28 PM
如果您查看$ PLAY_HOME / repository / local,現在將看到一個名為mylogger的目錄。 由于我們沒有提供組織名稱,因此該組織與模塊本身具有相同的名稱。 進入mylogger,您將看到工件– mylogger_2.9.1。 文件名的2.9.1部分來自Play本身,并且(似乎是)版本控制。 如果有人對此有更多了解,請發表評論并告訴我。
在mylogger_2.9.1中,我們具有模塊版本,在本例中為1.0-SNAPSHOT,而該版本又包含jar文件,源jar,Maven和Iyy信息等。
所有這些信息從何而來? 它基于project / Build.scala文件。 在這里,您可以提供模塊的名稱,組織,版本和其他各種信息。 目前,我們將保持原樣,但是隨著我們對某些問題的深入了解,此極其重要的文件將得到更新。
4.提供樣品
您可以編寫世界上最好,最令人難以置信的有用模塊,但是如果沒有示例應用程序來a)展示它的工作原理,b)展示它的工作原理,那么您將難以令人信服。 這就是為什么我們在最初創建模塊時將目錄結構改回原來的原因。 打開另一個終端,然后轉到mylogger / samples目錄-現在該展示mylogger可以做什么。
4.1一個示例應用程序是一個Play應用程序
由于我們正在編寫一個Play模塊,因此提供一個Play應用程序作為示例很有意義。 現在我們在mylogger /示例中,使用“播放新的mylogger-示例”來創建示例應用程序。 同樣,選擇選項2來制作一個簡單的Java應用程序。
4.2聲明依賴
為了使用mylogger,我們必須在mylogger-sample / project / Build.scala中為其聲明一個依賴項。 打開此文件,然后更改
val appDependencies = Seq(// Add your project dependencies here,)
至
val appDependencies = Seq("mylogger" % "mylogger_2.9.1" % "1.0-SNAPSHOT")
您可以看到這與mylogger / mylogger_2.9.1 / 1.0-SNAPSHOT的存儲庫路徑匹配。
懶洋洋地,我們還將聲明本地存儲庫為查找模塊的地方。 更改
val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(// Add your own project settings here)
至
val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(resolvers += "Local Play Repository" at "file://path/to/play-2.0/repository/local")
(但更改路徑以適合您的本地安裝)
在mylogger / samples / mylogger-sample目錄中,使用“ play”啟動Play控制臺。 如果使用“ dependencies”命令,您將看到mylogger現在是應用程序的依賴項。
重要的提示! 自從我們在更改Build.scala后啟動了Play控制臺以來,所做的更改將自動被提取。 如果在控制臺打開時更改此文件,請使用“重新加載”以確保使用了更改。
4.2使用模塊
在您新的默認Play應用程序中,我們將向控制器/Application.java添加一行以調用MyLogger:
package controllers;import play.mvc.Controller;
import play.mvc.Result;
import views.html.index;public class Application extends Controller
{public static Result index(){MyLogger.log("Here's my log message");return ok(index.render("Your new application is ready."));}
}
請注意,我們不需要導入MyLogger,因為它也在controllers軟件包中。
“運行”該應用程序,然后轉到http:// localhost:9000。 片刻之后,頁面將呈現出來,您將在控制臺中看到
[info] play - Application started (Dev)
MyLogger: Here's my log message
重新加載頁面幾次,您會看到每次都出現日志消息。
5.再喝一杯啤酒
恭喜,您現在有了一個模塊和一個工作示例。 它實際上并沒有為您的示例應用程序增加多少價值,但這將在第2部分中得到解決。同時,將頭放在冰箱上,為自己準備另一杯啤酒。
您可以在此處下載此示例的完整源代碼
參考: Play 2的編寫模塊,第1部分:在Objectify博客上從我們的JCG合作伙伴 Steve Chaloner獲得幫助。
翻譯自: https://www.javacodegeeks.com/2012/04/writing-modules-for-play-2-part-1-get.html