SonarQube OpenEdge插件连接异常求助:本地正常部署后报错
分析SonarQube OpenEdge插件连接AppServer失败的问题
根据你描述的情况——本地Java测试正常,但插件部署到SonarQube后出现远程主机关闭连接的错误,结合日志和代码,我整理了几个可能的原因和对应的排查方向:
关键错误解读
日志里的核心错误是:
java.io.IOException: Une connexion existante a d¹ Ûtre fermÚe par lÆh¶te distant
这是法语,翻译过来是现有连接被远程主机关闭,说明你的插件尝试连接OpenEdge AppServer时,对方主动断开了连接,大概率是连接初始化阶段出了问题。
可能的原因及排查建议
1. SonarQube的安全沙箱限制
SonarQube插件运行在服务器进程中,有严格的类加载和安全策略,可能默认阻止插件发起外部网络连接,或者限制了加载第三方库(比如OpenEdge的客户端库)。
- 检查SonarQube的
conf/sonar.policy文件,给你的插件添加必要的权限:grant codeBase "file:${sonar.path.plugins}/your-openedge-plugin.jar" { // 允许连接到AppServer的端口 permission java.net.SocketPermission "localhost:3090", "connect,resolve"; // 如果需要读取OpenEdge的本地库文件,添加文件权限 permission java.io.FilePermission "<<ALL FILES>>", "read"; }; - 修改后重启SonarQube,测试是否恢复正常。
2. SonarQube运行用户的权限不足
如果SonarQube是作为Windows服务运行,它的登录账户可能和你本地测试用的账户不同,而OpenEdge AppServer可能限制了只有特定用户能连接。
- 打开Windows服务管理器,找到SonarQube服务,查看其“登录”选项卡的账户。
- 尝试把登录账户改成你本地测试时使用的、有OpenEdge访问权限的账户,重启服务后再测试。
3. 网络/防火墙的隔离问题
虽然是连接localhost:3090,但SonarQube进程可能处于不同的网络上下文(比如服务的网络隔离),或者防火墙阻止了连接:
- 用SonarQube运行的用户身份,在服务器上执行
telnet localhost 3090,检查是否能连通。 - 检查Windows防火墙,确认是否允许SonarQube进程访问3090端口,或者暂时关闭防火墙测试(仅用于排查)。
- 确认OpenEdge AppServer的监听地址是
0.0.0.0(允许所有IP访问),而不是仅绑定到特定IP。
4. 插件依赖的完整性问题
本地测试时,OpenEdge的客户端jar和本地库(比如.dll)在你的classpath里,但部署到SonarQube后,这些依赖可能没正确打包进插件:
- 检查插件jar包,确认是否包含了所有OpenEdge客户端的必要依赖(比如
openedge.jar、oejvm.jar等)。 - 如果有本地库文件(
.dll),需要确保它们能被SonarQube进程加载——可以尝试把这些库放到SonarQube的bin目录下,或者配置java.library.path参数(在SonarQube的启动脚本里添加-Djava.library.path=path-to-openedge-libs)。
5. 补充详细日志定位问题
你当前的代码里,连接失败时只打印了简单的提示,无法定位具体错误。建议改用SonarQube的日志框架输出完整堆栈:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ConnectionAppServer { private static final Logger LOG = LoggerFactory.getLogger(ConnectionAppServer.class); OpenProcObject opo=null; OpenAppObject oao=null; public OpenProcObject connection(String ruleProc) { try { this.oao = OpenEdgeAPSConnector.getOpenAppObjectInstance("AppServerDC://localhost:3090"); } catch (Open4GLException | IOException | InterruptedException e2) { LOG.error("Failed to establish connection to OpenEdge AppServer", e2); } try { if(oao != null){ this.opo = oao.createPO(ruleProc); } } catch (Open4GLException e) { LOG.error("Failed to create OpenProcObject for rule: {}", ruleProc, e); } return this.opo; } }
重新打包插件后,查看SonarQube的logs/web.log,里面会有更详细的错误信息,帮助你精准定位问题。
内容的提问来源于stack exchange,提问作者Mahdi lengliz
相关产品推荐
相关产品推荐

