gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:24:03 25 4
gpt4 key购买 nike

我使用以下命令创建了一个 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” Play 应用程序项目中的“Common”的所有类.

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


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

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

最佳答案

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

两个 Git 存储库,一个用于 common,一个用于 PlayServer。将 Common check out 到其自己的工作区,同时将其 check out 到名为 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 如何 check out 两次,一次 check out 到其自己的工作区,另一次 check out 到 PlayServer/modules 内。)

PlayServer 应用程序的 .gitignore 中,您可以告诉它忽略 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"))

其他所有内容均按照我上面链接的示例。

关于java - Play Framework 2.4.0 - 如何将外部 java 项目依赖项添加到 play-java 应用程序项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30966936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com