gpt4 book ai didi

java - 使用可执行 Jar 时将 phantomjs 作为本地资源启动

转载 作者:行者123 更新时间:2023-12-02 04:30:02 25 4
gpt4 key购买 nike

需要一点帮助来解决这个问题。我的目标是拥有一个可执行的 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 是否指向正确的位置。但是当我使用运行 jar 时
java -jar MyProject.jar“google.png”“https://google.com”
我得到一个
java.io.Exception:无法运行程序“file:/C:/Users/Joe/MyProject.jar/resources/phantomjs.exe”:CreateProcess error = 2,系统找不到指定的文件

顺便说一句,这是我第一次提出有关 SO 的问题,因此,如果您需要更多信息或对措辞评论有任何建议或意见,请提供一些反馈。谢谢!

更新
经过更多搜索后,我发现无法从 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机器的文件路径。

最佳答案

上述方法适用于 Windows 计算机,但请注意,您要运行的任何文件也必须解压后存在于 jar 文件之外。可以使用与loadPhantomJS类似的方法从jar文件中解压其他资源文件。我用的是这个方法:

private static void makeLocalFile(String outPath, InputStream is) {
try {
InputStream is;
File fileOut = new File(outPath);
OutputStream out;
out = FileUtils.openOutputStream(fileOut);
IOUtils.copy(in, out);
in.close();
out.close();
} catch (Exception e) {
System.out.println(e);
}
}

我使用 MyClass.class.getResourceAsStream("jsFile.js") 从我的资源中获取 InputStream。到目前为止,我能够让它在 Linux 上工作的唯一方法是首先实际安装 phantomjs linux 注入(inject)。如果/当我找到更好的解决方案时,将更新此答案。

关于java - 使用可执行 Jar 时将 phantomjs 作为本地资源启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25307667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com