Usando el siguiente código para establecer una propiedad del sistema:


    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);

    }

Esto funciona perfectamente cuando ejecuto la configuración de mi aplicación en mi IDE, IntelliJ. Sin embargo, cuando construyo un JAR e intento usarlo fuera de IntelliJ, la URL del recurso vuelve como nula. ¿Por qué esto es tan?

0
damnbruuh 26 ago. 2020 a las 04:38

1 respuesta

La mejor respuesta

Pasar a través de su cargador de clases es arriesgado. Probablemente no explique su problema, pero podría hacerlo; en cualquier caso, esta forma alternativa de hacerlo es más corta, más simple, más idiomática, funciona en todos los lugares donde tu toma funciona y funciona en más lugares para arrancar:

La mejor manera de obtener recursos como este es así:

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

¡Tenga en cuenta que este comienza con una barra! Este estilo se relaciona con la ubicación del archivo de su propia clase (su paquete, básicamente) si no lo hace.

Cualquiera de los formularios buscará la entrada:

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

Dentro del mismo frasco que vive StartMain.class. Si no está allí, obviamente esto no funcionará: arregle su compilación para que esté incluido. En el 'tiempo de ejecución' alguna carpeta puede estar en la ruta de clases que resolvería este archivo; si esa carpeta no se dobla en su jar durante la compilación, eso explicaría por qué funciona dentro del IDE pero no en otro lugar.

NB: Por lo general, no necesita ninguna utilidad de Apache. Por ejemplo, está el transferTo de InputStream que también puede hacer de esto una sola línea (busque getResourceAsStream en su lugar).

2
rzwitserloot 26 ago. 2020 a las 01:45