スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

sbtでjavaとscalaが混在したプロジェクトのjarを作成してみる

sbtでjavaとscalaが混在したプロジェクトのjarを作成してみる。

環境はWindows8.1

ほとんどの部分は下記を参考にさせていただいた。
Scala初心者の俺が「Hello World」する jar を作るまで

インストール


sbtを下記からダウンロード
http://www.scala-sbt.org/download.html

Windowsなのでmsiを使った。
msiは特に注意するところもなく、実行してウィザードを進めるだけでOK。

インストールが終わったら、コマンドプロンプトを起動し sbt を実行。
初回起動時には必要なファイルがいろいろダウンロードされるので、結構時間がかかる。

C:\Users\>sbt
Getting org.fusesource.jansi jansi 1.11 ...
downloading https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.11/jansi
-1.11.jar ...
[SUCCESSFUL ] org.fusesource.jansi#jansi;1.11!jansi.jar (1735ms)
:: retrieving :: org.scala-sbt#boot-jansi
confs: [default]
1 artifacts copied, 0 already retrieved (111kB/15ms)
Getting org.scala-sbt sbt 0.13.6 ...
・・・中略・・・
confs: [default]
5 artifacts copied, 0 already retrieved (24459kB/43ms)
[info] Set current project to t (in build file:/C:/Users/t/)
>
> exit
C:\Users\>


起動が終わったら、exit で一旦抜ける。


Hellow world を実行する


任意の場所に build.sbt というファイルを作成。1行ごとに必ず空行を入れる必要あり。

name := "Hello World"

version := "1.0"

scalaVersion := "2.10.0"



build.sbt を作成したディレクトリにソースを置くために src\main\scala というディレクトリを作成する。

src\main\scala の下にHello.scala というファイル名でscala のコードを書く。
object HelloWorld {
def main(args: Array[String]) {
println("Hello World!")
}
}


実行してみる。

H:\temp\scala>sbt run
[info] Set current project to Hello World (in build file:/H:/temp/scala/)
[info] Updating {file:/H:/temp/scala/}scala...
[info] Resolving org.scala-lang#scala-library;2.10.0 ...
・・・中略・・・
[info] Compilation completed in 11.843 s
[info] Running HelloWorld
Hello World!
[success] Total time: 43 s, completed 2014/10/22 23:19:26

H:\temp\scala>


Running HelloWorldというメッセージの後に、Hellow World! が出力されればOK。

scalaのソースからjarを作る


sbt-assemblyを使ってjarを作る。
sbt-assemblyについては下記のREADME.mdを参照。
https://github.com/sbt/sbt-assembly

project/assembly.sbt というファイルを作り、下記を記載する。

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



assembly.sbt というファイルを build.sbt と同じディレクトリ作成。
下の2行を追加する

import AssemblyKeys._

assemblySettings



実行。

