3

私は SBT/scala を使用していますが、SBT は Maven 構造に基づいているため、この質問は Maven/Java プロジェクトにも当てはまる可能性があります。

共通の webapp デプロイメントを共有するマルチ モジュール アプリケーションをセットアップしたいと考えています。Maven/SBT でどのようにプロジェクトを構築し、パッケージのステップで webapp を利用できるようにする必要がありますか?

構造

sharedlibrary/
   webapp/
module1
module2
module3

そのため、module1 (sharedlibrary に依存) をパッケージ化するときに、最終的な war ファイルに webapp を含めたいと思います。webapp には、起動されたサーバーに基づいて正しい Module1 Main クラスをロードするコードが含まれます。maven/sbtで簡単にそれは可能ですか?

4

2 に答える 2

1

私はsbtの複雑さにあまり精通していませんが、最近、やや似たようなプロジェクトを立ち上げ始めました。これが私があなたの状況のた​​めに最初に試みることです。

1)モジュール*フォルダと同じレベルに「プロジェクト」サブディレクトリを作成します。

2)次の内容の新しいファイル「project/Build.scala」を作成します。必ずdestPath値を必要なディレクトリ名に変更してください。この例のパスは、各モジュールwar内のフォルダーを使用してGoogleAppEngineで動作するように設定されています。

import sbt._
import Keys._

object MyBuild extends Build {
  lazy val copyDependencies = TaskKey[Unit]("copy-dependencies")
  def copyDepTask = copyDependencies <<= {
    (dependencyClasspath in Runtime, baseDirectory) map { (dep, bp) => 
    for (attrSrcPath <- dep) {
      val srcPath = attrSrcPath.data
      println(srcPath);
      if (!srcPath.isDirectory) {
        val destPath = bp / "war/WEB-INF/lib" / srcPath.getName
        IO.copyFile(srcPath, destPath, preserveLastModified=true)
      }
      else {
        val destPath = bp / "war/WEB-INF/classes/"
        IO.copyDirectory(srcPath, destPath, preserveLastModified=true)
      }
    }
  }

  lazy val webapp = Project("webapp", file("sharedlibrary/webapp"))
  lazy val module1 = Project("module1", file("module1"),
      settings = Project.defaultSettings ++ Seq(copyDepTask)
    ) dependsOn(webapp)
  lazy val module2 = Project("module2", file("module2"),
      settings = Project.defaultSettings ++ Seq(copyDepTask)
    ) dependsOn(webapp)
  lazy val module3 = Project("module3", file("module3"),
      settings = Project.defaultSettings ++ Seq(copyDepTask)
    ) dependsOn(webapp)
}

3)sbt内から、とを入力するproject module1copy-dependencies、sbtはクラスファイルをwebappからmodule1war/WEB-INF/classesに、依存jarをにコピーしますwar/WEB-INF/lib

Google App Engineの場合、開発サーバーを実行する前、またはプロジェクトをappspotにアップロードする前にこれを行います。これは正常に機能しますが、いつかプロセスを自動化するとよいでしょう。

于 2012-05-26T15:56:21.807 に答える
0

はい

SBT マルチプロジェクトを参照してください。

https://github.com/harrah/xsbt/wiki/Getting-Started-Multi-Project

および sbt-assembly プラグイン:

https://github.com/sbt/sbt-assembly

于 2012-05-26T07:27:16.183 に答える