使用log4j时出现错误“线程中的异常”主“java.lang.ExceptionInInitializerError”

时间:2018-02-28 06:17:34

标签: java log4j

错误是:

Exception in thread "main" java.lang.ExceptionInInitializerError
at com.agile.pc.cmserver.base.CMLogger.setLogClass(CMLogger.java:39)
at com.agile.util.log.CMLogFactory.getLogger(CMLogFactory.java:77)
at com.agile.util.exception.AppException.<clinit>(AppException.java:28)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at com.sun.proxy.$Proxy23.<clinit>(Unknown Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.reflect.Proxy.newProxyInstance(Unknown Source)
at com.agile.api.pc.EJBRemoteProxy.createRemoteProxy(EJBRemoteProxy.java:60)
at com.agile.api.pc.EJBLookup.getRemoteInterface(EJBLookup.java:1012)
at com.agile.api.pc.EJBLookup.getRemoteInterface(EJBLookup.java:959)
at com.agile.api.pc.EJBLookup.getChangeSession(EJBLookup.java:309)
at com.agile.api.pc.change.Change.getBean(Change.java:106)
at com.agile.api.pc.RouteObject$GetStatusAction.doSdkAction(RouteObject.java:2926)
at com.agile.api.common.SDKAction.run(SDKAction.java:23)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:368)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:163)
at weblogic.security.Security.runAs(Security.java:61)
at com.agile.api.common.WebLogicAuthenticator.doAs(WebLogicAuthenticator.java:111)
at com.agile.api.common.Security.doAs(Security.java:54)
at com.agile.api.common.Security.doAs(Security.java:109)
at com.agile.api.pc.RouteObject.getStatus(RouteObject.java:1206)
at com.gehc.extensions.px.CreateChildSCN.doAction(CreateChildSCN.java:39)
at com.gehc.extensions.px.CreateChildSCN.main(CreateChildSCN.java:124)
Caused by: java.lang.NullPointerException
at org.apache.logging.log4j.util.ProviderUtil.validVersion(ProviderUtil.java:142)
at org.apache.logging.log4j.util.ProviderUtil.loadProvider(ProviderUtil.java:80)
at org.apache.logging.log4j.util.ProviderUtil.<init>(ProviderUtil.java:66)
at org.apache.logging.log4j.util.ProviderUtil.lazyInit(ProviderUtil.java:124)
at org.apache.logging.log4j.util.ProviderUtil.hasProviders(ProviderUtil.java:108)
at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:89)
... 27 more

Javafile:

    import java.util.ResourceBundle;

import org.apache.log4j.Logger;

import com.agile.api.APIException;
import com.agile.api.IAgileSession;
import com.agile.api.IChange;
import com.agile.api.IDataObject;
import com.agile.api.INode;
import com.agile.px.ActionResult;
import com.agile.px.ICustomAction;
import com.gehc.common.core.CreateChildSCN_BO;
import com.gehc.common.pxconstants.GEHC_SCNConstants;
import com.gehc.common.pxutil.SDKUtil;
import com.gehc.common.pxutil.Util;


public class CreateChildSCN implements ICustomAction {
    private static ResourceBundle objResourceBundle = ResourceBundle.getBundle("GEHCCreateChildSCN");
    private static Logger objLogger = Logger.getLogger(CreateChildSCN.class);

