【spark】Could not initialize class org.apache.spark.internal.config.package$

博客围绕Spark项目在服务器测试时出现的“Could not initialize class org.apache.spark.internal.config.package$”错误展开。先描述问题,本地测试正常,服务器build报错。接着阐述解决思路,经分析、远程调试等,发现是主机hostname修改致IP映射问题,添加映射关系后解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Could not initialize class org.apache.spark.internal.config.package$

问题描述

有一个spark sql项目,使用local[*]模式测试,在本地一切OK,但是放到服务器上测试的时候,一buildSparkSession就报错:

[2018-08-30 08:42:00] [Thread-225] [WARN] [org.apache.spark.internal.Logging$class:66] Another SparkContext is being constructed (or threw an exception in its constructor).  This may indicate an error, since only one SparkContext may be running in this JVM (see SPARK-2243). The other SparkContext was created at:
org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:910)
com.enmo.dbaas.util.MongoSparkSession$.get(MongoSparkSession.scala:25)
com.enmo.dbaas.util.MongoSparkSession$.getDefault(MongoSparkSession.scala:30)
com.enmo.dbaas.controller.ComputeTriggerController$$anon$1.run(ComputeTriggerController.scala:66)
java.lang.Thread.run(Thread.java:748)
[2018-08-30 08:42:00] [Thread-225] [INFO] [org.apache.spark.internal.Logging$class:54] Running Spark version 2.2.1
[2018-08-30 08:45:00] [http-nio-8098-exec-10] [WARN] [org.apache.spark.internal.Logging$class:66] Another SparkContext is being constructed (or threw an exception in its constructor).  This may indicate an error, since only one SparkContext may be running in this JVM (see SPARK-2243). The other SparkContext was created at:
org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:910)
com.enmo.dbaas.util.MongoSparkSession$.get(MongoSparkSession.scala:25)
com.enmo.dbaas.util.MongoSparkSession$.getDefault(MongoSparkSession.scala:30)
com.enmo.dbaas.controller.ComputeTriggerController$$anon$1.run(ComputeTriggerController.scala:66)
java.lang.Thread.run(Thread.java:748)
[2018-08-30 08:45:00] [http-nio-8098-exec-10] [INFO] [org.apache.spark.internal.Logging$class:54] Running Spark version 2.2.1
[2018-08-30 08:45:00] [http-nio-8098-exec-10] [ERROR] [org.apache.juli.logging.DirectJDKLog:182] Servlet.service() for servlet [dispatcherServlet] in context with path [/dbaasMonitorOfflineCompute] threw exception [Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.apache.spark.internal.config.package$] with root cause
java.lang.NoClassDefFoundError: Could not initialize class org.apache.spark.internal.config.package$
    at org.apache.spark.SparkConf.validateSettings(SparkConf.scala:546)
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:373)
    at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2516)
    at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:918)
    at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:910)
    at scala.Option.getOrElse(Option.scala:121)
    at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:910)
    at com.enmo.dbaas.util.MongoSparkSession$.get(MongoSparkSession.scala:25)
    at com.enmo.dbaas.util.MongoSparkSession$.getDefault(MongoSparkSession.scala:30)
    at com.enmo.dbaas.controller.ComputeTriggerController.segment(ComputeTriggerController.scala:175)
    at sun.reflect.GeneratedMethodAccessor127.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:108)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

解决思路

这就奇了怪了,报Could not initialize class xxx这个错,一般是JVM在加载类的时候,初始化静态变量或者执行静态代码块的时候报错,后面任何时候任何地方使用这个类都会报Could not initialize class xxx,只有在第一次初始化这个类的时候会抛出导致静态变量初始化失败或静态代码块执行失败的真实错误。

看了一下org.apache.spark.internal.config.package这个类,是一个scalapackage object类,简单认为就是一个类包含多个静态变量或静态内部类。看来上面的猜想是对的。

马上重启项目,触发错误,然而第一次加载类并没有抛出真实错误(或者是spark捕获了异常并没有抛出),原因不得而知;分析了StcakTrace,找到相关的代码行,发现真的是调用org.apache.spark.internal.config.package的一个静态变量,不过没有抛出异常实在太让人迷惑了,思路一度中断。

错误里面包含

