在WCC中使用自定义Java组件的NoClassDefFoundError

时间:2016-06-08 15:31:11

标签: java classpath 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

2 个答案:

答案 0 :(得分:1)

对于初学者,我会使用ServiceHandler而不是服务。

确保在Build&gt;下有一个installID;高级设置。

有关构建自定义组件的更多信息,请访问:

答案 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记录器类并回避整个记录错误问题。