假设我在以下结构中有2个游戏2.3x项目A和B
A
- app
- a
- controllers
- models
- integration
- conf
- build.sbt
B
- app
- b
- controllers
- otherstuff
- conf
- build.sbt
我想重新使用a.integration中的scala类和B中的a.models。我该怎么做? B在逻辑上不是A的子项目,它们是2个独立的服务(甚至不在同一个父目录中),因此文档中描述的SBT子项目的方法对我来说似乎不对。我已经尝试将A导出到一个带有SBT package
的jar并将其添加为B的托管依赖项(在lib文件夹中)但由于jar包含与B中的文件冲突的文件(例如Global)而遇到困难。斯卡拉)。我还担心这个jar的依赖关系在A和B中可能不一样,这会导致运行时失败。
另一种方法是将A的来源添加为B的附加源文件夹,以便用B编译,但我不知道SBT是否支持这个以及如何使其工作。这无法解决Global.scala和其他不需要的文件与所需软件包一起编译的问题。
回到过去,当我是一名可怜的Java开发人员时,我可以用ant和文件集在大约5分钟内解决这个问题。当然像SBT这样的现代工具可以做到这一点吗?
也许我会谈论整个事情的错误 - 头脑和托管依赖关系是它的全部意义。但是怎么做呢?不会将整个游戏应用程序A发布到maven / ivy repo导致B中出现相同的依赖冲突问题,或者我错过了某些内容(我担心我是一个完整的Maven(和SBT)新手,所以这是极有可能)
具体来说,我试图重用的代码是一堆案例类和一个包装游戏WS客户端的服务客户端,所以可能创建一个单独的(非播放)库项目,两个项目都可以使用播放WS依赖也是一种选择,但我不知道这是否有效。
任何帮助都非常感谢,提前感谢。
答案 0 :(得分:0)
正如Daenyth所说,引入一个单独的子项目(或多个),并依赖于项目A和B的项目
build.sbt <- declares all three sub-projects
webappA (depends on common)
webappB (depends on common)
common
在common
中,您必须在包含WS(com.typesafe.play % play-ws % [playversion]
)的播放库中添加依赖项,如果您想在common
中运行某种集成测试,您将拥有因为WS需要一个正在运行的播放应用程序才能使用播放测试装置。
另一个选择,如果你通常不同时使用A和B,或者它只是不适合你的项目心理模型,使它们成为一个项目的子项目,那么你可能会更好三个单独的项目,将您的common
项目发布到maven或ivy-repository,然后根据这些版本,就像您对其他库一样。