您的位置:首页 > 编程语言 > Java开发

编写 Java 命令行工具很麻烦……还是???

2020-04-30 12:19 756 查看

简单的Java工具

JDK自带了很多支持开发的命令行工具。但在我做过的每一个项目中,我发现我只需要从一个工具中得到一点我不能从它得到的东西,这通常意味着我必须写我自己的东西。我写的每一个工具都是为我自己准备的,通常这足以做我的工作。

我编写了许多命令行工具来完成我的额外工作。与我合作的大多数Java开发人员都讨厌编写命令行Java工具的想法。必须先编译它们,然后再运行它们。使用Maven有助于实现

exec:java
目标。如果没有Maven,您将编写长
javac
命令进行编译,然后编写长
java
命令来运行它。但是,如果您小心翼翼并坚持使用JDK中的内容编写一个小的工具来完成工作,则可以使用几年前看到的Shell技巧,让编写Java的方式更像编写Python。

一个简单的Bash / Java示例

之前,我提到我是Bash的忠实粉丝。您只需要一个Java源文件,就可以非常快速地编写有用的东西。考虑以下源文件:

[code]<span style="color:#f8f8f2"><span style="color:#eff0f9"><code><span style="color:#808080">/*bin/mkdir -p /tmp/.java/classes 2> /dev/null

# Compile the program.
#
javac -d /tmp/.java/classes $0

# Run the compiled program only if compilation succeeds.
#
[[ $? -eq 0 ]] && java -cp /tmp/.java/classes $(basename ${0%.*}) "$@"
exit
*/</span>

<span style="color:#f39c12">class</span> <span style="color:#7ed07e">SimpleGreeting</span> <span style="color:#f9690e">{</span>
<span style="color:#f39c12">public</span> <span style="color:#f39c12">static</span> <span style="color:#f39c12">void</span> <span style="color:#7ed07e">main</span><span style="color:#f9690e">(</span><span style="color:#f8f8f2">String</span><span style="color:#f9690e">...</span> <span style="color:#f8f8f2">args</span><span style="color:#f9690e">)</span> <span style="color:#f9690e">{</span>
<span style="color:#f8f8f2">System</span><span style="color:#f9690e">.</span><span style="color:#7ed07e">out</span><span style="color:#f9690e">.</span><span style="color:#7ed07e">println</span><span style="color:#f9690e">(</span><span style="color:#f2ca27">"Hello"</span><span style="color:#f9690e">);</span>
<span style="color:#f9690e">}</span>
<span style="color:#f9690e">}</span>
</code></span></span>

在shell中运行它很容易:

[code]<span style="color:#f8f8f2"><span style="color:#eff0f9"><code><span style="color:#f8f8f2">$ </span>bash SimpleGreeting.java
Hello
$
</code></span></span>

这里发生了什么?为什么这么容易?

答案在顶部的评论中。Shell脚本通常以shebang解释器指令开头。在顶部带有此注释的Java源文件在bash中运行命令。

分解解释器指令

我们很容易看到这里发生了什么:

  • /tmp
    将输出重定向到
    /dev/null
    该目录是否已经存在的情况下,创建一个子目录(我们不在乎错误消息)。
  • 编译源文件,然后将
    .class
    文件写入我们刚刚创建的目标目录。
  • 从刚刚写入的目录中运行
    class
    文件,除去源文件的后缀。但是只有在编译后才运行它。
  • 退出
    java
    运行并返回运行代码。

以这种方式编写工具的最好之处在于,您可以更改代码并再次“运行”它,而不必担心是否需要进行编译。如果有错误,编译器会告诉您它在哪里,并且不会尝试运行您的程序。

提示

有效地开发工具意味着您应该:

  • 在JDK之外使用尽可能少的依赖项(最好是没有)
  • 将您的工具保持简单、简短且在一个源文件中。
  • 使用从命令行运行
    bash SourceFile.java <args>
  • 避免在解释器指令中使用过多逻辑;但不必害怕使用逻辑。

取样工具

我写了一些工具,这些工具极大地帮助了我:

  • 从本地Maven存储库中的JDK docs zip文件和javadoc jar文件提供javadoc
  • 从密钥库中转储Base64 /原始密钥
  • 从密钥库中转储私钥
  • 将外部生成的密钥导入密钥库
  • 检查LDAP / JDBC连接

仅使用JDK,您可以快速完成很多工作。它可能没有包括所有的电池,但是它具有您无需去专卖店就可以找到的所有电池

致谢

我想再次感谢杰西·威尔逊

Rip.java
Jessie Wilson),他的要旨(如上所述)启发了这篇文章。他是一个聪明的家伙,喜欢快速地完成工作(显然)。

我的示例在我的Dotfiles GitHub存储库中。在Scripts目录中,您会发现我的工具以及我使用的所有其他东西。

原文链接:https://dev.to//argherna/writing-java-command-line-tools-is-cumbersome-or-is-it--p42

cunxiedian8614 原创文章 0获赞 2访问量 2万+ 关注 私信
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: