Play Framework 2.4.0 - 如何将外部java项目依赖项添加到play-java应用程序项目

时间:2015-06-21 16:43:15

标签: java eclipse playframework sbt dependency-management

我用以下命令创建了一个play-java web应用程序:
激活器新“c:\ workspace \ PlayServer”

我正在 Eclipse 中工作,并在同一个工作区中创建另一个名为“Common”的java项目(常规Java项目)。

现在,我有以下项目结构:

c:\workspace
   \--- Common (Java project)
      \--- src
           \--- comm
              \--- messages
   \--- PlayServer (Play-java 2.4.0 web application project)
      \--- app/controllers
      \--- app/views
      \--- conf
      \--- project

我想访问“PlayServer”中的“Common”项目。 在Eclipse中 - 我已将“Common”项目依赖项添加到play应用程序项目的Java构建路径中,并且所有项目都已成功构建,并且我可以访问“PlayServer”播放应用程序项目中的所有“Common”类

然而,当我使用activator run命令运行或调试“PlayServer”时, 我收到了错误: [错误] c:\ workspace \ PlayServer \ app \ controllers \ Application.java; 6
错误:包comm.messages.WebMessage不存在
[error] import comm.messages.WebMessage

这意味着playframework无法找到“Common”java eclipse项目的类。 经过大量关于这个问题的搜索,我发现一般来说,有三个解决方案:

1。将我的外部java项目发布到Ivy并在play项目的build.sbt文件中解析,如下所示:

libraryDependencies ++= Seq(
  // Adding it here somehow..
)

但我没有找到任何简单的教程可以指导我如何发布我的外部java项目并在play项目的build.sbt文件中解决它。 构建sbt文件对我来说有点神秘。

2。直接引用我的外部项目,在play项目的build.sbt中。 我尝试在我的 build.sbt - 中执行以下操作,这也没有真正起作用:

//选项1:

lazy val core = ProjectRef(file("../Common"), "Common")
lazy val root = (project in file(".")).enablePlugins(PlayScala).dependsOn(common )

//选项2:

lazy val common = RootProject(file("../common"))
lazy val root = (project in file(".")).enablePlugins(PlayScala).dependsOn(common )

//选项3:

lazy val common = file("../common").getAbsoluteFile.toURI
lazy val root = (project in file(".")).enablePlugins(PlayScala).dependsOn(common )

我在SBT文档中读过,我应该在“Common”项目中添加一个“build.sbt”文件,但我不知道要在其中声明什么。 如果“Common”项目也必须是一个SBT项目,我知道所有java源代码应该在:“/ src / main / java”但是我在SBT文档中看到它是可配置的。所以,主要问题是我仍然无法通过我的播放网络应用程序编译和识别我的外部Java项目。
现在我刚刚在“Common”项目目录中创建了一个空的 build.sbt 文件。


3。在我的播放项目的根目录中创建 lib / 目录,然后将jar文件添加到该目录。此解决方案将要求我的每个外部Java项目(如“Common”)都需要在每个构建中自动创建“jar”文件,并将生成的jar复制到我的“PlayServer” lib目录。此外,我已经读过“lib”解决方案适用于非托管依赖,因此我不确定此解决方案是否有效且正确,因为play框架使用 SBT常春藤

我的问题是: 哪种方法最受欢迎并建议使用? 我该如何实现它?
我没有成功找到有关此问题的任何最佳实践或任何可以演示如何执行上述任何解决方案的基本教程。

1 个答案:

答案 0 :(得分:1)

我发现这种方法能够很好地遵循documentation,这解释了Play用于打包单独项目的结构。

两个使用Git的存储库,一个用于common,另一个用于PlayServer。结帐Common到自己的工作区,但也将其签出到名为PlayServer的文件夹中的modules工作区:

c:\workspace
   \--- Common (checked out from Git)
      \--- src
           \--- comm
              \--- messages
   \--- PlayServer (Play-java 2.4.0 web application project)
      \--- app/controllers
      \--- app/views
      \--- conf
      \--- project
      \--- modules
         \--- Common (checked out from Git)
            \--- src
                 \--- comm
                    \--- messages

(请注意Common如何签出两次,到自己的工作区以及PlayServer/modules内。)

.gitignore应用的PlayServer中,您可以告诉它忽略modules\Common,因为它有自己独立的Git存储库。

documentation解释了如何让modules/CommonPlayServer作为单独的项目一起工作,并且sample on GitHub显示了Play'子项目的工作原理。请注意,此示例使用Play 2.3,但2.4 Migration Guide并未提及任何更改,因此可以采取相同的步骤。

更新(见评论)

Build.sbt会是这样的:

lazy val root = project.in(file("."))
  .aggregate(common)
  .dependsOn(common)

lazy val common = project.in(file("../common"))

其他所有内容均与我上面链接的示例相符。