Динамически добавлять файл свойств в classpath в веб-приложении tomcat - PullRequest
2 голосов
/ 25 мая 2011

Я пытаюсь динамически добавить файл свойств в путь к классам, как показано ниже

try {
    File fileToAdd = new File(FILE_PATH);
    URL u = fileToAdd.toURL();
    ClassLoader sysLoader = ClassLoader.getSystemClassLoader();
    if (sysLoader instanceof URLClassLoader) {
    sysLoader = (URLClassLoader) sysLoader;
    Class<URLClassLoader> sysLoaderClass = URLClassLoader.class;

    // use reflection to invoke the private addURL method
    Method method = sysLoaderClass.getDeclaredMethod("addURL",
        new Class[] { URL.class });
    method.setAccessible(true);
    method.invoke(sysLoader, new Object[] { u });
    }
} catch (Exception e) {
    logger.error(e.getMessage());
}

Но я не вижу этот файл в своем пути к классам.Когда я проверил это, используя

System.getProperty("java.class.path")

, я не вижу свой файл в этом списке.Я что-то здесь упускаю?

Ответы [ 2 ]

4 голосов
/ 25 мая 2011

вы не можете добавить URL-адрес файла свойств, вы должны добавить URL-адрес каталога , в котором находится файл свойств. Как и в: method.invoke(sysLoader, fileToAdd.getParent().toURL()); тогда вы можете использовать ClassLoader.getResourceAsStream("my.properties"); и ClassLoader будет искать файл во вновь добавленной директории.

из URLClassLoader

"Этот загрузчик классов используется для загрузки классов и ресурсов из пути поиска URL-адресов, относящихся как к JAR-файлам, так и к каталогам . Предполагается, что любой URL-адрес, заканчивающийся символом '/', ссылается на в каталог. В противном случае URL-адрес предполагает ссылку на файл JAR , который будет открыт при необходимости. "

1 голос
/ 25 мая 2011

Возможно, попробуйте этот код, но измените java.library.path или оставьте его таким, какой он есть, если вместо этого вы можете использовать путь к библиотеке.



    /**
     * Allows you to add a path to the library path during runtime
     * @param dllLocation The path you would like to add
     * @return True if the operation completed successfully, false otherwise
     */
    public boolean addDllLocationToPath(final String dllLocation)
    {
        //our return value
        boolean retVal = false;
        try
        {
            System.setProperty("java.library.path", System.getProperty("java.library.path") + ";" + dllLocation);
            //get the sys path field
            Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
            fieldSysPath.setAccessible(true);
            fieldSysPath.set(null, null);
            retVal = true;
        }
        catch (Exception e)
        {
            System.err.println("Could not modify path");
        }
        return retVal;
    }


...