#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 выполнит поиск файла во вновь добавленном каталоге.
«Этот загрузчик классов используется для загрузки классов и ресурсов из пути поиска 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;
}