其他常见问题

如何显示自动配置的详细信息

加上 JVM 运行参数 -Ddebug,可以显示启动过程中的详细信息,并通过 Debug 级别的日志显示已启动的自动配置的 bean 服务。

如何使用 dependencyManagement 添加 SOFABoot 依赖

  • 工程原型中是用 parent 标签引入 SOFABoot 的间接依赖。

  • 也可以使用 dependencyManagement 添加依赖,如下所示:

    <dependencyManagement>
        <dependencies>
            <!-- SOFABoot dependencies -->
            <dependency>
                <groupId>com.alipay.sofa</groupId>
                <artifactId>sofaboot-enterprise-dependencies</artifactId>
                <version>2.3.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

使用 DEV 模式进行 RPC 调用时提示找不到服务

检查电脑用户主目录下是否存在名为 localFileRegisty 的目录以及 localFileRegisty 目录下是否存在名为 localRegistry.reg 的文件。

  • 如果存在,则检查其中是否存在需要调用的服务的元数据信息。同时,请保证 DEV 模式下发布服务的应用使用的是 SOFABoot 2.1.3 及以上的版本。

  • 如果不存在,将服务发布端应用的 SOFABoot 升级到 2.1.3 及以上版本。

SOFABoot 是否支持 iBATIS

  • iBATIS 可以在 SOFABoot 中使用。但 SOFABoot 使用的是 Spring 4,而 Spring 4 不支持 iBATIS,在使用过程中可能会遇到类似“SqlMapClientDAOSupport 类找不到”的问题。

    因此,您可以在对应的 pom.xml 中添加如下 iBATIS 提供的依赖:

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-2-spring</artifactId>
        <version>1.0.3</version>
    </dependency>
  • iBATIS 社区已经不支持运维,为了以后长期的发展与业务稳定,建议升级到 MyBatis。配置方法请参见 Spring Boot Starter

Unsupported major.minor version 51.0 异常

现象

当编译工程时,收到以下报错:

Exceptionin thread "main" java.lang.UnsupportedClassVersionError:
Unsupported major.minor version 51.0

解决方案

使用 JDK 7 或以上版本来运行工程(推荐使用 JDK 8)。

Tracer 类转换异常

现象

出现如下错误:

原因

DummyContextUtil 的 create 操作和 clear 操作必须要配合使用。如果调用 create 操作时,当前 Tracer 上下文(即 ThreadLocal 中)不为空,便会出现 Tracer 类转换异常的错误。

解决方案

在调用 create 操作时,与 clear 操作配合使用即可。

Spring 配置解析错误

现象

Spring 在解析配置文件时出现如下错误:

Causedby: org.xml.sax.SAXParseException; lineNumber:240; columnNumber:58;对实体"v"的引用必须以';'分隔符结尾。
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1472)
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(XMLScanner.java:913)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanAttribute(XMLNSDocumentScannerImpl.java:447)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:250)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:841)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:770)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
    at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:76)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadDocument(XmlBeanDefinitionReader.java:429)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391)
...56 more

原因

配置文件中出现 & 字符,如 p=1&v=4.0

解决方案

将配置的字符 & 换为转义字符 &amp; 进行配置即可。如:将 p=1&v=4.0 替换为 p=1&amp;v=4.0

Maven 打包时出现规则检查错误

现象

Maven 打包时出现如下提示:

Please check rules in your project:
1.SOFATracer dependencies should be com.alipay.sofa:tracer-core and com.alipay.sofa:tracer-extensions !!!
2.SOFALookout dependency should be com.alipay.sofa.lookout:lookout-api !!!

原因

SOFABoot 2.4.0 及以上版本更新了 SOFATracer 及 SOFALookout 的依赖,并强制执行规则检查。未更新的依赖会导致 Maven 编译失败。

解决方案

更新 SOFATracer 及 SOFALookout 依赖如下:

<dependency>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>tracer-core</artifactId>
</dependency>
<dependency>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>tracer-extensions</artifactId>
</dependency>
<dependency>
    <groupId>com.alipay.sofa.lookout</groupId>
    <artifactId>lookout-api</artifactId>
</dependency>

SOFABoot 应用无故退出

原因

  • 没有使用发布部署运行应用,而是直接使用 Java 运行。

  • 在运行应用时,未使用 nohup,导致当前窗口关闭后,SOFABoot 应用关闭。

示例如下:莫名退出1莫名退出2

解决方案

使用类似下述命令行,启动应用:nohup java -Djava.security.egd=file:/dev/./urandom -jar XXX.jar > Log.log &

SOFABoot 应用在云端启动缓慢

现象

如题

原因

使用默认的 /dev/random 取随机数的时候依赖于系统中断,因此在系统的中断数不足时,/dev/random 设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用。

解决方案

启动的时候传入参数 -Djava.security.egd=file:/dev/./urandom

说明

/dev/urandom 不依赖系统的中断,也就不会造成进程忙等待,但是会导致数据的随机性不高。

SOFABoot 应用在云端无法启动 tengine

现象

如题

原因

应用程序有 hook,修改了 WORK_DIR 这个变量。示例如下:无法启动 tengine

解决方案

修改应用程序代码,使其不要修改 WORK_DIR,因为技术栈使用了该变量。

profiles-active 启动参数出现问题导致服务无法启动

现象

profiles-active 启动参数出现问题导致服务无法启动。

  • 客户在发布部署页面配置了 2 个环境参数:-Ddbmode=coredev-Dspring.profiles.active = dev

  • 在实际部署时多出 1 个参数 -Dspring.profiles.active=coredev

  • 服务无法启动

原因

客户的配置文件名称有误。

解决方案

修改 application-dev.propertiesapplication-coredev.properties