编写Play 2的模块,第1部分:使工作正常
重要的是要注意,這不是權(quán)威指南,而是我在處理自己的模塊時所使用的信息和技術(shù)的集合。
我將假設您已經(jīng)安裝了Play 2,如果沒有,請直接訪問http://www.playframework.org/documentation/2.0/Installing ,以獲取有關(guān)如何進行設置的詳細信息。
在第一部分中,我們將介紹創(chuàng)建和發(fā)布模塊以及添加示例應用程序的基礎知識。 接下來的兩部分將更深入地介紹插件,攔截器,標簽和其他有用的工具。
首先,簡要介紹一下模塊和庫之間的區(qū)別。 在Play 1.x中,使用“ play new-module”創(chuàng)建了一個模塊,并通過模塊存儲庫進行分發(fā)。 在Play 1.1之前,模塊都是通過application.conf條目控制的,并且?guī)焓窃诒镜靥砑拥摹?從Play 1.2開始,模塊和庫都通過基于Ivy的依賴關(guān)系管理機制進行控制。 不過,在這兩種情況下,都有一個明確的模塊概念(與Play緊密集成,遵循Play的封裝結(jié)構(gòu)等約定)和一個庫(一個通用的第三方庫)。
在播放2中,線條模糊到一定程度。 現(xiàn)在,通過Ivy或Maven,模塊以與庫相同的方式分發(fā),并且包結(jié)構(gòu)可以是任意的,因此您可以擁有傳統(tǒng)的com.example.whatever結(jié)構(gòu)。 從這個角度來看,模塊和庫之間的唯一真正區(qū)別是模塊直接使用Play API。
其次,關(guān)于語言的說明。 由于Play 2本身支持Java和Scala,因此您可以使用任何一種語言來實現(xiàn)模塊。 如果模塊具有自己的應用程序可以使用的API,則Java和Scala之間的出色互操作性意味著-在大多數(shù)情況下,您所選擇的語言與使用API??的應用程序無關(guān)。
1.入門
作為簡單的介紹,我們將創(chuàng)建一個基本的日志記錄模塊,該模塊遵循行業(yè)最佳實踐,將輸出寫入控制臺窗口。 這個模塊稱為mylogger,因為它是星期一,而我現(xiàn)在并不覺得很有創(chuàng)意。 該模塊(主要)將用Java編寫。
您可以將Play 2模塊視為是Play 2應用程序,其中缺少一些文件。 因此,您可以按照與應用程序相同的方式來創(chuàng)建模塊。 轉(zhuǎn)到或創(chuàng)建用于保存項目的目錄,然后使用“播放新的Mylogger”創(chuàng)建應用。 出現(xiàn)提示時選擇選項2,以創(chuàng)建一個簡單的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!因為我們將在模塊旁邊有一個示例應用程序,所以我們將稍微更改目錄結(jié)構(gòu)。 目前,它看起來像這樣:
mylogger – app – conf – project – public – target – .gitignore – README在mylogger目錄中,創(chuàng)建兩個新目錄,項目代碼和示例。 將上面列出的所有文件復制到項目代碼目錄中。 您現(xiàn)在應該擁有
mylogger – samples – project-code– app– conf– project– public– target– .gitignore– READMEconf目錄包含兩個文件-路由和application.conf。
– Play必須存在application.conf才能將mylogger /項目代碼識別為Play應用程序,因此我們無法刪除它,但可以刪除其中包含的所有內(nèi)容。 模塊需要的任何配置都應添加到“實際”應用程序的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] $現(xiàn)在,我們有了一個有效的Play 2模塊(請注意,它什么也不做)。
如果您使用的是IDE,那么現(xiàn)在是創(chuàng)建項目的好時機-本教程與IDE無關(guān),因此,如果需要,您可以使用位于http://www.playframework.org/documentation/2.0/IDE的指南。去做這個。
2.添加一些功能
如上所述,Play 2模塊可以具有更傳統(tǒng)的com.example.package包結(jié)構(gòu),但是默認的Play應用程序具有傳統(tǒng)的app / controllers,app / models等結(jié)構(gòu)。 我們現(xiàn)在將其保留,并在本教程的后面部分進行更改。
2.1刀耕火種
在app文件夾中,我們具有“ play new”命令為我們創(chuàng)建的以下結(jié)構(gòu):
app – controllers– Application.java – views– index.scala.html– main.scala.html對于此模塊的初始迭代,我們不需要任何視圖,因此您可以刪除視圖包。
您也可以刪除Application.java,因為我們是從頭開始編寫的。
2.2添加一些模塊代碼
在controllers包中,創(chuàng)建一個名為MyLogger.java的新類。 它不需要擴展或?qū)崿F(xiàn)任何東西,它包含一個方法:
package controllers;/*** @author Steve Chaloner*/ public class MyLogger {public static void log(String message){System.out.println("MyLogger: " + message);} }2.3喝啤酒
您剛剛編寫了一個模塊。 去喝啤酒。
2.4啤酒后實現(xiàn)
當您凝視著現(xiàn)在空蕩蕩的杯子,充滿創(chuàng)造力的喜悅和即將來臨的行業(yè)聲譽時,您可能會意識到,實際上沒有人能夠進入您的模塊,因為它位于您的計算機上。 您需要發(fā)布它。
3.發(fā)布并受到譴責
對于此示例,我們將要發(fā)布到您的本地存儲庫。 在Play安裝的根目錄中,有一個存儲庫目錄,這是您首先推送模塊的位置。
發(fā)布之前,請始終確保已運行“干凈”,否則,從源樹中刪除的某些類/文件可能仍以編譯形式存在,并最終出現(xiàn)在模塊jar文件中。 如果該類與您實際應用程序中的類匹配,則可以在您的實際類中代替它。 真爛
在Play控制臺中,使用“ clean”,然后使用“ publish-local”打包您的模塊,并將其發(fā)布到本地倉庫:
[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,現(xiàn)在將看到一個名為mylogger的目錄。 由于我們沒有提供組織名稱,因此該組織與模塊本身具有相同的名稱。 進入mylogger,您將看到工件– mylogger_2.9.1。 文件名的2.9.1部分來自Play本身,并且(似乎是)版本控制。 如果有人對此有更多了解,請發(fā)表評論并告訴我。
在mylogger_2.9.1中,我們具有模塊版本,在本例中為1.0-SNAPSHOT,而該版本又包含jar文件,源jar,Maven和Iyy信息等。
所有這些信息從何而來? 它基于project / Build.scala文件。 在這里,您可以提供模塊的名稱,組織,版本和其他各種信息。 目前,我們將保持原樣,但是隨著我們對某些問題的深入了解,此極其重要的文件將得到更新。
4.提供樣品
您可以編寫世界上最好,最令人難以置信的有用模塊,但是如果沒有示例應用程序來a)展示它的工作原理,b)展示它的工作原理,那么您將難以令人信服。 這就是為什么我們在最初創(chuàng)建模塊時將目錄結(jié)構(gòu)改回原來的原因。 打開另一個終端,然后轉(zhuǎn)到mylogger / samples目錄-現(xiàn)在該展示mylogger可以做什么。
4.1一個示例應用程序是一個Play應用程序
由于我們正在編寫一個Play模塊,因此提供一個Play應用程序作為示例很有意義。 現(xiàn)在我們在mylogger /示例中,使用“播放新的mylogger-示例”來創(chuàng)建示例應用程序。 同樣,選擇選項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現(xiàn)在是應用程序的依賴項。
重要的提示! 自從我們在更改Build.scala后啟動了Play控制臺以來,所做的更改將自動被提取。 如果在控制臺打開時更改此文件,請使用“重新加載”以確保使用了更改。
4.2使用模塊
在您新的默認Play應用程序中,我們將向控制器/Application.java添加一行以調(diào)用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軟件包中。
“運行”該應用程序,然后轉(zhuǎn)到http:// localhost:9000。 片刻之后,頁面將呈現(xiàn)出來,您將在控制臺中看到
[info] play - Application started (Dev) MyLogger: Here's my log message重新加載頁面幾次,您會看到每次都出現(xiàn)日志消息。
5.再喝一杯啤酒
恭喜,您現(xiàn)在有了一個模塊和一個工作示例。 它實際上并沒有為您的示例應用程序增加多少價值,但這將在第2部分中得到解決。同時,將頭放在冰箱上,為自己準備另一杯啤酒。
您可以在此處下載此示例的完整源代碼
參考: Play 2的編寫模塊,第1部分:在Objectify博客上從我們的JCG合作伙伴 Steve Chaloner獲得幫助。
翻譯自: https://www.javacodegeeks.com/2012/04/writing-modules-for-play-2-part-1-get.html
總結(jié)
以上是生活随笔為你收集整理的编写Play 2的模块,第1部分:使工作正常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公筷是什么颜色 公筷的颜色
- 下一篇: Apache Camel教程– EIP,