0

我编写了一个快速的 Java 包装器,它启动 NMAP 可执行文件并等待它完成。我正在使用 Eclipse。我想在我的 Java jar 文件中包含 NMAP 源/可执行文件,以便我有一个独立的包。

在 Eclipse 中,我添加了 NMAP 文件夹层次结构。在 Eclipse 中,我可以看到 Java 正确地触发了 NMAP 实用程序,并在退出之前等待实用程序结束。
到现在为止还挺好。然后我用 eclipse 导出一个 JAR 文件。我可以看到 NMAP 文件夹层次结构存在。但是,当我尝试运行 JAR 文件时,找不到 nmap.exe。可以使用 jar 文件调用外部可执行文件吗?如果没有,我有什么选择?如果是这样,为什么它不能在 jar 文件中找到它,而它可以在 Eclipse 中找到它?

谢谢。

4

4 回答 4

1

您需要将 .exe 及其所需的支持文件提取到磁盘上,然后才能将它们作为常规文件访问(我相信通过标准方法执行需要)。您可以查找有关如何使用 jar 中的一个getResourceAsStream()类文件将资源从 jar 复制到文件的示例。

提取后,您可以像现在一样执行(您可能需要根据您的操作系统确保执行权限等)

于 2012-05-21T15:23:13.597 回答
1

“执行本机程序”工具不了解如何在其他文件(如 ZIP 或 JAR)中调用 EXE 文件。

如果要执行此操作,您必须将文件提取到文件系统位置并在那里调用它。由于 Linux 发行版(PowerPC?其他库版本等)的多样性,您可能应该要求用户安装它并调用它,而不是自带。

于 2012-05-21T15:23:41.753 回答
1

据我所知,您无法执行嵌入在 jar 文件中的可执行文件。

一种解决方案是将可执行文件嵌入到 jar 文件中。然后用于getClass().getResourceAsStream("/path/to/executable")检索字节并将它们输出到临时文件 ( File.createTempFile())。在 UN*X 系统上,您必须chmod u+x file在尝试执行之前进行。最终,您可以删除临时文件或创建一次文件并每次重用它并调用deleteOnExit().

当然,此解决方案意味着您拥有可在所有平台上运行的可执行文件。

您的解决方案可能适用于 Eclipse,因为您的“可执行”文件不在 jar 中。

于 2012-05-21T15:23:50.107 回答
0

您可能还必须注意如何分发它,因为 Nmap 不是免费用于商业软件的。

有一个用于 Java 的开源库来调用 Nmap,但它假定 Nmap 安装在您运行代码的操作系统上。该 API 是 Nmap4j,它位于 sourceforge.net 上。

于 2012-05-25T03:22:20.497 回答