play 打包 模块_编写Play 2的模块,第1部分:使工作正常

play 打包 模块

几周前,我迁移了Play! 框架 1.x版本的Deadbolt应用于Play 2平台,并且对缺少有关创建模块的信息感到惊讶。 Play 1.x文档中详细介绍了该主题,这使得创建模块非常简单。 显然,需要做些事情-这是关于为Play 2创建模块和插件的三部分系列文章的第一篇。

重要的是要注意,这不是权威指南,而是我在处理自己的模块时所使用的信息和技术的集合。

我假设您已经安装了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

play 打包 模块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redhat6.8链路聚合

centos 6.X 聚合链路0、查看NetworkManager服务,停止NetworkManager服务。不做这一步很可能出问题 service NetworkManager status service NetworkManager stop1、修改三类文件 /etc/sysconfig/network-scripts/下的ifcfg-*文件 …

mysql 5.7 insert_MySQL5.7 支持一个表有多个INSERT/DELETE/UPDATE触发器

在MySQL5.6版本里,不支持一个表有多个INSERT/DELETE/UPDATE触发器。例如创建t1表两个INSERT的触发器:DELIMITER $$USE test$$DROP TRIGGER /*!50032 IF EXISTS */ t1_1$$CREATE/*!50017 DEFINER ‘admin‘‘%‘ */TRIGGER t1_1 AFTER INSERT ON t1FOR E…

Java回调机制解读

模块间调用 在一个应用系统中,无论使用何种语言开发,必然存在模块之间的调用,调用的方式分为几种: (1)同步调用 同步调用是最基本并且最简单的一种调用方式,类A的方法a()调用类B的方法b()&#…

Java TDD简介–第1部分

欢迎来到测试驱动开发 (TDD)系列的介绍。 我们将在TDD上下文中讨论Java和JUnit ,但这只是工具。 本文的主要目的是使您全面了解TDD,而无论使用哪种编程语言和测试框架。 如果您在项目中不使用TDD,那么您要么很懒&…

HDU 2629 Identity Card

简单题 给出身份证号 判断住址 和出生年月 熟练字符串的操作 主要是string::substr(s, l)//s:起始位置 l长度 1 #include <iostream>2 #include <stdio.h>3 #include <string>4 #include <string.h>5 #include <map>6 #include <fstream>…

状态模式 处理订单状态_将状态机模式实现为流处理器

状态模式 处理订单状态在我的上一个博客中&#xff0c;我说过我真的以为某些“四人行”&#xff08;GOF&#xff09;模式已经过时了&#xff0c;如果不是过时的话肯定不受欢迎。 特别是我说过StateMachine没什么用&#xff0c;因为您通常会想到另一种更简单的方式来执行您正在执…

mysql 连续签到天数_最大连续签到天数-sql

