繁体   English   中英

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

通过你的类加载器是有风险的。 它可能无法解释您的问题,但可能会; 无论如何,这种替代方法更短、更简单、更惯用,适用于您拍摄的所有地方,并且适用于更多启动位置:

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

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

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

任一表单都将查找条目:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM