【问题标题】:Launching phantomjs as a local Resource when using an Executable Jar使用可执行 Jar 时将 phantomjs 作为本地资源启动
【发布时间】: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的文件路径。

【问题讨论】:

    标签: java jar resources


    【解决方案1】:

    上述方法适用于 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 灌输。如果/当我找到更好的解决方案时,将更新此答案。

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 2019-03-22
      相关资源
      最近更新 更多