JGit拉取操作在Eclipse插件中挂起问题求助
Git拉取代码在Eclipse插件中挂起的问题排查与解决
先把你的代码贴出来方便对照:
Repository localRepo = new FileRepository(file.getAbsolutePath() + "/.git"); final Git git1 = new Git(localRepo); PullCommand pullCmd = git1.pull().setCredentialsProvider(new UsernamePasswordCredentialsProvider( "user", "pwd")); pullCmd.call(); git1.close();
你说在Eclipse里跑Java应用完全正常,但导出成插件就挂住,结合你还在用JCEF容器的情况,我整理几个最可能的原因和解决办法:
1. 别在UI线程里跑耗时操作
Eclipse插件的UI操作是绑定在SWT UI线程上的,如果你是在点击按钮的回调(UI线程)里直接调用pullCmd.call(),那必然会阻塞UI——Git拉取涉及网络IO,慢的时候能卡好几秒,UI线程被占住整个插件就会看起来“挂起”。
解决办法:把Git拉取丢到后台线程执行,用Eclipse自带的Job API最方便:
Job pullJob = new Job("执行Git拉取") { @Override protected IStatus run(IProgressMonitor monitor) { try { // 这里放你的Git拉取代码 Repository localRepo = new FileRepository(file.getAbsolutePath() + "/.git"); final Git git1 = new Git(localRepo); PullCommand pullCmd = git1.pull().setCredentialsProvider(new UsernamePasswordCredentialsProvider( "user", "pwd")); pullCmd.call(); git1.close(); return Status.OK_STATUS; } catch (Exception e) { // 这里可以把错误信息抛到Eclipse的日志里 return new Status(IStatus.ERROR, "你的插件ID", "Git拉取失败", e); } } }; pullJob.schedule(); // 启动后台任务
2. 注意JCEF的线程模型冲突
JCEF有自己的线程体系,如果你是在JCEF的回调(比如点击网页里的元素触发的事件)里执行Git操作,很可能和Eclipse的SWT线程模型冲突,导致线程死锁或者阻塞。
解决办法:把Git操作切换到Eclipse的线程环境里,比如用Display.getDefault().asyncExec()或者上面的Job来中转:
// 假设这是JCEF的点击回调里的代码 Display.getDefault().asyncExec(() -> { Job pullJob = new Job("执行Git拉取") { // 内容和上面一样 }; pullJob.schedule(); });
3. 插件环境的权限/配置差异
普通Java应用和Eclipse插件的运行环境不一样,比如文件访问权限、Git配置的读取路径,可能导致拉取操作卡在权限验证或者文件读取环节,看起来像是挂起。
排查&解决:
- 检查插件的权限:在
plugin.xml里确认添加了文件系统访问的相关权限,比如依赖org.eclipse.core.runtime.filesystem,或者在bundle的Permissions里添加java.io.FilePermission - 开启JGit调试日志,看具体卡在哪一步:
然后打开Eclipse的// 在拉取代码前添加 System.setProperty("org.eclipse.jgit.util.HttpSupport.DEBUG", "true"); System.setProperty("org.eclipse.jgit.transport.Transport.DEBUG", "true");Error Log视图,查看详细日志,就能知道是卡在网络请求还是文件操作了。
4. JGit版本兼容性问题
如果你自己打包了JGit到插件里,可能和Eclipse平台自带的JGit版本冲突,导致一些隐性的线程或者API调用问题。
解决办法:通过Eclipse的Target Platform来管理JGit依赖,直接依赖Eclipse提供的org.eclipse.jgit bundle,不要自己打包Jar进去,这样版本兼容性会好很多。
内容的提问来源于stack exchange,提问作者Kallol Ghose
相关产品推荐
相关产品推荐

