我正在尝试为oracle-ucm创建自定义Java组件。
它安装当前然而当我运行代码时我得到:
System code execution error. Unable to create service. java.lang.NoClassDefFoundError: com/lowes/content/edam/massMetaDataUpdate/service/ServiceApplication.
component.hda文件如下所示:
<?hda version="11.1.1.8.0PSU-2015-01-08 07:49:21Z-r123144" jcharset="UTF8" encoding="utf-8"?>
@Properties LocalData
ComponentName=LowesMassMetadataUpdater
blDateFormat=M/d{/yy}{ h:mm[:ss]{ a}}!mAM,PM!tAmerica/New_York
classpath=$COMPONENT_DIR/classes
hasPreferenceData=0
libpath=$COMPONENT_DIR/libs
preventAdditionalComponentDowngrade=0
version=2016_06_08(build 1)
@end
作为参考,我的服务类的开头是这样的:
package com.lowes.content.edam.massMetaDataUpdate.service;
import intradoc.server.Service;
public class MMUService extends Service
{ //this is the line that is throwing the error.
private ServiceApplication app = new ServiceApplication();
/** Default Constructor - Does Nothing */
public MMUService() { }
//rest of class omitted for brevity
}
我的组件在MMUService类中配置启动,该类与无法找到的类位于同一个包中。两个类文件都直接位于同一文件夹中。那么为什么它可以找到初始服务类,而不是来自同一个包的包含的辅助类呢?
从组件向导进行高级构建设置
除了以下所有空白:
自定义类路径: $COMPONENT_DIR/classes
自定义库路径: $COMPONENT_DIR/libs
答案 0 :(得分:1)
答案 1 :(得分:0)
我能够找出问题所在。在应用程序显示NoClassDefFoundError
之前,它显示了一个记录错误。但是,在后续页面上加载该错误将消失。
结果记录错误:
System code execution error. Unable to create service. Exception type is 'java.lang.ExceptionInInitializerError'.
Runtime error: org.apache.commons.logging.LogConfigurationException:
org.apache.commons.logging.LogConfigurationException:
org.apache.commons.logging.LogConfigurationException:
Class org.apache.commons.logging.impl.Jdk14Logger does not implement Log Runtime error:
org.apache.commons.logging.LogConfigurationException:
org.apache.commons.logging.LogConfigurationException:
Class org.apache.commons.logging.impl.Jdk14Logger does not implement Log Runtime error:
org.apache.commons.logging.LogConfigurationException:
Class org.apache.commons.logging.impl.Jdk14Logger does not implement Log
是我的问题的真正原因。并深入研究,发现WCC中的Classloader正在加载一个与应用程序预期不同的 Apache Commons Logging 版本。
修复是创建一个SystemUtils
的Wrapper类来实现Log
,然后设置系统属性org.apache.commons.logging.Log
,以便在类调用LogFactory.getLog(classname.class);
时它们将获得我的WCC记录器类并回避整个记录错误问题。