Есть ли какой-либо способ загрузить компонент из файловой системы в Oracle Commerce (ATG)?

#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-файл, не только файл свойств, но и файл класса компонента.