Another SparkContext is being constructed (or threw an exception in its constructor).  This may indicate an error, since only one SparkContext may be running in this JVM (see SPARK-2243).

这样的描述,走了一些弯路。Google半天,发现一个方法是设置环境变量SPARK_LOCAL_IP=#{YOUR_SERVER_IP},这个方法是确实可以,但是需要加环境变量,这个项目之前运行都是没有问题的,突然就不行了,一定得找到问题所在。

报错的地方是在org.apache.spark.SparkConf 546行:

546 val encryptionEnabled = get(NETWORK_ENCRYPTION_ENABLED) || get(SASL_ENCRYPTION_ENABLED)

猜想是网络问题,本地无法复现,准备远程调试。

首先用Debug模式重启项目,并制定远程端口(注意防火墙设置):

java -jar -Xms1024m -Xmx1024m -Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=55555 a.jar

然后打开ItelliJ IDEA,导入对应的项目:
这里写图片描述
这里写图片描述
这里写图片描述

server上启动项目后,马上debug刚刚配置的remote JVM,然后触发错误,断点到了org.apache.spark.SparkConf 546行,step over后马上报错:

[2018-08-30 14:36:03] [http-nio-8098-exec-4] [ERROR] [org.apache.juli.logging.DirectJDKLog:182] Servlet.service() for servlet [dispatcherServlet] in context with path [/xx] threw exception [Handler dispatch failed; nested exception is java.lang.ExceptionInInitializerError] with root cause
java.net.UnknownHostException: dev: Name or service not known
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323)
    at java.net.InetAddress.getLocalHost(InetAddress.java:1500)
    at org.apache.spark.util.Utils$.findLocalInetAddress(Utils.scala:891)
    at org.apache.spark.util.Utils$.org$apache$spark$util$Utils$$localIpAddress$lzycompute(Utils.scala:884)
    at org.apache.spark.util.Utils$.org$apache$spark$util$Utils$$localIpAddress(Utils.scala:884)
    at org.apache.spark.util.Utils$$anonfun$localHostName$1.apply(Utils.scala:941)
	at org.apache.spark.util.Utils$$anonfun$localHostName$1.apply(Utils.scala:941)
    at scala.Option.getOrElse(Option.scala:121)
    at org.apache.spark.util.Utils$.localHostName(Utils.scala:941)
    at org.apache.spark.internal.config.package$.<init>(package.scala:204)
    at org.apache.spark.internal.config.package$.<clinit>(package.scala)
    at org.apache.spark.SparkConf.validateSettings(SparkConf.scala:546)
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:373)
    at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2516)
    at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:918)
    at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:910)
    at scala.Option.getOrElse(Option.scala:121)
    at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:910)
    at com.enmo.dbaas.util.MongoSparkSession$.get(MongoSparkSession.scala:25)
    at com.enmo.dbaas.util.MongoSparkSession$.getDefault(MongoSparkSession.scala:30)
    at com.enmo.dbaas.controller.ComputeTriggerController.tablespace(ComputeTriggerController.scala:116)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:108)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

不知为什么日志没有记录这个ERROR,这个日志级别并不是DEBUG,但是找到错了就松了一口气。找到报错的方法:

  private def findLocalInetAddress(): InetAddress = {
    val defaultIpOverride = System.getenv("SPARK_LOCAL_IP")
    if (defaultIpOverride != null) {
      InetAddress.getByName(defaultIpOverride)
    } else {
      val address = InetAddress.getLocalHost
      if (address.isLoopbackAddress) {
        // Address resolves to something like 127.0.1.1, which happens on Debian; try to find
        // a better address using the local network interfaces
        // getNetworkInterfaces returns ifs in reverse order compared to ifconfig output order
        // on unix-like system. On windows, it returns in index order.
        // It's more proper to pick ip address following system output order.
        val activeNetworkIFs = NetworkInterface.getNetworkInterfaces.asScala.toSeq
        val reOrderedNetworkIFs = if (isWindows) activeNetworkIFs else activeNetworkIFs.reverse

        for (ni <- reOrderedNetworkIFs) {
          val addresses = ni.getInetAddresses.asScala
            .filterNot(addr => addr.isLinkLocalAddress || addr.isLoopbackAddress).toSeq
          if (addresses.nonEmpty) {
            val addr = addresses.find(_.isInstanceOf[Inet4Address]).getOrElse(addresses.head)
            // because of Inet6Address.toHostName may add interface at the end if it knows about it
            val strippedAddress = InetAddress.getByAddress(addr.getAddress)
            // We've found an address that looks reasonable!
            logWarning("Your hostname, " + InetAddress.getLocalHost.getHostName + " resolves to" +
              " a loopback address: " + address.getHostAddress + "; using " +
              strippedAddress.getHostAddress + " instead (on interface " + ni.getName + ")")
            logWarning("Set SPARK_LOCAL_IP if you need to bind to another address")
            return strippedAddress
          }
        }
        logWarning("Your hostname, " + InetAddress.getLocalHost.getHostName + " resolves to" +
          " a loopback address: " + address.getHostAddress + ", but we couldn't find any" +
          " external IP address!")
        logWarning("Set SPARK_LOCAL_IP if you need to bind to another address")
      }
      address
    }
  }

