ぶらっ記ぃ

日本語の練習をしています

Maven Central RepositoryからJarを取得して実行可能なスクリプトに変換する

coursierのCLIでbootstrapを使うとできる

以下は Ammonite をダウンロードしてスクリプト化する例

$ coursier bootstrap com.lihaoyi:ammonite_2.12.8:1.6.6 -M ammonite.Main -o amm --standalone
https://repo1.maven.org/maven2/com/lihaoyi/ammonite_2.12.8/1.6.6/ammonite_2.12.8-1.6.6.pom
  100.0% [##########] 2.2 KiB (1.8 KiB / s)
https://repo1.maven.org/maven2/com/lihaoyi/ammonite-runtime_2.12/1.6.6/ammonite-runtime_2.12-1.6.6.pom
  100.0% [##########] 1.9 KiB (7.7 KiB / s)
https://repo1.maven.org/maven2/com/lihaoyi/ammonite-terminal_2.12/1.6.6/ammonite-terminal_2.12-1.6.6.pom
  100.0% [##########] 1.5 KiB (8.3 KiB / s)
https://repo1.maven.org/maven2/com/lihaoyi/ammonite-ops_2.12/1.6.6/ammonite-ops_2.12-1.6.6.pom
  100.0% [##########] 1.5 KiB (3.0 KiB / s)
https://repo1.maven.org/maven2/com/lihaoyi/ammonite-repl_2.12.8/1.6.6/ammonite-repl_2.12.8-1.6.6.pom
  100.0% [##########] 2.9 KiB (5.1 KiB / s)
https://repo1.maven.org/maven2/com/lihaoyi/ammonite-interp_2.12.8/1.6.6/ammonite-interp_2.12.8-1.6.6.pom
  100.0% [##########] 2.4 KiB (13.4 KiB / s)
https://repo1.maven.org/maven2/com/lihaoyi/ammonite-util_2.12/1.6.6/ammonite-util_2.12-1.6.6.pom
  100.0% [##########] 2.0 KiB (11.9 KiB / s)
https://repo1.maven.org/maven2/io/get-coursier/coursier_2.12/1.1.0-M13-1/coursier_2.12-1.1.0-M13-1.pom
  100.0% [##########] 2.6 KiB (14.6 KiB / s)
https://repo1.maven.org/maven2/io/get-coursier/coursier-cache_2.12/1.1.0-M13-1/coursier-cache_2.12-1.1.0-M13-1.pom
  100.0% [##########] 1.8 KiB (10.3 KiB / s)
https://repo1.maven.org/maven2/io/get-coursier/coursier-core_2.12/1.1.0-M13-1/coursier-core_2.12-1.1.0-M13-1.pom
  100.0% [##########] 1.8 KiB (10.2 KiB / s)
https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.1.1/scala-xml_2.12-1.1.1.pom
  100.0% [##########] 2.7 KiB (15.1 KiB / s)
https://repo1.maven.org/maven2/com/lihaoyi/ammonite-repl_2.12.8/1.6.6/ammonite-repl_2.12.8-1.6.6.jar
  100.0% [##########] 173.0 KiB (252.9 KiB / s)
https://repo1.maven.org/maven2/com/lihaoyi/ammonite-util_2.12/1.6.6/ammonite-util_2.12-1.6.6.jar
  100.0% [##########] 173.8 KiB (252.3 KiB / s)
https://repo1.maven.org/maven2/com/lihaoyi/ammonite_2.12.8/1.6.6/ammonite_2.12.8-1.6.6.jar
  100.0% [##########] 150.9 KiB (182.1 KiB / s)
https://repo1.maven.org/maven2/com/lihaoyi/ammonite-interp_2.12.8/1.6.6/ammonite-interp_2.12.8-1.6.6.jar
  100.0% [##########] 321.6 KiB (372.2 KiB / s)
https://repo1.maven.org/maven2/io/get-coursier/coursier_2.12/1.1.0-M13-1/coursier_2.12-1.1.0-M13-1.jar
  100.0% [##########] 250.7 KiB (696.5 KiB / s)
https://repo1.maven.org/maven2/com/lihaoyi/ammonite-ops_2.12/1.6.6/ammonite-ops_2.12-1.6.6.jar
  100.0% [##########] 123.3 KiB (163.6 KiB / s)
https://repo1.maven.org/maven2/com/lihaoyi/ammonite-runtime_2.12/1.6.6/ammonite-runtime_2.12-1.6.6.jar
  100.0% [##########] 216.3 KiB (1.1 MiB / s)
https://repo1.maven.org/maven2/com/lihaoyi/ammonite-terminal_2.12/1.6.6/ammonite-terminal_2.12-1.6.6.jar
  100.0% [##########] 171.8 KiB (411.9 KiB / s)
https://repo1.maven.org/maven2/io/get-coursier/coursier-cache_2.12/1.1.0-M13-1/coursier-cache_2.12-1.1.0-M13-1.jar
  100.0% [##########] 274.2 KiB (304.7 KiB / s)
https://repo1.maven.org/maven2/io/get-coursier/coursier-core_2.12/1.1.0-M13-1/coursier-core_2.12-1.1.0-M13-1.jar
  100.0% [##########] 1.5 MiB (1.4 MiB / s)
https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.1.1/scala-xml_2.12-1.1.1.jar
  100.0% [##########] 540.4 KiB (1.5 MiB / s)

$ ./amm
Loading...
Compiling (synthetic)/ammonite/predef/interpBridge.sc
Compiling (synthetic)/ammonite/predef/replBridge.sc
Compiling (synthetic)/ammonite/predef/DefaultPredef.sc
Welcome to the Ammonite Repl 1.6.6
(Scala 2.12.8 Java 1.8.0_181)
If you like Ammonite, please support our development at www.patreon.com/lihaoyi
@ 

スクリプトを見るとシェルスクリプトにバイナリが埋め込まれているのがわかる

$ cat amm | head -n30
#!/usr/bin/env sh
nargs=$#

i=1; while [ "$i" -le $nargs ]; do
         eval arg=\${$i}
         case $arg in
             -J-*) set -- "$@" "${arg#-J}" ;;
         esac
         i=$((i + 1))
     done

set -- "$@" -jar "$0"

i=1; while [ "$i" -le $nargs ]; do
         eval arg=\${$i}
         case $arg in
             -J-*) ;;
             *) set -- "$@" "$arg" ;;
         esac
         i=$((i + 1))
     done

shift "$nargs"

exec java -Dsun.misc.URLClassPath.disableJarChecking $JAVA_OPTS "$@"
+N#coursier/bootstrap/launcher/a.classV[WWI80)DEj5Z+(Fzq2Qb~ZvUЮ??з>wK
                                                                      @}g؁$
                                                                           K8)aJ%p^     K4
8 H Ȉ␌&                                                                                   ǛoqǻqLJq|      ǧq\y9A'C^AQ2'HjQeaztˈ !dHz9*
       ʸX
qAR
L()OQ`L<'1%R2N+x#
.P.AWS߀
       +J8*#
            `c&5mi?Wj=e_fJ']'uJ}A3u-O'*kYpg=>dgMxl,2wlW\öSa(zJWa9L-dzM~B㱱3
                                                                           {JGK@U
                                                                                 []xQw\U]B!(:ZSOTNڢv8^Vm7:jYK$ոu>2*;$b82Fe\E7ŦӖ#F<0oR:EUvv@M>g+'S)5-F)'':U'ALyDu*q6v-[
M?UM

Scalaスクリプトを実行したいけどAmmoniteインストールしてないよ!

…という人に向けてScalaスクリプトを配布するのに向いてるかも?