最近的工作重点是公司内部开发工具的升级。公司的开发工具是以eclipse3.0为基础开发的插件。之前已经做过一次升级,eclipse的版本升级到了3.2.现在的新需求是要升级到最新版本--Eclipse4.2。因为来公司比较晚,没有参与插件的开发,而且之前也没接触过插件的开发。现在接收升级的工作,有点无从下手。在此记录一下这一个月来在升级过程中遇到的一些问题。

   目前的进度是从3.2升级到3.5:

   首先遇到的错误是打开编辑器时,报错:
java.lang.IncompatibleClassChangeError: Expected static method org.eclipse.jdt.internal.core.UserLibraryManager.getUserLibraryNames()
 
   日志的意思就是期望getUserLibraryNames()方法是静态的。通过查看API发现eclipse3.2时,UserLibraryManager之中的getUserLibraryNames()是静态的,而到eclipse3.5时,此方法变成了非静态的。
    而插件的开发过程中,需要取得userLibraryName,调用了此方法,调用如下:
 
 
  
  1. String[] names = UserLibraryManager.getUserLibraryNames(); 
 
对于静态的方法,我们无需实例化对象,就可以向上面一样直接调用这个方法。
但对于非静态方法,我们就必须先实例化对象,才能调用方法。但这时候问题也就产生了。如过我们这样做:
 
 
 
  
  1. UserLibraryManager userLibraryManager=new UserLibraryManager();  
  2. String[] names = userLibraryManager.getUserLibraryNames(); 
 
有什么问题吗?这样我们可以保证整个过程中用到的是一个UserLibraryManager吗?显然不能保证,而且也不会是一个UserLibraryManager。实际上这样我们得到的应该是Null。
那该怎么办呢,我们应该设法先得到一个UserLibraryManager,而且不能通过实例化的方法,要保证对象的唯一性。
 

在JavaModelManager中我们可以看到

 

 
   
  1.  public static UserLibraryManager getUserLibraryManager()  
  2. {  
  3. … …  

方法。所以我们可以通过JavaModelManager来获得一个UserLibraryManager

最终修改为:

 

 
  
  1. UserLibraryManager userLibraryManager = JavaModelManager.getUserLibraryManage();   
  2. String[] names = userLibraryManager.getUserLibraryNames();