From 9f4045888d0a2a83f507ebf4613200eaf03bdae3 Mon Sep 17 00:00:00 2001 From: Heiko Seeberger Date: Tue, 20 Jul 2010 12:01:02 +0200 Subject: [PATCH] closes #31: Some fixes to the O-S-G-i settings in SBT project file; also deleted superfluous bnd4sbt.jar in project/build/lib directory. --- project/build/AkkaProject.scala | 151 +++++++++++++++++++------------- project/build/lib/bnd4sbt.jar | Bin 8092 -> 0 bytes 2 files changed, 91 insertions(+), 60 deletions(-) delete mode 100644 project/build/lib/bnd4sbt.jar diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index d1e125f07d..b24f477d75 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -16,6 +16,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // Compile settings // ------------------------------------------------------------------------------------------------------------------- + override def compileOptions = super.compileOptions ++ Seq("-deprecation", "-Xmigration", @@ -29,6 +30,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // Deploy/dist settings // ------------------------------------------------------------------------------------------------------------------- + lazy val deployPath = info.projectPath / "deploy" lazy val distPath = info.projectPath / "dist" def distName = "%s_%s-%s.zip".format(name, buildScalaVersion, version) @@ -37,6 +39,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // All repositories *must* go here! See ModuleConigurations below. // ------------------------------------------------------------------------------------------------------------------- + object Repositories { lazy val AkkaRepo = MavenRepository("Akka Repository", "http://scalablesolutions.se/akka/repository") lazy val CodehausSnapshotRepo = MavenRepository("Codehaus Snapshots", "http://snapshots.repository.codehaus.org") @@ -54,6 +57,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // must be resolved from a ModuleConfiguration. This will result in a significant acceleration of the update action. // Therefore, if repositories are defined, this must happen as def, not as val. // ------------------------------------------------------------------------------------------------------------------- + import Repositories._ lazy val atmosphereModuleConfig = ModuleConfiguration("org.atmosphere", SonatypeSnapshotRepo) lazy val grizzlyModuleConfig = ModuleConfiguration("com.sun.grizzly", JavaNetRepo) @@ -74,6 +78,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // Versions // ------------------------------------------------------------------------------------------------------------------- + lazy val ATMO_VERSION = "0.6" lazy val CAMEL_VERSION = "2.4.0" lazy val CASSANDRA_VERSION = "0.6.1" @@ -90,6 +95,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // Dependencies // ------------------------------------------------------------------------------------------------------------------- + object Dependencies { // Compile @@ -149,16 +155,16 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val jsr311 = "javax.ws.rs" % "jsr311-api" % "1.1" % "compile" - lazy val jta_1_1 = "org.apache.geronimo.specs" % "geronimo-jta_1.1_spec" % "1.1.1" % "compile" intransitive() + lazy val jta_1_1 = "org.apache.geronimo.specs" % "geronimo-jta_1.1_spec" % "1.1.1" % "compile" intransitive - lazy val lift = "net.liftweb" % "lift-webkit" % LIFT_VERSION % "compile" - lazy val lift_util = "net.liftweb" % "lift-util" % LIFT_VERSION % "compile" + lazy val lift_util = "net.liftweb" % "lift-util" % LIFT_VERSION % "compile" + lazy val lift_webkit = "net.liftweb" % "lift-webkit" % LIFT_VERSION % "compile" lazy val log4j = "log4j" % "log4j" % "1.2.15" % "compile" lazy val mongo = "org.mongodb" % "mongo-java-driver" % "1.4" % "compile" - lazy val multiverse = "org.multiverse" % "multiverse-alpha" % MULTIVERSE_VERSION % "compile" intransitive() + lazy val multiverse = "org.multiverse" % "multiverse-alpha" % MULTIVERSE_VERSION % "compile" intransitive lazy val netty = "org.jboss.netty" % "netty" % "3.2.1.Final" % "compile" @@ -203,6 +209,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // Subprojects // ------------------------------------------------------------------------------------------------------------------- + lazy val akka_core = project("akka-core", "akka-core", new AkkaCoreProject(_)) lazy val akka_amqp = project("akka-amqp", "akka-amqp", new AkkaAMQPProject(_), akka_core) lazy val akka_http = project("akka-http", "akka-http", new AkkaHttpProject(_), akka_core, akka_camel) @@ -212,10 +219,13 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val akka_jta = project("akka-jta", "akka-jta", new AkkaJTAProject(_), akka_core) lazy val akka_kernel = project("akka-kernel", "akka-kernel", new AkkaKernelProject(_), akka_core, akka_http, akka_spring, akka_camel, akka_persistence, akka_amqp) + lazy val akka_osgi = project("akka-osgi", "akka-osgi", new AkkaOSGiParentProject(_)) lazy val akka_samples = project("akka-samples", "akka-samples", new AkkaSamplesParentProject(_)) - // ------------------------------------------------------------ - // Run Akka microkernel using 'sbt run' + use for packaging executable JAR + // ------------------------------------------------------------------------------------------------------------------- + // Miscellaneous + // ------------------------------------------------------------------------------------------------------------------- + override def mainClass = Some("se.scalablesolutions.akka.kernel.Main") override def packageOptions = @@ -303,6 +313,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // akka-core subproject // ------------------------------------------------------------------------------------------------------------------- + class AkkaCoreProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) with CodeFellowPlugin { val aopalliance = Dependencies.aopalliance val commons_codec = Dependencies.commons_codec @@ -333,6 +344,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // akka-amqp subproject // ------------------------------------------------------------------------------------------------------------------- + class AkkaAMQPProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) with CodeFellowPlugin { val commons_io = Dependencies.commons_io val rabbit = Dependencies.rabbit @@ -346,6 +358,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // akka-http subproject // ------------------------------------------------------------------------------------------------------------------- + class AkkaHttpProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) with CodeFellowPlugin { val annotation = Dependencies.annotation val atmo = Dependencies.atmo @@ -374,6 +387,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // akka-camel subproject // ------------------------------------------------------------------------------------------------------------------- + class AkkaCamelProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) with CodeFellowPlugin { val camel_core = Dependencies.camel_core } @@ -381,6 +395,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // akka-persistence subproject // ------------------------------------------------------------------------------------------------------------------- + class AkkaPersistenceParentProject(info: ProjectInfo) extends ParentProject(info) { lazy val akka_persistence_common = project("akka-persistence-common", "akka-persistence-common", new AkkaPersistenceCommonProject(_), akka_core) @@ -403,6 +418,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // akka-persistence-redis subproject // ------------------------------------------------------------------------------------------------------------------- + class AkkaRedisProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val commons_codec = Dependencies.commons_codec val redis = Dependencies.redis @@ -413,6 +429,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // akka-persistence-mongo subproject // ------------------------------------------------------------------------------------------------------------------- + class AkkaMongoProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val mongo = Dependencies.mongo @@ -422,6 +439,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // akka-persistence-cassandra subproject // ------------------------------------------------------------------------------------------------------------------- + class AkkaCassandraProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val cassandra = Dependencies.cassandra val log4j = Dependencies.log4j @@ -440,11 +458,13 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // akka-kernel subproject // ------------------------------------------------------------------------------------------------------------------- + class AkkaKernelProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) // ------------------------------------------------------------------------------------------------------------------- // akka-spring subproject // ------------------------------------------------------------------------------------------------------------------- + class AkkaSpringProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) with CodeFellowPlugin { val spring_beans = Dependencies.spring_beans val spring_context = Dependencies.spring_context @@ -458,6 +478,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // akka-jta subproject // ------------------------------------------------------------------------------------------------------------------- + class AkkaJTAProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) with CodeFellowPlugin { val atomikos_transactions = Dependencies.atomikos_transactions val atomikos_transactions_api = Dependencies.atomikos_transactions_api @@ -466,7 +487,19 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { //val atomikos_transactions_util = "com.atomikos" % "transactions-util" % "3.2.3" % "compile" } - // ================= OSGi Packaging ================== + // ------------------------------------------------------------------------------------------------------------------- + // OSGi stuff + // ------------------------------------------------------------------------------------------------------------------- + + class AkkaOSGiParentProject(info: ProjectInfo) extends ParentProject(info) { + lazy val akka_osgi_dependencies_bundle = project("akka-osgi-dependencies-bundle", "akka-osgi-dependencies-bundle", + new AkkaOSGiDependenciesBundleProject(_), akka_kernel, akka_jta) // akka_kernel does not depend on akka_jta (why?) therefore we list akka_jta here + lazy val akka_osgi_assembly = project("akka-osgi-assembly", "akka-osgi-assembly", + new AkkaOSGiAssemblyProject(_), akka_osgi_dependencies_bundle, akka_core, akka_amqp, akka_http, + akka_camel, akka_spring, akka_jta, akka_persistence.akka_persistence_common, + akka_persistence.akka_persistence_redis, akka_persistence.akka_persistence_mongo, + akka_persistence.akka_persistence_cassandra) + } class AkkaOSGiDependenciesBundleProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) with BNDPlugin { override def bndClasspath = compileClasspath @@ -497,73 +530,69 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { class AkkaOSGiAssemblyProject(info: ProjectInfo) extends DefaultProject(info) { // Scala bundle - val scala_bundle = "com.weiglewilczek.scala-lang-osgi" % "scala-library_2.8.0.RC3" % "1.0" % "compile" intransitive() + val scala_bundle = "com.weiglewilczek.scala-lang-osgi" % "scala-library" % buildScalaVersion % "compile" intransitive // Lift bundles - val lift_actor = "net.liftweb" % "lift-actor" % LIFT_VERSION % "compile" intransitive() - val lift_common = "net.liftweb" % "lift-common" % LIFT_VERSION % "compile" intransitive() - val lift_json = "net.liftweb" % "lift-json" % LIFT_VERSION % "compile" intransitive() - val lift_util = "net.liftweb" % "lift-util" % LIFT_VERSION % "compile" intransitive() - //val lift_webkit = "net.liftweb" % "lift-webkit" % LIFT_VERSION % "compile" intransitive() - //val lift_testkit = "net.liftweb" % "lift-testkit" % LIFT_VERSION % "compile" intransitive() +// val lift_util = Dependencies.lift_util.intransitive +// val lift_actor = "net.liftweb" % "lift-actor" % LIFT_VERSION % "compile" intransitive +// val lift_common = "net.liftweb" % "lift-common" % LIFT_VERSION % "compile" intransitive +// val lift_json = "net.liftweb" % "lift-json" % LIFT_VERSION % "compile" intransitive // Camel bundles - val camel_core = "org.apache.camel" % "camel-core" % "2.3.0" % "compile" intransitive() - val fusesource_commonman = "org.fusesource.commonman" % "commons-management" % "1.0" intransitive() + val camel_core = Dependencies.camel_core.intransitive + val fusesource_commonman = "org.fusesource.commonman" % "commons-management" % "1.0" intransitive // Spring bundles - val spring_beans = "org.springframework" % "spring-beans" % "3.0.2.RELEASE" % "compile" intransitive() - val spring_context = "org.springframework" % "spring-context" % "3.0.2.RELEASE" % "compile" intransitive() - val spring_jms = "org.springframework" % "spring-jms" % "3.0.2.RELEASE" % "compile" intransitive() - val spring_aop = "org.springframework" % "spring-aop" % "3.0.2.RELEASE" % "compile" intransitive() - val spring_asm = "org.springframework" % "spring-asm" % "3.0.2.RELEASE" % "compile" intransitive() - val spring_core = "org.springframework" % "spring-core" % "3.0.2.RELEASE" % "compile" intransitive() - val spring_expression = "org.springframework" % "spring-expression" % "3.0.2.RELEASE" % "compile" intransitive() - val spring_tx = "org.springframework" % "spring-tx" % "3.0.2.RELEASE" % "compile" intransitive() + val spring_beans = Dependencies.spring_beans.intransitive + val spring_context = Dependencies.spring_context.intransitive + val spring_aop = "org.springframework" % "spring-aop" % SPRING_VERSION % "compile" intransitive + val spring_asm = "org.springframework" % "spring-asm" % SPRING_VERSION % "compile" intransitive + val spring_core = "org.springframework" % "spring-core" % SPRING_VERSION % "compile" intransitive + val spring_expression = "org.springframework" % "spring-expression" % SPRING_VERSION % "compile" intransitive + val spring_jms = "org.springframework" % "spring-jms" % SPRING_VERSION % "compile" intransitive + val spring_tx = "org.springframework" % "spring-tx" % SPRING_VERSION % "compile" intransitive - val commons_io = "commons-io" % "commons-io" % "1.4" % "compile" intransitive() - val commons_pool = "commons-pool" % "commons-pool" % "1.5.4" % "compile" intransitive() - val commons_codec = "commons-codec" % "commons-codec" % "1.4" % "compile" intransitive() - val commons_fileupload = "commons-fileupload" % "commons-fileupload" % "1.2.1" % "compile" intransitive() - val jackson_core = "org.codehaus.jackson" % "jackson-core-asl" % "1.2.1" % "compile" intransitive() - val jackson = "org.codehaus.jackson" % "jackson-mapper-asl" % "1.2.1" % "compile" intransitive() - val netty = "org.jboss.netty" % "netty" % "3.2.0.CR1" % "compile" intransitive() - val guicey = "org.guiceyfruit" % "guice-all" % "2.0" % "compile" intransitive() - val joda = "joda-time" % "joda-time" % "1.6" intransitive() + val commons_codec = Dependencies.commons_codec.intransitive + val commons_io = Dependencies.commons_io.intransitive + val commons_pool = Dependencies.commons_pool.intransitive + val guicey = Dependencies.guicey.intransitive + val jackson = Dependencies.jackson.intransitive + val jackson_core = Dependencies.jackson_core.intransitive + val jsr311 = Dependencies.jsr311.intransitive + val jta_1_1 = Dependencies.jta_1_1.intransitive + val netty = Dependencies.netty.intransitive + val commons_fileupload = "commons-fileupload" % "commons-fileupload" % "1.2.1" % "compile" intransitive + val jms_1_1 = "org.apache.geronimo.specs" % "geronimo-jms_1.1_spec" % "1.1.1" % "compile" intransitive + val joda = "joda-time" % "joda-time" % "1.6" intransitive - val jta_1_1 = "org.apache.geronimo.specs" % "geronimo-jta_1.1_spec" % "1.1.1" % "compile" intransitive() - val jms_1_1 = "org.apache.geronimo.specs" % "geronimo-jms_1.1_spec" % "1.1.1" % "compile" intransitive() - val jsr311 = "javax.ws.rs" % "jsr311-api" % "1.1" % "compile" intransitive() + override def packageAction = + task { + val libs: Seq[Path] = managedClasspath(config("compile")).get.toSeq + val prjs: Seq[Path] = info.dependencies.toSeq.asInstanceOf[Seq[DefaultProject]] map { _.jarPath } + val all = libs ++ prjs + val destination = outputPath / "bundles" + FileUtilities.copyFlat(all, destination, log) + log info "Copied %s bundles to %s".format(all.size, destination) + None + } - override def packageAction = { - val libs: Seq[Path] = managedClasspath(config("compile")).get.toSeq - val prjs: Seq[Path] = info.dependencies.toSeq.asInstanceOf[Seq[DefaultProject]].map(_.jarPath) - val all = libs ++ prjs - FileUtilities.copyFlat(all, outputPath / "bundles", log) - super.packageAction - } + override def artifacts = Set.empty } - class AkkaOSGiParentProject(info: ProjectInfo) extends ParentProject(info) { - lazy val akka_osgi_dependencies_bundle = project("akka-osgi-dependencies-bundle", "akka-osgi-dependencies-bundle", - new AkkaOSGiDependenciesBundleProject(_), akka_kernel, - akka_jta // akka_kernel does not depend on akka_jta (why?) therefore we list akka_jta here - ) - lazy val akka_osgi_assembly = project("akka-osgi-assembly", "akka-osgi-assembly", - new AkkaOSGiAssemblyProject(_), akka_osgi_dependencies_bundle, akka_core, akka_amqp, akka_http, - akka_camel, akka_spring, akka_jta, akka_persistence.akka_persistence_common, - akka_persistence.akka_persistence_redis, akka_persistence.akka_persistence_mongo, - akka_persistence.akka_persistence_cassandra) - } + // ------------------------------------------------------------------------------------------------------------------- + // Test + // ------------------------------------------------------------------------------------------------------------------- - // ================= TEST ================== class AkkaActiveObjectTestProject(info: ProjectInfo) extends DefaultProject(info) { // testing val junit = "junit" % "junit" % "4.5" % "test" val jmock = "org.jmock" % "jmock" % "2.4.0" % "test" } - // ================= EXAMPLES ================== + // ------------------------------------------------------------------------------------------------------------------- + // Examples + // ------------------------------------------------------------------------------------------------------------------- + class AkkaSampleAntsProject(info: ProjectInfo) extends DefaultSpdeProject(info) with CodeFellowPlugin { // val scalaToolsSnapshots = ScalaToolsSnapshots override def spdeSourcePath = mainSourcePath / "spde" @@ -574,8 +603,8 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { class AkkaSampleLiftProject(info: ProjectInfo) extends DefaultWebProject(info) with DeployProject with CodeFellowPlugin { val commons_logging = Dependencies.commons_logging - val lift = Dependencies.lift val lift_util = Dependencies.lift_util + val lift_webkit = Dependencies.lift_webkit val servlet = Dependencies.servlet // testing @@ -649,8 +678,10 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { new AkkaSampleOSGiProject(_), akka_core) } - // ------------------------------------------------------------ - // helper functions + // ------------------------------------------------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------------------------------------------------- + def removeDupEntries(paths: PathFinder) = Path.lazyPathFinder { val mapped = paths.get map { p => (p.relativePath, p) } @@ -675,7 +706,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { ) } - def akkaArtifacts = descendents(info.projectPath / "dist", "*" + buildScalaVersion + "_osgi-" + version + ".jar") + def akkaArtifacts = descendents(info.projectPath / "dist", "*" + buildScalaVersion + "-" + version + ".jar") // ------------------------------------------------------------ class AkkaDefaultProject(info: ProjectInfo, val deployPath: Path) extends DefaultProject(info) with DeployProject with OSGiProject diff --git a/project/build/lib/bnd4sbt.jar b/project/build/lib/bnd4sbt.jar deleted file mode 100644 index 5906b493003a67283602179ffdf24d15acdeb0b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8092 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