#java #atg #oracle-commerce
#java #atg #oracle-commerce
Вопрос:
Я пытаюсь выяснить, можем ли мы загрузить компонент oracle commerce из файловой системы. Обычно мы собираем весь код в файл ear и развертываем его, однако у меня есть требование, при котором я должен хранить некоторые компоненты в файловой системе, а не упаковывать их вместе с файлом ear.
Я знаю, что мы можем использовать URLClassLoader для загрузки класса, как показано ниже,
File classDir = new File("A:\LodeeModule\classes");
URL[] url = { classDir.toURI().toURL() };
ClassLoader loader = new URLClassLoader(url);
for (File file : classDir.listFiles()) {
String filename = file.getName().replace(".class", "");
loader.loadClass("com.buddha.testers." filename).getConstructor().newInstance();
}
но как мы можем использовать то же самое для компонента, который должен быть разрешен ядром в более поздний момент времени? Есть ли какой-либо способ поручить ядру разрешить компонент из файловой системы?
Ответ №1:
Вы должны просто иметь возможность добавить JAR, содержащий классы components, в системную переменную CLASSPATH, используемую экземпляром сервера приложений.
Затем в конфигурации компонента просто определите класс реализации, как обычно
$class=some.class.path.class
Если вы используете Jboss EAP 6 в более новой версии ATG (11.0 ), у вас могут возникнуть дополнительные проблемы, вам придется перепрыгнуть через еще несколько обручей из-за его загрузчика классов
https://docs.jboss.org/author/display/AS7/Class Загрузка в AS7
По сути, вам нужно будет определить модуль jboss, содержащий ваши файлы jar, и определить зависимость между «модулем» ear и модулем, содержащим ваши классы.
В качестве альтернативы вы можете определить ClassLoaderService, который будет управлять классами для ваших JARS
Для этого вам необходимо определить новый ClassLoaderService, поэтому создайте новый файл свойств, как и для любого другого компонента.
/my/custom/ClassLoaderService.properties
$class=atg.nucleus.ServicesManifestClassLoaderService
$description=Custom Class Loader Service.
# The files to go into the classpath of the classloader
classpathFiles=
/path/to/my/jars/lib/someClasses.jar,
/path/to/my/jars/lib/someOtherClasses.jar
loggingDebug=false
Затем в фактическом компоненте, для которого вам нужны эти классы, добавьте эту строку;
$classloader=/my/custom/ClassLoaderService
Комментарии:
1. Хорошая идея. Я попробую. Можем ли мы также использовать folder вместо jars?
2. Да, вместо установки свойства classpathFiles вы можете установить свойство jarDirectories с именем / именами папки
Ответ №2:
Я думаю, вы ищете свойство atg.dynamo.data-dir . Если вы укажете это свойство, dynamo будет искать в этом местоположении «конфигурации сервера» или файлы свойств. Это позволяет отделить конфигурации от файла ear.
Примечание: вы все равно можете включать конфигурации в ear, я считаю, что они по-прежнему будут иметь приоритет
Обычно это указывается при запуске сервера, что-то вроде:
run.sh -c <your server> -Datg.dynamo.data-dir=/data/something/serverconfigs
Эта функция в значительной степени недокументирована, но многие люди знают об этом.
См http://docs.oracle.com/cd/E24152_01/Platform.10-1/ATGPlatformProgGuide/html/s0302developmentmodeandstandalonemode01.html
РЕДАКТИРОВАТЬ: я неправильно понял, о чем вы изначально спрашивали. Возможно, вы захотите взглянуть на одноразовый загрузчик классов, который предоставляет ATG, но имейте в виду, что он предназначен только для целей разработки.
Комментарии:
1. Привет, Патрик, спасибо. Но мы уже загружаем конфигурации из папок, но как это может помочь нам загрузить компонент? Например, если мы расширяем общий сервис и создаем компонент и не хотим включать это в ear-файл, не только файл свойств, но и файл класса компонента.