0

我试图找出我们是否可以从文件系统加载 Oracle 商务组件。通常我们将所有代码组装成一个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();
}

但是我们如何将它用于稍后必须由 Nucleus 解决的组件呢?有没有办法指示 Nucleus 从文件系统中解析组件?

4

2 回答 2

1

您应该能够将包含组件类的 JAR 添加到应用程序服务器实例使用的 CLASSPATH 系统变量中。

然后在组件配置中像往常一样定义实现类

$class=some.class.path.class

如果您在较新版本的 ATG (11.0+) 上使用 Jboss EAP 6+,您可能会遇到更多麻烦,由于它的类加载器,您必须跳过更多的障碍

https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7

本质上,您需要定义一个包含 jar 文件的 jboss 模块,并定义 ear 的“模块”和包含您的类的模块之间的依赖关系。

或者,您可以定义一个 ClassLoaderService 来管理 JAR 的类

为此,您需要定义一个新的 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
于 2016-05-25T02:34:55.067 回答
0

我认为您正在寻找 atg.dynamo.data-dir 属性。如果您指定该属性 dynamo 将在该位置查找“服务器配置”或属性文件。这允许您将配置与 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 提供的一次性类加载器,但请记住,这仅用于开发目的。

于 2014-06-26T16:29:15.280 回答