【发布时间】:2014-10-08 01:58:30
【问题描述】:
在这方面需要一点帮助。 我的目标是拥有一个可执行的 jar 文件,它可以截取网页的屏幕并在 windows 和 linux 机器上运行。我曾尝试使用 html2image,但 phantomjs 的结果要好得多。 我的代码如下所示:
RESOURCE_PATH = MyClass.class.getClassLoader().getResource("resources").getPath();
public static void main (String[] args) {
String url = args[1];
String outFilePath = args[0];
final String phantomjsHome = RESOURCE_PATH + "/phantomjs/";
ProcessBuilder pb = new ProcessBuilder(phantomjsHome + "phantomjs.exe", phantomjsRasterizeScript, url, outFilePath);
Process process = pb.start();
process.waitFor();
}
现在我有测试可以保证当我将它作为 java 应用程序运行时它可以正常工作,但是当我构建一个可执行的 jar 时我得到一个错误。我已经检查并仔细检查了 RESOURCE_FOLDER 是否指向正确的位置。但是当我使用
java -jar MyProject.jar "google.png" "https://google.com"
我得到一个
java.io.Exception: Cannot run program "file:/C:/Users/Joe/MyProject.jar/resources/phantomjs.exe": CreateProcess error=2, The system cannot find file specified
顺便说一句,这是我第一次提出关于 SO 的问题,所以如果您需要更多信息或对措辞评论有任何建议或 cmets 并提供一些反馈。谢谢!
更新
经过一番搜索后,我发现无法从 jar 中执行可执行文件。我已经创建了一种将可执行文件复制到似乎可以工作的 jar 外部的方法。
private static String loadPhantomJS() {
String phantomJs = "phantomjs.exe";
try {
InputStream in = WebShot.class.getResourceAsStream("/resources/phantomjs/" + phantomJs);
File fileOut = new File(storePath + phantomJs);
OutputStream out = FileUtils.openOutputStream(fileOut);
IOUtils.copy(in, out);
in.close();
out.close();
return fileOut.getAbsolutePath();
} catch (Exception e) {
return "";
}
}
请注意,此方法仅适用于windows机器,请更改linux的文件路径。
【问题讨论】: