Как получить доступ к классам родительского проекта в подпроекте в playFramework 2.3.x
Я использую play 2.3.8 и использую этот gudie для создания подпроекта в своем проекте. Я создал подпроект mySubProject, а затем импортировал проект в затмение родительского проекта. myParentProject
а также mySubProject
Теперь у меня есть два вопроса - это правильно, что сначала я импортировал 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/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
}
подскажите пожалуйста как мне импортировать пакеты / классы корневого проекта в дочерний проект
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 проекта. Обратите внимание на параметр зависящий от подпроекта, он в основном добавляет корневой проект как зависимость к подпроекту, и, таким образом, вы можете импортировать корневые классы проекта в подпроект.
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 build.sbt должен быть:
val root: Project = project.in(file("."))
.enablePlugins(PlayScala)
.dependsOn(moduleone)
.aggregate(moduleone)
.settings(
libraryDependencies ++= common
)
Если вы затем импортируете корневой проект в moduleone, он становится циклом, который никогда не скомпилируется.