LoginSignup
4
4

More than 5 years have passed since last update.

Skinny Frameworkでstandaloneなjarを作る

Last updated at Posted at 2014-01-13

2014/01/20追記

version 0.9.26利用

https://github.com/skinny-framework/skinny-framework/releases
skinny-blank-app.zipをダウンロード、解凍

$ cd skinny-blank-app
$ ./skinny package:standalone
$ java -jar ./standalone-build/target/scala-2.10/skinny-standalone-app-assembly-0.1.0-SNAPSHOT.jar

以上です

0.9.25以降のバージョンで、以下の手順は必要ありません。

Skinny Frameworkでjettyを組み込んだstandaloneなjarを作ってみる
scalatraのStandalone deploymentを真似すればいいはず
追記あり

skinny-blank-appを取得

skinny-blank-app.zipをダウンロード、解凍
(ここではversion 0.9.24を利用)

jettyの設定

まずはjettyを起動するためのLauncherスクリプトを先ほどのStandalone deploymentからコピペして、src/main/scala/JettyLauncher.scalaに保存

project/Build.scalaにstandaloneで動かすために必要なdependencyを追加
(あとjettyが9系だとエラーが出るので8系に下げる)

 -  val jettyVersion = "9.0.7.v20131107"
 +  //val jettyVersion = "9.0.7.v20131107"
 +  val jettyVersion = "8.1.14.v20131031"

   val _resolovers = Seq(
      "sonatype releases"  at "http://oss.sonatype.org/content/repositories/releases"
 @@ -24,7 +25,10 @@ object SkinnyAppBuild extends Build {
      "org.skinny-framework" %% "skinny-task"        % skinnyVersion,
      "com.h2database"       %  "h2"                 % "1.3.174", // your JDBC driver
      "ch.qos.logback"       %  "logback-classic"    % "1.0.13",
 -    "org.skinny-framework" %% "skinny-test"        % skinnyVersion         % "test"
 +    "org.skinny-framework" %% "skinny-test"        % skinnyVersion         % "test",
 +    "org.eclipse.jetty"    %  "jetty-webapp"       % jettyVersion          % "compile",
 +    "org.eclipse.jetty"    %  "jetty-servlet"      % jettyVersion          % "compile",
 +    "org.eclipse.jetty"    %  "jetty-server"       % jettyVersion          % "compile"
    )

sbt-assemblyを導入

build.sbtを修正

import AssemblyKeys._

assemblySettings

mainClass in assembly := Some("com.example.JettyLauncher")

initialCommands := """
import _root_.controller._, model._
import org.joda.time._
import scalikejdbc._, SQLInterpolation._, config._
DBsWithEnv("development").setupAll()
"""

project/plugins.sbtに追記

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.10.2")

ビルド

skinnyシェルスクリプトを参考に、css/jsのプリコンパイル後、assemblyを実行する
skinny packageやskinny publishを実行したときに行われる処理は以下の通り

rm -rf build
mkdir build
cp -pr src build/src
cp -pr build.sbt build/build.sbt
sbt "task/run assets:precompile" build/package # or sbt "task/run assets:precompile" build/publish

毎回buildディレクトリを新規作成し、そこ以下でプリコンパイル、ビルドを行っているので、
assemblyも同様にやってやればよいはず。

$ rm -r build;mkdir build;cp -pr src build/src;cp -pr build.sbt build/build.sbt
$ sbt "task/run assets:precompile" build/assembly

これで、build/target/scala-2.10/skinny-blank-app-assembly-0.0.1-SNAPSHOT.jarができた
jarを実行

$ java -jar build/target/scala-2.10/skinny-blank-app-assembly-0.0.1-SNAPSHOT.jar

8080ポートにアクセスするとskinnyのサンプルアプリが表示されるはず

まとめrepository
- https://github.com/ise/skinny-blank-app-standalone
- https://github.com/ise/skinny-blank-app-standalone/commit/f98c563c544bd8d42e1fe864133d9b1ded325ddd

参考

jettyのバージョンについて

9.0.7.v20131107だと以下のようなエラーでビルドに失敗したため、8.1.14.v20131031に下げたけど、これでよかったのだろうか

[info] RootControllerSpec:
java.lang.NoSuchMethodError: org.eclipse.jetty.server.Connector.getHost()Ljava/lang/String;
    at org.scalatra.test.EmbeddedJettyContainer$class.baseUrl(EmbeddedJettyContainer.scala:40)
    at controller.RootControllerSpec.baseUrl(RootControllerSpec.scala:6)
    at org.scalatra.test.HttpComponentsClient$class.submit(HttpComponentsClient.scala:63)
    at controller.RootControllerSpec.submit(RootControllerSpec.scala:6)
    at org.scalatra.test.Client$class.get(Client.scala:44)
    at controller.RootControllerSpec.get(RootControllerSpec.scala:6)
    at controller.RootControllerSpec$$anonfun$1.apply$mcV$sp(RootControllerSpec.scala:11)
    at controller.RootControllerSpec$$anonfun$1.apply(RootControllerSpec.scala:11)
    at controller.RootControllerSpec$$anonfun$1.apply(RootControllerSpec.scala:11)
    at org.scalatest.FlatSpec$$anon$1.apply(FlatSpec.scala:2977)
    at org.scalatest.Suite$class.withFixture(Suite.scala:1974)
    at controller.RootControllerSpec.withFixture(RootControllerSpec.scala:6)
    at org.scalatest.FlatSpec$class.invokeWithFixture$1(FlatSpec.scala:2974)
    at org.scalatest.FlatSpec$$anonfun$runTest$1.apply(FlatSpec.scala:2983)
    at org.scalatest.FlatSpec$$anonfun$runTest$1.apply(FlatSpec.scala:2983)
    at org.scalatest.SuperEngine.runTestImpl(Engine.scala:198)
    at org.scalatest.FlatSpec$class.runTest(FlatSpec.scala:2983)
    at controller.RootControllerSpec.runTest(RootControllerSpec.scala:6)
    at org.scalatest.FlatSpec$$anonfun$runTests$1.apply(FlatSpec.scala:3045)
    at org.scalatest.FlatSpec$$anonfun$runTests$1.apply(FlatSpec.scala:3045)
    at org.scalatest.SuperEngine$$anonfun$org$scalatest$SuperEngine$$runTestsInBranch$1.apply(Engine.scala:260)
    at org.scalatest.SuperEngine$$anonfun$org$scalatest$SuperEngine$$runTestsInBranch$1.apply(Engine.scala:249)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at org.scalatest.SuperEngine.org$scalatest$SuperEngine$$runTestsInBranch(Engine.scala:249)
    at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:326)
    at org.scalatest.FlatSpec$class.runTests(FlatSpec.scala:3045)
    at controller.RootControllerSpec.runTests(RootControllerSpec.scala:6)
    at org.scalatest.Suite$class.run(Suite.scala:2303)
    at controller.RootControllerSpec.org$scalatest$FlatSpec$$super$run(RootControllerSpec.scala:6)
    at org.scalatest.FlatSpec$$anonfun$run$1.apply(FlatSpec.scala:3092)
    at org.scalatest.FlatSpec$$anonfun$run$1.apply(FlatSpec.scala:3092)
    at org.scalatest.SuperEngine.runImpl(Engine.scala:362)
    at org.scalatest.FlatSpec$class.run(FlatSpec.scala:3092)
    at controller.RootControllerSpec.org$scalatest$BeforeAndAfterAll$$super$run(RootControllerSpec.scala:6)
    at org.scalatest.BeforeAndAfterAll$class.run(BeforeAndAfterAll.scala:213)
    at controller.RootControllerSpec.run(RootControllerSpec.scala:6)
    at org.scalatest.tools.ScalaTestFramework$ScalaTestRunner.run(ScalaTestFramework.scala:214)
    at sbt.RunnerWrapper$1.runRunner2(FrameworkWrapper.java:220)
    at sbt.RunnerWrapper$1.execute(FrameworkWrapper.java:233)
    at sbt.TestRunner.runTest$1(TestFramework.scala:84)
    at sbt.TestRunner.run(TestFramework.scala:94)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:224)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:224)
    at sbt.TestFramework$.sbt$TestFramework$$withContextLoader(TestFramework.scala:212)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:224)
    at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:224)
    at sbt.TestFunction.apply(TestFramework.scala:229)
    at sbt.Tests$$anonfun$7.apply(Tests.scala:196)
    at sbt.Tests$$anonfun$7.apply(Tests.scala:196)
    at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:45)
    at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:45)
    at sbt.std.Transform$$anon$4.work(System.scala:64)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
    at sbt.Execute.work(Execute.scala:244)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
[error] Could not run test controller.RootControllerSpec: java.lang.NoSuchMethodError: org.eclipse.jetty.server.Connector.getHost()Ljava/lang/String;
[error] Error: Total 0, Failed 0, Errors 0, Passed 0
[error] Error during tests:
[error]     controller.RootControllerSpec
[error] (build/test:test) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 5 s, completed 2014/01/13 11:31:35

追記

コメントで教えてもらった通り、build.sbtを修正すれば動いた
https://github.com/ise/skinny-blank-app-standalone/commit/b647cec2fd95011a438e176d3d18b94fcc11ee81

そして、skinnyの0.9.25ではシェルスクリプトの一部コメントアウトを解除するだけで、
standaloneで動作するパッケージが作成できるようになるとのこと。
seratchさんすごすぎ

4
4
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4