SELECT MIN(rq) as 起始日期, MAX(rq) as 终止日期, MAX(id1) - MIN(id1) 1 as 持续天数,id3 as 累计签到天数,nameFROM (SELECT datediff(rq,2020-02-01 )id1, (SELECT COUNT(1)FROM tmptableWHERE rq < a.rq andtype 是) id2,(SELECT COUNT(1)FROM tmptableWHEREtype 是…

具有代理设置的Spring Cloud AWS

在我的上一篇文章Spring和Amazon Web Services中 &#xff0c;我简要介绍了Spring Cloud AWS模块以及开发人员现在对它的期望。 从官方文档中看不出来的一件事是&#xff0c;当您的Internet连接受到代理服务器的限制时&#xff0c;如何使用此模块。 在本文中&#xff0c;我将概…

mysql两者之间_Django和MySQL - 两者之间的数据是不同的

我有一个使用MySQL作为后端的Django应用程序。我在原始MySQL记录显示一个值时遇到困难&#xff0c;但Django在Web应用程序中提供了其他内容。例如&#xff0c;我有一个客户端数据表。每条记录中的一个字段称为snailMailInvoice并且是Y / N选项 - 默认值是Y(varchar类型)。-----…

hdoj 4272 LianLianKan 数据太水

点击打开链接 题意&#xff1a; 给出一个序列&#xff0c;其中距离不超过6的两个相同的数字可以消除掉&#xff08;从上往下消&#xff0c;输入是从底向上的&#xff09;&#xff0c;问能不能全部消除。 思路&#xff1a; 状压dp http://www.cnblogs.com/swm8023/archive/2012/…

mysql 两个查询结果合并去重_《MySQL 入门教程》第 21 篇 集合操作符

文章来源&#xff1a;https://blog.csdn.net/horses/article/details/108174837来源平台&#xff1a;CSDN原文作者&#xff1a;不剪发的Tony老师数据表与集合理论中的集合非常类似&#xff0c;表是由行组成的集合。SQL 标准定义了基于行的各种集合操作&#xff1a;并集运算(UNI…

binutils工具集之---ar

1.如果要将多个.o文件生成一个库文件&#xff0c;则存在两种类型的库&#xff0c;一种是静态库&#xff0c;在linux里面后缀是.a&#xff0c;另一种是动态库&#xff0c;后缀为.so。 当可执行程序要与静态库进行链接时&#xff0c;所用到的库中的函数和数据会被拷贝到最终的可执…

jax-rs jax-ws_Google App Engine JAX-RS REST服务

jax-rs jax-ws在本文中&#xff0c;您将学习如何使用JAX-RS参考实现&#xff08;Jersey&#xff09;创建REST服务并将其部署在Google AppEngine上。 先决条件 对于本教程&#xff0c;您将需要&#xff1a; 一个Google AppEngine帐户 Eclipse Galileo&#xff08;3.5.x&#xf…

mysql锁与性能_MySQL性能优化--锁(概念)

《 MySQL性能优化&#xff0d;&#xff0d;锁》首发牧码人博客转发请加此提示MySQL基本概念&#xff0d;&#xff0d;锁介绍下对于MySQL锁机制的理解从基本概念开始&#xff1a;共享锁共享锁的代号是S&#xff0c;是Share的缩写&#xff0c;共享锁的锁粒度是行或者元组(多个行)…

[转]使用C#开发ActiveX控件

前言 ActiveX控件以前也叫做OLE控件&#xff0c;它是微软IE支持的一种软件组件或对象&#xff0c;可以将其插入到Web页面中&#xff0c;实现在浏览器端执行动态程序功能&#xff0c;以增强浏览器端的动态处理能力。通常ActiveX控件都是用C或VB语言开发&#xff0c;本文介绍另一…

用Java测试多线程代码

测试多线程代码是一个艰巨的挑战。 尝试测试并发性时获得的第一个建议是尽可能地在代码中隔离并发问题。 这是一般的设计建议&#xff0c;但在这种情况下甚至更重要。 确保首先正确地对并发构造所包装的逻辑进行单元测试。 否则&#xff0c;您可能会花费很长时间尝试找出一个并…

php pdo mysql query_PHP+MYSQL中使用PDO的query方法

一 代码class"php">PDO连接MySQL数据库IDPDO数据库时间$dbmsmysql; //数据库类型 ,对于开发者来说&#xff0c;使用不同的数据库&#xff0c;只要改这个&#xff0c;不用记住那么多的函数$hostlocalhost; //数据库主机名$dbNamedb_database15; //使用的数据库$use…

pat 团体赛练习题集 L2-008. 最长对称子串

对给定的字符串&#xff0c;本题要求你输出最长对称子串的长度。例如&#xff0c;给定"Is PAT&TAP symmetric?"&#xff0c;最长对称子串为"s PAT&TAP s"&#xff0c;于是你应该输出11。 输入格式&#xff1a; 输入在一行中给出长度不超过1000的…

在Apache Camel中使用Spring数据

Spring Data通过创建智能的DAO节省了很多时间&#xff0c;您基本上不需要编写任何代码就可以免费获得DAO。 它基本上遵循Eric Evans的DDD书中的“ 存储库模式 ” &#xff0c;并将实体视为集合。 它有一个很好的约定&#xff0c;允许您为复杂查询指定条件&#xff0c;甚至可以将…

python协程池操作mysql_python_协程方式操作数据库

#!/usr/bin/python3# -*- coding: utf-8 -*-import requestsimport geventimport pymysqlfrom gevent import monkey# 堵塞标记monkey.patch_all()class SqlSave(object):"""协程方式写入数据库"""def __init__(self):SQL_DBA {‘host‘: ‘loc…