2014-03-28 61 views
4

我是Play框架& SBT新手。在Play类路径中添加外部文件夹

在我的Play for Java项目中,在其中一个类中,我需要使用ResourceBundle.getBundle()在我的Play应用程序之外读取属性文件。

我已经能够做到这一点在“播放控制台”模式加入我的build.sbt以下 unmanagedClasspath在运行系统+ =文件(“/ mybundle”)

当我需要运行应用程序在“生产”模式中, 我试图做dist,然后解压缩压缩文件,然后进入“bin”,然后在bin文件夹中运行生成的shell脚本。

我发现我的班级没有阅读该软件包。 (这在“Play Console”模式下很好)。 后来我注意到,在生成的shell脚本来运行游戏,有以下

declare -r app_classpath="$lib_dir/com.foo.abc-web-1.0-SNAPSHOT.jar:$lib_dir/com.foo.abc-common-1.0-SNAPSHOT.jar 

我修改行添加我的文件夹,以便它会成为

declare -r app_classpath="/mybundle:$lib_dir/com.foo.simpleproject-web-1.0-SNAPSHOT.jar:$lib_dir/com.foo.abc-common-1.0-SNAPSHOT.jar 

然后重新启动我的戏应用程序使用shell脚本,我的应用程序可以正确读取该包。

但是,上述工作必须手动完成,我想将其外部化。

我想解决的是以下几点: 1.有什么办法让我在build.sbt中指定的bundle文件夹可以在play dist中重用吗?

  1. 或者,如果以上是不可能的,玩DIST期间,有没有什么办法来指定,所以我的文件夹(即“/ mybundle”)将如上加入app_classpath?

  2. 有没有什么办法可以在我的build.sbt中的“Play控制台”模式中将文件夹外化?

BTW我也试图调用脚本文件,即 ./simpleproject -classpath“/ mybundle” 但它产生“坏的应用程序路径:-cp”当追加-classpath错误。 同样的情况下,我用-cp替换-classpath。

任何人都可以在上面提供建议吗?先进的谢谢你。

回答

1

在配送中是否包含他们的选项?如果是这样,只是这样做:

unmanagedResourceDirectories in Compile += file("/mybundle") 

除此之外,没有,SBT原生打包,生成启动脚本,不给你这种灵活性。但是你可以编写你自己的启动脚本,将它放在你的项目中的dist/bin/my-start-script.sh中,并且它会在发行版的bin目录中结束,然后你就可以使用它。确保类路径正确的一种简单方法是使用通配符类路径,即:

libdir=... 
java -classpath "/mybundle:$libdir/*" ... 
+1

碰巧在我的情况下,分发捆绑文件不是一个选项。 软件包文件将由SCM管理,根据环境的不同,文件夹路径也会不同。 由于要求对所有env使用相同的分配,因此我发现是否可以将该分发包的文件夹路径外部化。 谢谢你的帮助,詹姆斯。 – Simon2014

+1

对于我在Compile + = file(“/ mybundle”)中添加非托管资源目录没有解决问题 /mybundle没有显示在app_classpath =“...” 老实说,这是一个非常令人沮丧的事情,这样一个简单的任务是在这样一个巨大的痛苦中。 sbt中有半打classpath设置,它们都没有帮助 –

0

添加到生成的行。SBT:

scriptClasspath in bashScriptDefines ~= (cp => "../../mybundle" +: cp) 

将导致

declare -r app_classpath="$lib_dir/../../mybundle:$lib_dir/../conf/:etc... 

在启动脚本。所以可以在应用程序类路径中添加相对路径条目。

相关问题