以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返回为null。为什么会这样?

解决方法

通过类加载器是有风险的。它可能无法解释您的问题,但可能可以;无论如何,这种替代方法更短,更简单,更惯用,可在您需要的所有地方使用,并在更多的地方使用:

获取资源的最佳方法如下:

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

请注意,这个以斜杠开头!如果您不这样做,则此样式与您自己的类文件位置(基本上是您的包)有关。

任何一种形式都将查找条目:

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

位于StartMain.class所在的同一jar中。如果不存在,则显然无法正常工作-修复您的构建,使其包含在内。在“运行时”,类路径中的某些文件夹可能会解析此文件;如果在构建过程中没有将该文件夹折叠到您的jar中,那将解释为什么它可以在IDE中工作,而不能在其他地方工作。

注意:您通常不需要任何Apache utils。例如,有InputStream的transferTo也可以使它变成单线(取而代之的是获取getResourceAsStream)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...