原来是先从SPARK_LOCAL_IP环境变量找IP,再找hostname对应的IP。正常情况下,hostname会在/etc/hosts映射成127.0.0.1,但是这个主机的hostname被修改过,导致hostname对应的ip为空,所以才会报java.net.UnknownHostException: dev: Name or service not known

/etc/hosts加上主机名和ip的映射关系,重启后一切正常。

总结

搜索过程中发现很多类似的错误,大部分都是具体到org.apache.spark.internal.config.package$某一个变量,以后遇到这种问题,用相同的解决思路应该能找打解决办法。

<think>我们正在处理一个关于ApachePOI库中XWPFDocument初始化错误的问题。错误信息是:"Couldnotinitializeclassorg.apache.poi.ooxml.util.DocumentHelper"。这个错误通常与类路径中缺少必要的依赖库或版本冲突有关。根据引用[1]中提到的错误(虽然不完全相同,但属于同一类问题)以及常见的解决经验,我们可以从以下几个方面进行排查和解决:1.**检查POI版本一致性**:确保所有POI相关的jar包版本一致,避免混用不同版本的jar包。特别是,确保使用最新的稳定版本,因为旧版本可能存在已知的bug。2.**检查依赖完整性**:确保包含了所有必要的依赖。对于XWPFDocument,通常需要以下模块(以5.2.0版本为例):-poi-poi-ooxml-poi-ooxml-lite(可选,如果使用)-xmlbeans-commons-compress-commons-io-SparseBitSet(在poi-examples中,但通常不需要,除非使用示例)3.**检查依赖冲突**:如果项目中存在多个版本的POI或其他冲突库(如xmlbeans),可能会导致该错误。使用Maven的依赖树分析工具(`mvndependency:tree`)或Gradle的依赖报告(`gradledependencies`)来检查版本冲突。4.**检查类路径**:确保所有需要的jar包都包含在类路径中。如果是在Web应用中,检查WEB-INF/lib目录;如果是独立应用,检查运行时classpath。5.**更新到最新版本**:考虑升级到最新稳定版本的ApachePOI,因为新版本可能已经修复了该问题。具体步骤:**步骤1:确认依赖**如果使用Maven,检查pom.xml中POI相关依赖,例如:```xml<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.0</version></dependency>```同时,确保传递依赖的库版本一致,如xmlbeans、commons-compress等。如果发现多个版本,可以通过排除旧版本或强制指定版本来解决。**步骤2:清理和重新构建**清理项目(如删除target目录)并重新构建,确保所有依赖正确下载。**步骤3:检查环境**如果是IDE(如Eclipse、IntelliJIDEA),检查项目构建路径中的库是否完整。如果是服务器环境,检查部署的lib目录。**步骤4:查看日志**查看完整的异常堆栈,看是否有更底层的异常信息,这有助于定位问题。**步骤5:尝试简单测试**编写一个简单的测试程序,仅使用XWPFDocument创建文档,看是否能正常运行。例如:```javaimportorg.apache.poi.xwpf.usermodel.XWPFDocument;publicclassTest{publicstaticvoidmain(String[]args)throwsException{XWPFDocumentdoc=newXWPFDocument();System.out.println("Documentcreatedsuccessfully.");doc.close();}}```如果这个简单测试也失败,则肯定是环境配置问题。**步骤6:考虑兼容性**如果项目中使用了其他依赖库(如旧版本的xmlbeans),可能会与POI所需的版本冲突。需要排除冲突的版本。常见原因:该错误可能是由于缺少`org.apache.poi.ooxml.util.DocumentHelper`类,但实际上这个类是包含在`poi-ooxml`中的。所以,如果出现这个错误,很可能是类加载时初始化失败,可能由静态块或静态变量初始化失败引起,这往往是因为缺少依赖的库(如xmlbeans)或版本不匹配。根据经验,这个问题最常见的原因是xmlbeans的版本问题。POI5.x需要xmlbeans5.x,如果项目中引入了xmlbeans3.x或其他版本,可能导致该错误。因此,重点检查xmlbeans的版本,确保使用5.0.0以上版本。在Maven中,可以显式指定:```xml<dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>5.0.0</version></dependency>```同时,注意commons-compress的版本,POI5.x需要1.21以上版本。如果上述步骤不能解决问题,请提供更多信息,例如完整的异常堆栈和项目依赖列表。希望这些步骤能帮助您解决问题。§§相关问题§§1.如何检查Maven项目的依赖冲突?2.如何在IntelliJIDEA中查看项目的依赖树?3.ApachePOI中处理Word文档(.docx)的基本用法有哪些?4.如何升级ApachePOI到最新版本?5.JavaWeb项目中如何正确引入POI库?</think>### XWPFDocument初始化错误解决方案 出现`Could not initialize class org.apache.poi.ooxml.util.DocumentHelper`错误通常是由以下原因导致的,请按顺序排查: #### 1. **依赖版本不匹配**(最常见原因) - **问题**:POI核心库与ooxml库版本不一致 - **解决方案**: 1. 确保所有POI组件使用**相同版本**(例如全部5.2.0) 2. Maven配置示例: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.0</version> </dependency> ``` 3. 检查冲突依赖: ```bash mvn dependency:tree | grep poi ``` 4. 强制统一版本(Gradle): ```gradle configurations.all { resolutionStrategy.force 'org.apache.poi:poi:5.2.0' resolutionStrategy.force 'org.apache.poi:poi-ooxml:5.2.0' } ``` #### 2. **缺少必需依赖** - **必需组件**: - `xmlbeans`(POI 5.x+ 需要 ≥5.0.0) - `commons-compress`(≥1.21) - `commons-io`(≥2.11) - **解决方案**: ```xml <dependency> <groupId>org.apache.xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <version>5.0.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.21</version> </dependency> ``` #### 3. **类加载冲突** - **问题**:Web容器中多版本JAR冲突 - **解决方案**: 1. 检查`WEB-INF/lib`目录,删除重复POI JAR 2. 在Tomcat的`conf/catalina.properties`添加: ```properties tomcat.util.scan.StandardJarScanFilter.jarsToScan=\ poi*.jar,xmlbeans*.jar,commons*.jar tomcat.util.scan.StandardJarScanFilter.jarsToSkip=*.jar ``` #### 4. **静态初始化失败** - **问题**:`DocumentHelper`类静态块初始化失败 - **解决方案**: 1. 检查JVM权限策略文件 2. 添加JVM参数捕获详细错误: ```bash -Dorg.apache.poi.util.POILogger=org.apache.poi.util.SystemOutLogger ``` #### 5. **完整依赖示例(Maven)** ```xml <dependencies> <!-- POI Core --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.0</version> </dependency> <!-- OOXML支持 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.0</version> </dependency> <!-- 必需依赖 --> <dependency> <groupId>org.apache.xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <version>5.0.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.21</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency> </dependencies> ``` > **验证代码**:执行此测试确认环境 > ```java > public class DocTest { > public static void main(String[] args) throws Exception { > try (XWPFDocument doc = new XWPFDocument()) { > doc.createParagraph().createRun().setText("Success!"); > System.out.println("XWPFDocument initialized successfully"); > } > } > } > ``` #### 6. **升级建议** 若仍失败: 1. 升级到最新稳定版(当前POI 5.2.3) 2. 清理本地仓库缓存: ```bash mvn dependency:purge-local-repository ``` 3. 检查JDK兼容性(POI 5.x需要JDK 8+) > 注意:避免混用Spring Boot的`spring-boot-starter-data-mongodb`等包含旧版POI的依赖[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值