【问题标题】:Play Framework 2.4.0 - How to add an external java project dependency to play-java application projectPlay Framework 2.4.0 - 如何将外部 java 项目依赖添加到 play-java 应用程序项目
【发布时间】:2015-09-07 03:16:21
【问题描述】:

我使用以下命令创建了一个 play-java Web 应用程序:
activator new "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”play 应用程序项目中访问“Common”的所有类.

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

这意味着 playframework 找不到“Common” java eclipse 项目的类。 在搜索了很多关于这个问题后,我发现一般来说,有3个解决方案:

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" 文件,但我不知道在其中声明什么。 如果“通用”项目也必须是 SBT 项目,我知道所有 Java 源都应该在:"/src/main/java" 但我在 SBT 文档中看到它是可配置的.所以,主要问题是我仍然无法让我的外部 java 项目被我的 play web 应用程序编译和识别。
现在我只是在 "Common" 项目目录中创建了一个空的 build.sbt 文件。


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

我的问题是: 哪种方法最受推荐和推荐使用? 我该如何实施?
我没有成功找到关于这个问题的任何最佳实践或任何可以演示如何执行上述任何解决方案的基本教程。

【问题讨论】:

  • 有人吗?将不胜感激。

标签: java eclipse playframework sbt dependency-management


【解决方案1】:

我发现这种方法在 documentation 之后效果很好,它解释了 Play 用于打包单独项目的结构。

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

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 中。)

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

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

更新(见 cmets)

Build.sbt 类似于:

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

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

其他一切都按照我上面链接的示例。

【讨论】:

  • 感谢您的回复!您的解决方案并不真正适合我们的目的,因为我们在私有本地网络中工作并使用 TFS 进行源代码控制。此外,您的方法需要复制每个外部项目,这听起来使用和维护非常复杂,我们真的不希望复制所有外部 Java 项目(我们有 15 个外部项目作为“通用”)。顺便说一句,在您的解决方案中,您是否在“Common”项目的所有副本中创建了一个“build.sbt”文件 - 如果是这样,您能否上传并解释它们的内容与您的播放项目的“build.sbt”内容,这将添加它们?
  • 查看更新的答案。一切都与 GitHub/documentation 上的示例相同,但我在更新的答案中解释了一些差异。
  • Tnx!我明天试试并更新。你知道为什么你必须复制你的库项目并将它们仅作为子项目而不是在 play 项目范围之外的外部项目引用吗?另外,我注意到您的所有库项目都不包含自定义布局中的 java 源文件,例如“common/src/comm/messages/*.java”,但仅包含在 play 项目的默认布局路径中,例如:“/ modules/customer/app/models/customer/MyLibrary.java”或“/modules/customer/app/controllers/customer/Application.java”,如果java文件将在不同的自定义文件夹中,它仍然可以工作吗?跨度>
猜你喜欢
  • 2014-09-30
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 2012-12-30
相关资源
最近更新 更多