H:\temp\scala>sbt assembly
[info] Loading project definition from H:\temp\scala\project
[info] Set current project to Hello World (in build file:/H:/temp/scala/)
[info] Including: scala-library-2.10.0.jar
[info] Checking every *.class/*.jar file's SHA-1.
[info] Merging files...
[warn] Merging 'META-INF\MANIFEST.MF' with strategy 'discard'
[warn] Strategy 'discard' was applied to a file
[info] SHA-1: 24c
[info] Packaging H:\temp\scala\target\scala-2.10\Hello World-assembly-1.0.jar ..
.
[info] Done packaging.
[success] Total time: 6 s, completed 2014/10/22 23:32:20



実行時のメッセージにも出ているが、作成されたJarはtarget\scala-2.10\ の下にできている。

作成したjar を実行。

H:\temp\scala>java -jar "target/scala-2.10/Hello World-assembly-1.0.jar"
Hello World!



Javaのソースも含めてjarを作る


Java ソースを追加する。

src\main\javaを作成。
その下に Test.java という名前で下記のソースを作成。

public class Test {
public static void print() {
System.out.println("Hello Java");
}
}


src\main\scala\Hello.scala を下記のように変更

object HelloWorld {
def main(args: Array[String]) {
//println("Hello World!")
Test.print()
}
}


コマンドプロンプトを管理者で起動して実行。

H:\temp\scala>sbt assembly
[info] Loading project definition from H:\temp\scala\project
[info] Set current project to Hello World (in build file:/H:/temp/scala/)
[info] Compiling 1 Scala source and 1 Java source to H:\temp\scala\target\scala-
2.10\classes...
[info] Including from cache: scala-library-2.10.0.jar
[info] Checking every *.class/*.jar file's SHA-1.
[info] Merging files...
[warn] Merging 'META-INF\MANIFEST.MF' with strategy 'discard'
[warn] Strategy 'discard' was applied to a file
[info] SHA-1:
[info] Packaging H:\temp\scala\target\scala-2.10\Hello World-assembly-1.0.jar ..
.
[info] Done packaging.
[success] Total time: 5 s, completed 2014/10/22 23:51:19

H:\temp\scala>


無事成功。

できた jar を実行。

H:\temp\scala>java -jar "target/scala-2.10/Hello World-assembly-1.0.jar"
Hello Java



ちゃんと、scalaからjavaを呼べている。
target\scala-2.10\classes を確認すると、javaのソースもscalaのソースもclassファイルが生成されている。


エラーと対処方法


scalaのみの時の sbt assembly で失敗


エラー

H:\temp\scala>sbt assembly
[info] Loading project definition from H:\temp\scala\project
[info] Updating {file:/H:/temp/scala/project/}scala-build...
・・・中略・・・
[info] Done updating.
H:\temp\scala\build.sbt:7: error: illegal start of simple expression
import AssemblyKeys._ // put this at the top of the file
^
[error] Error parsing expression. Ensure that there are no blank lines within a
setting.
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? i
[warn] Ignoring load failure: no project loaded.
[error] Not a valid command: assembly
[error] assembly
[error]



対処

設定を記載しているファイルや、記載内容が間違えていないか確認する。
特に、sbt-assembly 0.9.1 では、 project/puglin.sbt やbuild.sbtを編集するように指示があるが、0.11.2 では project/assembly.sbt と assembly.sbt を編集するというように、バージョン間で差異がある。

使用するバージョンのREADMEを参照すること。
sbt-assemblyのREADMEは下記から参照可能。
https://github.com/sbt/sbt-assembly


javaを加えた時の sbt assembly で失敗


エラー

H:\temp\scala>sbt assembly
[info] Loading project definition from H:\temp\scala\project
[info] Set current project to Hello World (in build file:/H:/temp/scala/)
[info] Compiling 1 Java source to H:\temp\scala\target\scala-2.10\classes...
java.io.IOException: Cannot run program "javac": CreateProcess error=2, ?w?????t
?@?
at java.lang.ProcessBuilder.start(Unknown Source)
at sbt.SimpleProcessBuilder.run(ProcessImpl.scala:349)
at sbt.AbstractProcessBuilder.run(ProcessImpl.scala:128)
・・・中略・・・
at java.lang.Thread.run(Unknown Source)
[error] (compile:compile) java.io.IOException: Cannot run program "javac": Creat
eProcess error=2, ?w?????t?@?
[error] Total time: 0 s, completed 2014/10/22 23:38:42

H:\temp\scala>



対処

コマンドプロンプトを管理者で起動して実行する。

以上。
スポンサーサイト

テーマ : ソフトウェア開発
ジャンル : コンピュータ

コメントの投稿

管理者にだけ表示を許可する

検索フォーム
プロフィール

takuan93

Author:takuan93
本ブログの説明書→「ReadMe」

管理者に連絡

カテゴリ
WiX (5)
Ant (1)
フリーエリア
最新記事
カウンター
カレンダー
03 | 2018/04 | 05
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 - - - - -
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。