导出为 JAR 时不会加载资源

Resource won't load when exported as a JAR

使用以下代码设置系统属性:


    ClassLoader classLoader = StartMain.class.getClassLoader();

    URL resource = classLoader.getResource("com/myname/lib/chromedriver/chromedriver.exe");

    File f = new File("Driver");

    if (!f.exists()) {

        f.mkdirs();

    }

    File chromeDriver = new File("Driver" + File.separator + "chromedriver.exe");

    if (!chromeDriver.exists()) {

        chromeDriver.createNewFile();

        org.apache.commons.io.FileUtils.copyURLToFile(resource, chromeDriver);

    }

当我在我的 IDE 中 运行 我的应用程序配置时,这非常有效,IntelliJ。但是,当我构建一个 JAR 并尝试在 IntelliJ 之外使用它时,资源 URL returns 为 null。为什么会这样?

通过您的 classloader 进行是有风险的。它可能无法解释您的问题,但可能;无论如何,这种替代方法更短、更简单、更惯用,适用于您拍摄的所有地方,并且适用于更多地方:

像这样获取资源的最佳方式是这样的:

StartMain.class.getResource("/com/myname/lib/chromedriver/chromedriver.exe");

注意这个以斜杠开头!如果您不这样做,则此样式相对于您自己的 class 文件位置(基本上是您的包)。

两种形式都将查找条目:

/com/myname/lib/chromedriver/chromedriver.exe

StartMain.class 所在的同一个罐子里。如果它不存在,那么这显然是行不通的 - 修复您的构建,以便将其包含在内。在 'runtime' 处,某些文件夹可能在 class 路径上,可以解析此文件;如果该文件夹在构建过程中没有折叠到你的 jar 中,那就可以解释为什么它在 IDE 中工作而不在其他地方工作。

注意:您通常不需要任何 Apache 实用程序。例如,InputStream 的 transferTo 也可以使它成为 one-liner(取而代之的是 getResourceAsStream)。