问题是:如何检索播放正在侦听的端口号,无论它是如何定义的(配置,命令行参数,或根本没有)。
此答案Retrieving port number in-application using Play Framework必须适用于Play v1,因为该代码无法编译。
在Play 2 Java中有:
Integer port = Play.application().configuration().getInt("http.port");
这不会返回实际的端口号,至少在所有情况下都不会。如果Play以:
运行run 80 -Dhttp.address=example.com
然后它返回null
。
如果播放
run -Dhttp.port 80 -Dhttp.address=example.com
然后在默认端口(9000)上开始播放。
正如biesior所指出的那样,两次提到港口是有效的:
play -Dhttp.port=80 "run 80"
这当然不是最佳的,因为Play实际上使用的是另一个,它是报告的内容。
但它会回答我关于开发模式的问题。但是,正如文档所说,Play永远不应该使用run
生成。那么start
命令的等价物是什么,并没有更好,更安全的方法吗? (我对Java版本很感兴趣,但其他人也可能想了解Scala。)
答案 0 :(得分:3)
在开发模式下运行时,您需要使用双重表示法
play -Dhttp.port=80 "run 80"
不幸的是,您必须对默认端口
执行相同的操作play -Dhttp.port=9000 "run 9000"
所以我建议编写shell脚本(或Windows中的.bat),以便轻松启动所有必需的参数。
答案 1 :(得分:0)
我使用此Scala片段来确定Play的侦听端口。不幸的是,如果未指定-Dhttp.port=...
,我必须硬编码一些默认值。
val listenPort =
if (!Play.isTest) {
System.getProperty("http.port", "9000")
}
else {
// Not on classpath: play.api.test.Helpers.testServerPort
// Instead, duplicate its implementation here:
System.getProperty("testserver.port", "19001")
}
我也想知道是否有更好的方法,例如Play.port
但我找不到任何东西 - 除了你的问题: - )
(在您的示例中,它应该是-Dhttp.port=80
而不是-Dhttp.port 80
。)
答案 2 :(得分:0)
无论指定端口如何,我都找到了获取端口的方法。使用反向路由获取Call对象,并使用absoluteUrl()方法获取包含端口的操作的绝对URL。代码段:
public class RouteController extends Controller {
public Promise<Result> getPortAction() {
Call call = com.mycom.routes.RouteController.getPortAction();
String absoluteUrl = call.absoluteURL(request());
//Here absoluteUrl would be like http://localhost:9002/...., 9002 would be the port.
...
} }