如何在play Framework 2.3.x中的子项目中访问父项目类

问题描述 投票:1回答:1

我正在使用游戏2.3.8并使用this gudie在我的项目中创建子项目我创建子项目'mySubProject'然后我在eclipse中导入项目的父项目myParentProjectmySubProject现在我首先有两个问题 - >这是正确的第一个我在eclipse中导入myParentProject然后我导入mySubProject Second->在我的mySubProject我可以访问myParentProject的类并导入其包但在mySubProject当我想访问我的myParentProject的类/包时它不会让我这样做它显示错误Object not found这里是根项目myParentProject的构建文件

name := """myParentProject"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala)
    .aggregate(mySubProject)
    .dependsOn(mySubProject)

scalaVersion := "2.11.1"

fork in run := true

javaOptions in run ++= Seq("-J-Xms1G", "-J-Xmx2G")

val appDependencies = Seq(
  // Add your project dependencies here,
  "org.scalatestplus" %% "play" % "1.2.0" % "test"
)

lazy val mySubProject = project


libraryDependencies ++= Seq("org.scalatest" %% "scalatest" % "2.2.1" % "test"withSources() withJavadoc(),
                    "com.esotericsoftware.kryo" % "kryo" % "2.10",
                "org.mongodb" %% "casbah" % "2.8.0",
                "org.slf4j" % "slf4j-api" % "1.6.4",
                "org.elasticsearch" % "elasticsearch" % "1.6.0",
                "org.codehaus.groovy" % "groovy-all" % "2.4.0",
                "org.apache.lucene" % "lucene-expressions" % "4.10.4",
                "org.scalatest" %% "scalatest" % "2.2.1" % "test"withSources() withJavadoc(),
                "org.easymock" % "easymock" % "3.1" withSources() withJavadoc(),
                "org.mockito" % "mockito-all" % "1.9.5",
                "com.typesafe.akka" %% "akka-actor" % "2.3.6",
                "ch.qos.logback" % "logback-core" % "1.0.9",
                 "com.github.nscala-time" %% "nscala-time" % "2.0.0",
                 "net.liftweb" %% "lift-json" % "2.6+",
                 "net.liftweb" %% "lift-json" % "2.6+",
                 "com.hazelcast" % "hazelcast" % "3.5",
                 "com.hazelcast" % "hazelcast-client" % "3.5",
                 "com.twitter" % "chill-bijection_2.11" % "0.7.0"
                //,"com.codahale" % "jerkson_2.9.1" % "0.5.0"
)

这里是儿童projectmySubProject的构建文件

name := """mySubProject"""

version := "1.0-SNAPSHOT"

scalaVersion := "2.11.1"

libraryDependencies ++= Seq("org.scalatest" %% "scalatest" % "2.2.1" % "test"withSources() withJavadoc(),
                    "org.slf4j" % "slf4j-api" % "1.6.4",
                "org.elasticsearch" % "elasticsearch" % "1.6.0",
                "org.codehaus.groovy" % "groovy-all" % "2.4.0",
                "org.apache.lucene" % "lucene-expressions" % "4.10.4",
                "org.easymock" % "easymock" % "3.1" withSources() withJavadoc(),
                "org.mockito" % "mockito-all" % "1.9.5",
                "com.typesafe.akka" %% "akka-actor" % "2.3.6",
                "ch.qos.logback" % "logback-core" % "1.0.9",
                 "com.github.nscala-time" %% "nscala-time" % "2.0.0",
                 "net.liftweb" %% "lift-json" % "2.6+",
                 "net.liftweb" %% "lift-json" % "2.6+")

这里是我的父项目myParentProject中的代码,我创建了一个名为app / myPackagae / abc.scala的类,这里是代码

  package myPackagae
import mySubProject._
class abc {
def helloAbc()={
  println(" i am root project and  i am class abc ")
}
val test=new Testing
test.helloTesting()
}

mySubProject我在/mySubProject/src/main/scala-2.11/mySubProject/Testing.scala中创建了一个类,这里​​是代码

package mySubProject
//import parentProjectPackage._

import myPackagae._ //here is  an error not found: object myPackagae

class Testing {

  def helloTesting() ={
    println("i am a subproject or child project and i am class Testing")
  }
//and here i want to access class abc and its method helloAbc() but eclipse is not importing
}

请指导我如何在子项目中导入root项目的包/类

java eclipse scala playframework-2.3 sbt-0.13
1个回答
0
投票

这是一个古老的问题,但仍然认为是一个答案。

TLDR:

通常避免将根项目导入子项目,除非您确定根项目不依赖于子项目(例如,您可以将根路由设置为子模块,这是一个依赖项)。

详细解答:

以下是我遵循的项目结构:

- root  
  - app
    - controllers
    - models
- modules
  - moduleone
     - build.sbt
     - app
       - controllers.moduleone
       - models.moduleone
       - ...
  - moduletwo
    - build.sbt
    - app
      - controllers.moduletwo
      - ...
- build.sbt

下面是根项目build.sbt文件。注意子项目的dependsOn设置,它基本上将根项目添加为子项目的依赖项,因此您可以将根项目类导入子项目。

lazy val modelone: Project = project.in(file("modules/moduleone"))
  .enablePlugins(PlayScala)
  .settings(
    name := "module-one",
    libraryDependencies ++= common
  )
  .dependsOn(root)

////*******************************
//// Root module
////*******************************
val root: Project = project.in(file("."))
  .enablePlugins(PlayScala)
  .settings(
    name := "root",
    libraryDependencies ++= common
  )

在您的子项目中,您可以执行以下操作:

package models.moduleone

import models.SOMETHING_FROM_ROOT_PROJECT

...

将根项目和子项目定义到不同的包中是个好主意,这样导入就会更清晰。

另请注意,应避免子项目和根项目之间的依赖循环。我见过根项目依赖子项目获取某些功能的项目。在这种情况下,您将为根项目添加dependsOn,但如果您的子项目也执行相同的操作,则无法编译。

更常见的情况是您经常在根路由中执行此操作:

-> /api/moduleone moduleone.Routes

这会将相关流量路由到moduleone。现在,需要做的是首先编译moduleone然后在root项目中使用该路由,这意味着root build.sbt需要:

val root: Project = project.in(file("."))
  .enablePlugins(PlayScala)
  .dependsOn(moduleone)
  .aggregate(moduleone)
  .settings(
    libraryDependencies ++= common
  )

如果您随后将根项目导入moduleone,它将成为一个循环,永远不会编译。

© www.soinside.com 2019 - 2024. All rights reserved.