    public ActionResult doAction(IAgileSession aSession, INode actionNode,
            IDataObject currentObject){
        Util.initAppLogger(CreateChildSCN.class, Util.getLogFileName());
        StringBuffer pxMessage = new StringBuffer();
        try
        {   
            IChange objChange = (IChange)currentObject;
            String strChangeStatus = objChange.getStatus().toString();
            IAgileSession objAgileSession = null;
            String strUser = aSession.getCurrentUser().toString();
            objLogger.info("Session with Logged on User..::"+aSession.getCurrentUser().toString());

            objAgileSession = SDKUtil.getAgileSession(objResourceBundle
                    .getString("AGILE_USER"), objResourceBundle
                    .getString("AGILE_PASSWORD"), objResourceBundle
                    .getString("AGILE_URL"));


            if(!(strUser.equals(objResourceBundle.getString("CURRENT_USER")))){
                if(strChangeStatus.equals(objResourceBundle.getString("ECO_WORKFLOW_STATUS"))
                        || strChangeStatus.equals(objResourceBundle.getString(("ECR_WORKFLOW_STATUS")))){
                    String suppliers = objChange.getValue(GEHC_SCNConstants.SCN_SUPPLIER_NAME).toString();
                    String supplierGroup = objChange.getValue(GEHC_SCNConstants.SCN_SUPPLIER_USER_GROUPS).toString();
                    //Checking for the suppliers presence
                    if("".equals(suppliers) && "".equals(supplierGroup)){
                        CreateChildSCN_BO objChildSCNBO = new CreateChildSCN_BO();

                                                    pxMessage.append(objChildSCNBO.createSCNs(objAgileSession, objChange));


                    }else{
                        pxMessage.append(objResourceBundle.getString("MESSAGE_ERROR_SUPPLIER_NAME_VALUE"));
                        objLogger.info(objResourceBundle.getString("MESSAGE_ERROR_SUPPLIER_NAME_VALUE"));
                        System.out.println(objResourceBundle.getString("MESSAGE_ERROR_SUPPLIER_NAME_VALUE"));
                    }                       
                }else{
                    //System.out.println(objResourceBundle.getString("MESSAGE_ERROR_WORKFLOW_CRITERIA"));
                    pxMessage.append(objResourceBundle.getString("MESSAGE_ERROR_WORKFLOW_CRITERIA"));
                }   objLogger.info(objResourceBundle.getString("MESSAGE_ERROR_WORKFLOW_CRITERIA"));                             
            }else{
                //System.out.println(objResourceBundle.getString("MESSAGE_ERROR_INVALID_USER_LOGIN"));
                pxMessage.append(objResourceBundle.getString("MESSAGE_ERROR_INVALID_USER_LOGIN"));
                objLogger.info(objResourceBundle.getString("MESSAGE_ERROR_INVALID_USER_LOGIN"));
            }                           
        }catch (Exception apiEx){
            apiEx.printStackTrace();
            System.out.println(objResourceBundle.getString("MESSAGE_ERROR_UNABLE_TO_DO ") + apiEx);
            pxMessage.append(objResourceBundle.getString("MESSAGE_ERROR_UNABLE_TO_DO"));
            objLogger.error(objResourceBundle.getString("MESSAGE_ERROR_UNABLE_TO_DO"));
        }

        return new ActionResult(ActionResult.STRING, pxMessage.toString());
    }

    /**
     * For Stand alone Only 
     * Invokes the doAction method
     */
    public static void main(String[] args) {

        CreateChildSCN objSCRValidation = null;     
        String strNumber = null;
        IAgileSession objAgileSession = null;
        IChange objChange = null;
        ResourceBundle objResources = ResourceBundle.getBundle("GEHCCreateChildSCN");       
        Logger objLogger = Logger.getLogger(CreateChildSCN.class);      

        try {
            objSCRValidation = new CreateChildSCN();
            Util.initAppLogger(CreateChildSCN.class, Util.getLogFileName());
            strNumber = "SCN-0043018";
            // Establish session
            /*objAgileSession = SDKUtil.getAgileSession(objResources
                    .getString("AGILE_USER"), objResources
                    .getString("AGILE_PASSWORD"), objResources
                    .getString("AGILE_URL"));*/

            objAgileSession = SDKUtil.getAgileSession("xxx","xxxx","xxxxxxxxx");
            System.out.println("created session");
            // Load the objChange
            //System.out.println(" Object:: " + objChange.getName());
            objChange = (IChange) objAgileSession
                    .getObject(IChange.OBJECT_TYPE, strNumber); 

            objSCRValidation
                    .doAction(objAgileSession, null, objChange);
        } catch (APIException e) {
            System.out.println("Error log from main thread ::: " + e);
            objLogger.error(objResources.getString("SESSION_FAILED") + Util.exception2String(e)); 
        }
    }

}

它还包含属性文件,我们在其中定义记录器详细信息,如日志文件的路径和文件名以及logger初始化,如log4j.category.com.xxx.common.util.SDKUtil = debug,XLogger 这里我们使用在类路径中初始化的Log4.jar api。

非常感谢任何帮助。

谢谢, Himachandra。

1 个答案:

答案 0 :(得分:0)

如果您查看org.apache.logging.log4j.util.ProviderUtil.validVersion(ProviderUtil.java:142)的代码,则它看起来像是Log4J中的错误:

    private static boolean validVersion(final String version) {
        for (final String v : COMPATIBLE_API_VERSIONS) {
            if (version.startsWith(v)) {
                return true;
            }
        }
        return false;
    }

在该库中,if (version.startsWith(v))应该为if (v.startsWith(version)),因为版本可以为空,但v绝不能为空。

请尝试使用没有此错误的较新版本的log4j。

我没有在版本中看到此问题:

  • 2.11.2

我在版本中看到了这个问题:

  • 2.6.2(org.apache.logging.log4j.util.ProviderUtil.validVersion(ProviderUtil.java:142)处的java.lang.NullPointerException
  • 2.8.2(org.apache.logging.log4j.util.ProviderUtil.validVersion(ProviderUtil.java:142)处的java.lang.NullPointerException
  • 2.10.0(java.lang.NoClassDefFoundError:无法初始化类org.apache.logging.log4j.util.PropertiesUtil)

更改版本对我来说是一个快速修复。但是,它不能解决根本的根本原因。对我来说,我认为junit-log4j-jmockit之间的某种奇怪的交互作用使版本为null。如果我以其他顺序运行测试,那么我没有问题。