使用Java编写Linux工具

3
我希望使用Java编写一个在Linux系统中可以像调用“ls”一样调用的工具。我该怎么做呢?我的计划如下:
  1. 编写一个Java程序,在main函数中传入我的参数并完成工作。如何返回结果呢?Java main方法无法返回字符串。

  2. 将我的jar文件放置在系统中的最佳位置在哪里?/user/bin吗?

  3. 如何以最少的输入调用它?我不想输入java jar XXXXXX com.mynamespace.myfunction ......,我想要使用一个简单的名称来调用它,比如“ls”。

非常感谢!

你可能也想考虑使用Groovy。 - Khary Mendez
2个回答

7
您可以创建一个bash文件/usr/bin/custom_program,将其指向您的jar文件:
#!/usr/bin/bash
java -jar /path/to/your/java.jar # add any custom command line switches here

不要忘记使用sudo chmod u+x /usr/bin/custom_program将其标记为可执行文件。

你的程序输出可以通过System.out.println()来实现,无需从主函数返回String

然后,你可以通过上述bash脚本的帮助,使用custom_program调用你的java程序。


1
除了使用shell脚本,您还可以使用binfmt_misc技巧。
我更喜欢使用shell脚本,它可能更加便携(某些Linux系统可能不会加载或提供支持binfmt_misc所需的内核模块)。
正如内核的Documentation/java.txt所解释的那样:

2)您必须将BINFMT_MISC编译为模块或编译到 内核(CONFIG_BINFMT_MISC)并正确设置它。 如果您选择将其编译为模块,则会有 必须手动使用modprobe/insmod插入它,因为kmod 无法轻松支持binfmt_misc。 阅读此目录中的文件'binfmt_misc.txt'以了解 更多关于配置过程的信息。

3)将以下配置项添加到binfmt_misc中 (您现在应该已经阅读了binfmt_misc.txt): 支持Java应用程序:

 ':Java:M::\xca\xfe\xba\xbe::/usr/local/bin/javawrapper:'

支持可执行的Jar文件:
 ':ExecutableJAR:E::jar::/usr/local/bin/jarwrapper:'

支持Java小程序:
 ':Applet:E::html::/usr/bin/appletviewer:'

以下是更加选择性的内容:
 ':Applet:M::<!--applet::/usr/bin/appletviewer:'

当然,你需要修复路径名。此文档中给出的路径/文件名与Debian 2.1系统相匹配(即jdk安装在/usr中,此文档中的自定义包装器在/usr/local中)。

使用 gcj

另一个可能性(我不建议使用)是使用gcjGCC内部的旧Java编译器)。

gcj使您能够将Java程序编译为本地Linux ELF二进制可执行文件。但我不建议这样做,因为:

  • 在GCC社区内,很少有人在使用gcj
  • 使用gcj的人很少,我只遇到过一个偶尔使用它的开发者。
  • 所以gcj正在变得过时。
  • gcj生成的代码分配了很多内存,性能表现不佳(因为它使用Boehm垃圾回收器,比其他Java实现中的GC慢得多)。然而,在分配率较低的Java代码上,由于GCC在语言中立中间端所做的强大优化,它可能运行得相当快。
  • gcj支持的Java语言是某个相当老的Java标准的子集。

它不仅仅是一个链接,它还是一个名为“binfmt_misc”的特定名称,因此您可以轻松找到文档(即使原始链接到维基百科已经消失)。 - Basile Starynkevitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接