簡體   English   中英

如何在playFramework 2.3.x中訪問子項目中父項目的類

[英]how to access parent project's classes in sub project in playFramework 2.3.x

我正在使用play 2.3.8並使用此gudie在我的項目中創建子項目,我創建了子項目“ mySubProject”,然后在月食中將項目導入了父項目myParentProjectmySubProject現在我首先有兩個問題->這是否正確首先,我進口myParentProject在日食的話,我進口mySubProject二線>在我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"
)

這是子項目mySubProject構建文件

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創建了一個類,這里​​是代碼

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
}

請指導我如何在子項目中導入根項目的包/類

這是一個古老的問題,但仍被認為是一個答案。

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,然后在根項目中使用該路由,這意味着根build.sbt必須為:

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

如果然后將根項目導入到moduleone中,它將變成一個循環,它將永遠不會編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM