Динамическое добавление файла свойств в classpath в веб-приложении tomcat

#java #jakarta-ee #classpath

#java #джакарта-ee #classpath

Вопрос:

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

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

Но я не могу видеть этот файл в моем classpath. Когда я проверил это с помощью

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

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

Ответ №1:

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

из URLClassLoader

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

Ответ №2:

Возможно, попробуйте этот код, но измените 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;
    }