ããã¯ããªã«ãããããŠæžãããã®ïŒ
JBangãšãããJavaããã°ã©ã ãã¹ã¯ãªããçã«å®è¡ã§ããããŒã«ããããšç¥ããŸããŠã
ã¡ãã£ãšæ°ã«ãªãåéãªã®ã§ã詊ããŠã¿ãããšã«ããŸããã
JBang
JBangã¯ãJavaããã°ã©ã ãã¹ã¯ãªããã®ããã«å®è¡ã§ããããŒã«ã§ãã
GitHub - jbangdev/jbang: Unleash the power of Java for shell scripting
èŠä»¶ãšããŠã¯ãJavaïŒæäœ8ãæšå¥š11ïŒãã€ã³ã¹ããŒã«ãããŠããããšã®ããã§ãã
æ©èœãšããŠã¯ã
.java
æ¡åŒµåã.jsh
æ¡åŒµåã®ãã¡ã€ã«ãå®è¡ã§ãã- ãã«ããã©ãããã©ãŒã
- ããã€ãã®ããã±ãŒãžãããŒãžã£ãŒã§ã€ã³ã¹ããŒã«å¯èœ
- ã©ã€ãã©ãªã®äŸåé¢ä¿ã解決å¯èœ
- ïŒå®éšçïŒãã€ãã£ãã€ã¡ãŒãžã®ãµããŒã
- å©çšããJavaã®ããŒãžã§ã³ãæå®ããããšãã§ãããã®ããŒãžã§ã³ãOSã«ã€ã³ã¹ããŒã«ãããŠããªãå Žåã¯èªåçã«ããŠã³ããŒããã
ãªã©ãªã©ãããã¡ãã£ãšæžãããŠããã®ã§ããã詳ããã¯ä»¥äžãåç §ããŠãã ããã
ãã€ã³ãã¯ãMavenãªã©ã䜿ãåæ©ã®ã²ãšã€ã§ãããäŸåé¢ä¿ã®è§£æ±ºãã§ããããšããã¡ãã«æ³šç®ããçç±ã§ããã
ãªãããã®ããŒã«ã¯ãããªæãã§ãäœè ã®å匷ç®çã§äœãããŠããããã§ãã
And to be honest I built jbang just to see if I could and get my Java skills refreshed for the newer features in the language. Use it at your own risk :)
ãŸããã¡ãã£ãšè©ŠããŠã¿ãŸãããã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã
$ java --version openjdk 11.0.8 2020-07-14 OpenJDK Runtime Environment (build 11.0.8+10-post-Ubuntu-0ubuntu120.04) OpenJDK 64-Bit Server VM (build 11.0.8+10-post-Ubuntu-0ubuntu120.04, mixed mode, sharing) $ sdk version SDKMAN 5.9.0+555
ã€ã³ã¹ããŒã«
SDKMANã䜿ã£ãã€ã³ã¹ããŒã«ãå¯èœãªãããªã®ã§ãä»åã¯ãã¡ãã䜿çšããŸãã
$ sdk install jbang
ãã®ä»ã®ã€ã³ã¹ããŒã«æ¹æ³ãããããã§ããã䜿ã£ãŠããç°å¢ãããŒã«ãæ¡ä»¶ãæºãããªãå Žåã¯ããã€ããªãããŠã³ããŒãããŠ
ã€ã³ã¹ããŒã«ããŸãããã
Releases · jbangdev/jbang · GitHub
ä»åã®ããŒãžã§ã³ã¯ããã¡ãã
$ jbang version 0.47.1
䜿ãåã«ãBashã®Auto Completionãæå¹ã«ããŠãããŸãããã
$ source <(jbang completion)
ãã«ãã
$ jbang -h jbang is a tool for building and running .java/.jsh scripts and jar packages. Usage: jbang [-h] [--verbose] [COMMAND] jbang init hello.java [args...] (to initialize a script) or jbang edit --live=code hello.java (to edit a script in IDE with live updates) or jbang hello.java [args...] (to run a .java file) or jbang gavsearch@jbangdev [args...] (to run a alias from a catalog) or jbang group-id:artifact-id:version [args...] (to run a .jar file found with a GAV id) -h, --help Display help/info --verbose jbang will be verbose on what it does. Essentials: run Builds and runs provided script. build Compiles and stores script in the cache. Editing: init Initialize a script. edit Setup a temporary project to edit script in an IDE. Caching: cache Manage compiled scripts in the local cache. jdk Manage Java Development Kits installed by jbang. Configuration: trust Manage which domains you trust to run scripts from. alias Manage aliases for scripts. catalog Manage Catalogs of aliases. Other: completion Output auto-completion script for bash/zsh. Usage: source <(jbang completion) version Display version info. wrapper Manage jbang wrapper for a folder. Copyright: 2020 Max Rydahl Andersen and jbang.dev contributors, License: MIT Website: https://jbang.dev
Javaããã°ã©ã ãåãããŠã¿ã
ãŸãã¯ã軜ã䜿ã£ãŠã¿ãŸãã
æåã®1æãèŠããšãã¹ã¯ãªããã¯1ãã¡ã€ã«ã§ããå¿ èŠãããããã§ããã
A script is just a single .java file with a classic static main method or a .jsh file which will be passed to jshell.
è€æ°ã®ãœãŒã¹ã³ãŒããæ±ãã®ã¯ãå®éšçæ©èœã«ãªã£ãŠããŸãã
Multiple source files (Experimental)
ãããªJavaãœãŒã¹ã³ãŒããçšæã
HelloWorld.java
public class HelloWorld { public static void main(String... args) { String word; if (args.length == 0) { word = "World"; } else { word = args[0]; } System.out.printf("Hello %s!!%n", word); } }
ãã®ãã¡ã€ã«ãä»ãªãjava
ã³ãã³ãã§å®è¡ã§ããŸããã©ãã
$ java HelloWorld.java Hello World!! $ java HelloWorld.java Scripting Hello Scripting!!
JBangã§å®è¡ããŠã¿ãŸãã
$ jbang HelloWorld.java [jbang] Building jar... Hello World!!
ãªãããJARãã¡ã€ã«ãäœã£ãŠãããªãã°ãåºãŠããŸãâŠã
2åç®ããã¯ãåºãªããªããŸããã
$ jbang HelloWorld.java Hello World!!
åŒæ°ããµã€ãã«äœ¿ããŸãã
$ jbang HelloWorld.java Scripting Hello Scripting!!
ããŠããããªããã«ãããŠããé°å²æ°ããã£ãã®ã§ã©ããªã£ãŠããã®ãïŒã§ãããCachingã®ãšãããèŠããšããããã§ãã
ããã©ã«ãã§ã¯ã$HOME/.jbang/cache
ã«ããããã§ãããããªãã¡ãã£ãšèŠãŠã¿ãŸãããã
$ find ~/.jbang/cache -type f $HOME/.jbang/cache/jars/HelloWorld.java.a86770d39e60af63573a609bb669a610f5fa51605fb23be6383278d17f81423b/META-INF/maven/g/a/v/pom.xml $HOME/.jbang/cache/jars/HelloWorld.java.a86770d39e60af63573a609bb669a610f5fa51605fb23be6383278d17f81423b/HelloWorld.class $HOME/.jbang/cache/jars/HelloWorld.java.a86770d39e60af63573a609bb669a610f5fa51605fb23be6383278d17f81423b.jar
class
ãã¡ã€ã«ãšããJARãã¡ã€ã«ãšããããŸããâŠã
ããã§ãå°ããã¡ã€ã«ãæŽæ°ããŠã¿ãŸãã!!
ãå¢ãããŠã¿ãŸããã
HelloWorld.java
public class HelloWorld { public static void main(String... args) { String word; if (args.length == 0) { word = "World"; } else { word = args[0]; } System.out.printf("Hello %s!!!!%n", word); } }
ãããšãå床ãã«ããããŸãã
$ jbang HelloWorld.java [jbang] Building jar... Hello World!!!!
JARãã¡ã€ã«çèªäœãå¢ããŸããã
$ find ~/.jbang/cache -type f $HOME/.jbang/cache/jars/HelloWorld.java.a86770d39e60af63573a609bb669a610f5fa51605fb23be6383278d17f81423b/META-INF/maven/g/a/v/pom.xml $HOME/.jbang/cache/jars/HelloWorld.java.a86770d39e60af63573a609bb669a610f5fa51605fb23be6383278d17f81423b/HelloWorld.class $HOME/.jbang/cache/jars/HelloWorld.java.a86770d39e60af63573a609bb669a610f5fa51605fb23be6383278d17f81423b.jar $HOME/.jbang/cache/jars/HelloWorld.java.319a2e49920a81a167dcf3c65b688c995dc8b2cb1cdfb52756e73335b035ead2.jar $HOME/.jbang/cache/jars/HelloWorld.java.319a2e49920a81a167dcf3c65b688c995dc8b2cb1cdfb52756e73335b035ead2/META-INF/maven/g/a/v/pom.xml $HOME/.jbang/cache/jars/HelloWorld.java.319a2e49920a81a167dcf3c65b688c995dc8b2cb1cdfb52756e73335b035ead2/HelloWorld.class
ãªããããã·ã¥å€ã£ãœããã®ãèŠããŸãããããã¯ãã¡ã€ã«ã®SHA256ã§ããã
$ sha256sum HelloWorld.java a86770d39e60af63573a609bb669a610f5fa51605fb23be6383278d17f81423b HelloWorld.java
ãããã®ãã¡ã€ã«ã¯ãjbang cache clear
ã§ãã£ãã·ã¥ã¯ãªã¢ããããšãã§ããŸãã
$ jbang cache clear [jbang] Clearing cache for urls [jbang] Clearing cache for jars [jbang] Clearing cache for scripts [jbang] Clearing cache for stdins
ãµãã³ãã³ãã ããæå®ãããšã説æãèŠããããã§ããjbang cache
$ jbang cache Missing required subcommand Usage: jbang cache [--verbose] [COMMAND] Manage compiled scripts in the local cache. --verbose jbang will be verbose on what it does. Commands: clear Clear cache of dependency list and temporary projects. By default this will clear the JAR, script, stdin and URL caches
ãã£ãã·ã¥ã®ãã£ã¬ã¯ããªãªã©ã¯ãç°å¢å€æ°ã§èšå®ã§ãããã§ããã
https://github.com/jbangdev/jbang/blob/v0.47.1/src/main/java/dev/jbang/Settings.java
ãªãããè±ç·ããŠããŸããããé°å²æ°ãå°ãããã£ãæ°ãããŸãã
JShellã§åãã
JBangã¯ãã¹ã¯ãªãããJShellã§åããæ©èœããããŸãã.jsh
æ¡åŒµåã®ãã¡ã€ã«ãäžãããšãJShellã§å®è¡ããããšããŸãã
詊ããŠã¿ãŸãããã
HelloWorld.jsh
String word; if (args.length == 0) { word = "World"; } else { word = args[0]; } System.out.printf("Hello %s!!%n", word);
æå³çã«ã¯ãå ã»ã©ã®JavaãœãŒã¹ã³ãŒããšåçã®ãã®ã§ãã
確èªã
$ jbang HelloWorld.jsh JBang Hello JBang!! $ jbang HelloWorld.jsh Scripting Hello Scripting!!
å®è¡ã§ããŸããã
--interactive
ãªãã·ã§ã³ã䜿ãããšã§ãã€ã³ã¿ã©ã¯ãã£ãã«å®è¡ããããšãã§ããããã§ããããã¡ãã®åœ¢æ
ã¯
ãããããã«ããŠãããŸãã
å®è¡å¯èœãã¡ã€ã«ãšããŠæ±ã
ã¹ã¯ãªããã«å¯ŸããŠShebangã¹ã¿ã€ã«âŠã®ä»£ããã«//
ã䜿ããå®è¡æš©éãäžããããšã§ãã¹ã¯ãªãããå®è¡å¯èœãã¡ã€ã«ãšããŠ
åäœãããããšãã§ããŸãã
ãããªæãã§ããã
HelloWorld.java
//usr/bin/env jbang "$0" "$@" ; exit $? public class HelloWorld { public static void main(String... args) { String word; if (args.length == 0) { word = "World"; } else { word = args[0]; } System.out.printf("Hello %s!!%n", word); } }
å®è¡æš©éãäžããŠã
$ chmod a+x HelloWorld.java
å®è¡ã
$ ./HelloWorld.java [jbang] Building jar... Hello World!!
ãããªæãã§ãå®è¡ã§ããŸããããšããããããããŸã§ã«ããŠãããŸãã
äŸåé¢ä¿ã解決ãã
ã§ã¯ãã¹ã¯ãªããå ã§äŸåé¢ä¿ã䜿çšããŠã¿ãŸãããã
ãœãŒã¹ã³ãŒãå
ã«ã//DEPS
ãšèšè¿°ããããšã§äŸåé¢ä¿ã解決ããŠãããŸãã
//DEPS
ã§ãéã«ã¹ããŒã¹ãªã©ã¯å
¥ããŠã¯ãããŸããã
https://github.com/jbangdev/jbang/blob/v0.47.1/src/main/java/dev/jbang/Script.java#L30
ãããªæãã§ãCommons Lang3ã䜿çšãããœãŒã¹ã³ãŒããçšæã
HelloWorldDeps.java
//DEPS org.apache.commons:commons-lang3:3.11 import org.apache.commons.lang3.StringUtils; public class HelloWorldDeps { public static void main(String... args) { String word; if (args.length == 0) { word = "World"; } else { word = args[0]; } System.out.println(StringUtils.join("Hello", " ", word, "!!")); } }
å®è¡ã
$ jbang HelloWorldDeps.java [jbang] [WARN] Detected missing dependencies in cache. [jbang] Resolving dependencies... [jbang] Resolving org.apache.commons:commons-lang3:3.11...Done [jbang] Dependencies resolved Hello World!! $ jbang HelloWorldDeps.java Scripting Hello Scripting!!
ååã¯ããã«ãããã³ã©ã€ãã©ãªã®ããŠã³ããŒããè¡ãããŸãã
ãã£ãã·ã¥ãã£ã¬ã¯ããªã®äžèº«ã¯ããããªæãã«ãªããŸããã
$ find ~/.jbang/cache -type f $HOME/.jbang/cache/jars/HelloWorldDeps.java.5f6cde3812d30c4eaecfe79d12e46f78dcd5ee9bf94768abeaea5aaaa171f5e5.jar $HOME/.jbang/cache/jars/HelloWorldDeps.java.5f6cde3812d30c4eaecfe79d12e46f78dcd5ee9bf94768abeaea5aaaa171f5e5/HelloWorldDeps.class $HOME/.jbang/cache/jars/HelloWorldDeps.java.5f6cde3812d30c4eaecfe79d12e46f78dcd5ee9bf94768abeaea5aaaa171f5e5/META-INF/maven/g/a/v/pom.xml
JBangã¯ãMavenãªããžããªãšããŠã¯ããã©ã«ãã§jcenterã䜿çšããããã§ãã
ãŸãã//REPOS
ã䜿ãããšã§ä»ã®ãªããžããªãå©çšããããšãã§ããããã§ãã
jcenterã§ã¯ãªãMaven Centralããããããšæã£ãããããªæãã§ãããã
//REPOS central=https://repo1.maven.org/maven2/ //DEPS org.apache.commons:commons-lang3:3.11
ãã®ä»ãGitãªããžããªãåç
§ã§ãããšã@Grab
圢åŒïŒGrapeïŒã§æžãããšãããããã§ãããããããªããšã
äŸåé¢ä¿è§£æ±ºã®æ¹æ³ã¯ïŒ
ã¡ãã£ãšæ°ã«ãªãã®ããJBangã®äŸåé¢ä¿ã®è§£æ±ºæ¹æ³ã§ãã
çããšããŠã¯ãShrinkWrapã§ãã
https://github.com/jbangdev/jbang/blob/v0.47.1/src/main/java/dev/jbang/DependencyUtil.java
https://github.com/shrinkwrap/resolver/tree/3.1.4/maven
ãªã®ã§ãäŸåããã©ã€ãã©ãªã®ããŠã³ããŒãå
ã¯Mavenã®ããŒã«ã«ãªããžããªã«ãªããŸãããsettings.xml
ãåç
§ãããŸãã
ãããã·ãèšå®ãããšããããsettings.xml
ã«ãªããã§ããããã
JBangã¯ãã©ã®Javaã§å®è¡ããŠãããã ïŒ
ããããæ°ã«ãªããšããã§ãããã
--verbose
ãªãã·ã§ã³ãä»ããŠå®è¡ãããšã確èªããããšãã§ããŸãã
$ jbang --verbose HelloWorld.java [jbang] System Java version detected as 11 [jbang] System Java version matches requested version 11 [jbang] Building jar... [jbang] compile: /usr/lib/jvm/default/bin/javac -d $HOME/.jbang/cache/jars/HelloWorld.java.c1a78dc36160dee8e968a9778b5fc17f8d74f633116e237206383be03aeeb42b HelloWorld.java [jbang] System Java version matches requested version 11 [jbang] run: /usr/lib/jvm/default/bin/java -classpath $HOME/.jbang/cache/jars/HelloWorld.java.c1a78dc36160dee8e968a9778b5fc17f8d74f633116e237206383be03aeeb42b.jar: HelloWorld Hello World!!
ãšããããã§
ãããã確èªã§ããæãã§ããã
ã¡ãã£ãšãããšããã§äœ¿ãããããããªãŒãšã