最近花时间解决了一些以前积攒的,未曾深入研究的问题。其中一个就是eclipse maven 关联jar包源代码出现乱码的问题。问题的解决方案不算太麻烦,但是追本溯源确是件很有意思的事情(一直追踪到eclipse的源代码,探查到一些开源项目,如:伊利诺斯大学的开源项目CodingSpectator)。当然了,RCP开发本身就挺吸引我的,后面有机会,会和大家分享更多的心得。好了,废话不说,既然知道了存在乱码问题,那么我们想想,eclipse maven插件是怎么绑定源代码的(恩,底层肯定调用了JDT API,是 吧)?面向对象一个很重要的特性就是继承,而约定大于配置的法则则充分将这一特性发挥到了极致(继承式资源lookup模式),只不过这个默认契约对于开发人员来讲是黑盒的(Toolkit,文档,源码都是很好的查看工具)。经过一阵子定位跟踪,我发现了代码源头(https://github.com/eclipse/eclipse.jdt.core/blob/master/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceMapper.java),关键代码如下:
/** * Creates a <code>SourceMapper</code> that locates source in the zip file * at the given location in the specified package fragment root. */ public SourceMapper(IPath sourcePath, String rootPath, Map options, String encoding) { this.areRootPathsComputed = false; this.options = options; this.encoding = encoding; try { this.defaultEncoding = ResourcesPlugin.getWorkspace().getRoot().getDefaultCharset(); } catch (CoreException e) { // use no encoding } if (rootPath != null) { this.rootPaths = new ArrayList(); this.rootPaths.add(rootPath); } this.sourcePath = sourcePath; this.sourceRanges = new HashMap(); this.parametersRanges = new HashMap(); this.parameterNames = new HashMap(); this.importsTable = new HashMap(); this.importsCounterTable = new HashMap(); }
通过这里的分析,我们可以很清晰的看到,只要修改Eclipse的window -> Preferences -> General -> Workspace->Text file encoding,而不用修改project的默认编码就能非常完美的解决问题,不是吗!?
好了,今天就到这里吧。后面还会陆续推出一些源码赏析的文章,希望感兴趣的同学能继续关注,多多交流~
参考资料:
2. http://wiki.eclipse.org/CVS_Howto
3. http://www.vogella.com/articles/EclipseCodeAccess/article.html