导出为 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
)。
使用以下代码设置系统属性:
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
)。