java 执行clojure脚本_java – 如何在Clojure中创建命令行可执行文件

我在Clojure中编写了一个程序,我想在命令行上执行它,而不是在命令行上专门调用

java(例如

java -jar).我想要一个可执行文件,例如myprogram,它接受任何参数并运行我的程序.以下是一些可能使这更容易的事情:

>可以假设安装了Java并且java在路径中.

>虽然适用于Windows的解决方案将是一个很好的解决方案,但您可以假设这一切都是在类似UNIX的操作系统(如Mac OS X或Ubuntu)上完成的.

>在某种脚本中调用Java是可以的.

>可以使用其他语言,例如Ruby,Python或Perl,用户可能安装或未安装. All-bash会很酷,因为我可以假设有人拥有它.

>如果我必须使用某种工具来构建将要执行的二进制文件,这是可以的,但我不是在寻找希望使用GUI界面操作的.app或.exe文件(例如,Oracle的appbundler不是我在这里寻找什么).

我用一种方法走了很远的路,但我不得不怀疑是否有更好的方法.

仅供参考:我已经尝试过的

我将在下面描述我的方法,但任何答案都不需要遵循这种方法.

我所做的是创建一个名为makescript的lein插件,它生成一个uberjar,base64对它进行编码,然后将它放在一个所谓的heredoc变量的Ruby脚本中,如下所示:

# ...ruby script...

BASE64_JAR = <

# [...base64 encoded file here...]

JAR_BOUNDARY

然后,您应该能够运行ruby脚本.它将获取BASE64_JAR变量,取消编码,将其放在临时文件中,并通过调用java -jar< filename>来执行它.

我使用这种方法的问题是Ruby的base64库和Clojure的clojure.data.codec.base64库似乎产生了不同的字符串来表示jar,而Clojure编码的字符串如果我没有解码到原始文件使用Ruby.这可能与两种语言之间的字符串本身(与UTF-8相关?)的编码有关.以下是说明断开连接的repl / irb会话:

repl=> (def jar-contents (slurp "../target/myproj-0.1.0-SNAPSHOT-002-standalone.jar"))

repl=> (count jar-contents) ;; => 9433328

repl=> (def a-str (String. (clojure.data.codec.base64/encode (.getBytes jar-contents)) "UTF-8"))

repl=> (count a-str) ;; => 23265576

irb> f = File.open("target/pwgen-0.1.0-SNAPSHOT-002-standalone.jar", "r").read()

irb> p f.length # => 9657639

irb> b = Base64.encode64(f)

irb> p b.length # => 13564973

请注意原始大小接近但不相同,但编码版本有很大不同.

虽然这很令人费解,但我想知道为什么会发生这种情况,我想我可以绕过这个问题,让makecript只生成uberjar并将路径传递给另一个Ruby脚本,然后将对其进行base64编码(后来解码,也使用Ruby)独立的JAR.问题仍然存在:是否有更好,更简单的方法?我错过了一些明显的东西,还是看起来真的那么难?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值