`
superxielei
  • 浏览: 266673 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

How to access eclipse workspace?

阅读更多

摘要:

   在开发eclipse pluin的时候,某些情况下我们需要访问eclipse workspace,例如:在插件中以编程的方式调用ant命令、访问eclipse workspace中的project等。一次在网上偶遇到本文的原创者kobye,此人正在进行jsports项目的开发,对此颇有心地,故在此行文与 众人共同探讨之。

一、基础工作-在插件中以编程的方式调用ant命令:

   在开发eclipse pluin的时候,某些情况下我们需要访问eclipse workspace,例如:在插件中以编程的方式调用ant命令等。

   如何做到这一点?

 public void execute(){
     IWorkspace ws = ResourcesPlugin.getWorkspace();
     IProject[] ps = ws.getRoot().getProjects();
     System.out.println(ws.getRoot().getFullPath().makeAbsolute().toOSString());

     for(int i=0;i<ps.length;i++){
         IProject p = ps[i];
         IPath location = p.getLocation();
         IFile ifile = p.getFile("build.xml");
         System.out.println(ifile.getLocation().toFile().getAbsolutePath());      
         File f =  new File(ifile.getLocation().toFile().getAbsolutePath());
         if(!f.exists()){
             continue;
         }
         Project pro = new Project();        
         pro.setBasedir(location.toFile().getAbsolutePath());
         pro.init();
         ProjectHelper helper = ProjectHelper.getProjectHelper();
         helper.parse(pro, f);
         Hashtable tars = pro.getTargets();
         System.out.println("name==="+name);
         Target t = (Target) tars.get(name);
         if(t==null){
             return;
         }
         DefaultLogger consoleLogger = new DefaultLogger();
         consoleLogger.setErrorPrintStream(System.err);
         consoleLogger.setOutputPrintStream(System.out);
         consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
         pro.addBuildListener(consoleLogger);   
         pro.executeTarget(this.name);
         break;
     }
    
 }



以上代码(单独编译不会通过,请把 name换位ant 的target)可以放到插件的代码中。

以上代码的含义:

    获 得eclipse workspace的引用,对workspace下的pronjects进行循环,如果该project下有build.xml并且该文件中有name的 target那么就以ant的方式调用,并把ant运行的输出输出到eclipse的console。

二、如何访问current project:

   上一节给出来在eclipse plugin 中访问eclipse workspace, 从而访问该workspace下所有project的方案,WorkSpace以及相关的类不提供直接访问current project的方法,所以只能走其他途径.

    在我们的plugin中,我们要提供界面入口,比如 PopMenu  ActionMenu 等之类的,
这些界面入口是要实现一些接口的,例如:PopMenu要实现IObjectActionDelegate,
这个接口有几个方法,其中 public void selectionChanged(IAction action, ISelection
selection) ;

这个方法很早重要,可以通过ISelection获得当前选择中的Project.

ISelection共有三个子接口,分别对应三个实现类,那么通过判断ISelection的实际类型可以获得其子接口的引用,
然后对其遍历,通过getAdaptor方法获得所有的选择的IResource的引用,
再进一步对IResource进行类型识别,得到IResource.PROJECT类型的元素即为IProject的引用.

下面是程序:

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Iterator;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;

import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;

/**
 * @author Kobye
 */
public class TestPopMenu implements IObjectActionDelegate {
   private IStructuredSelection selection;



 /**
 * Constructor for Action1.
 */
 public TestPopMenu () {
 super();
 }

 /**
 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
 */
 public void setActivePart(IAction action, IWorkbenchPart targetPart) {

 }

 /**
 * @see IActionDelegate#run(IAction)
 */
 public void run(IAction action) {
 Shell shell = new Shell();
 MessageDialog.openInformation(
  shell,
  "Pop Plug-in",
  "New Action was executed.");

 }

 public static Object getAdapter(Object adaptable, Class c) {
 if (c.isInstance(adaptable)) {
  return adaptable;
 }
 if (adaptable instanceof IAdaptable) {
  IAdaptable a = (IAdaptable) adaptable;
  Object adapter = a.getAdapter(c);
  if (c.isInstance(adapter)) {
   return adapter;
  }
 }
 return null;
 }


 /***
 * 这个方法和下面的方法很重要。
 * @param selection
 * @param c
 * @return
 */
 private Object[] getSelectedResources(IStructuredSelection selection,Class c) {
 return getSelectedAdaptables(selection, c);
 }

 private static Object[] getSelectedAdaptables(ISelection selection, Class c) {
 ArrayList result = null;
 if (!selection.isEmpty()) {
  result = new ArrayList();
  Iterator elements = ((IStructuredSelection) selection).iterator();
  while (elements.hasNext()) {
   Object adapter = getAdapter(elements.next(), c);
   if (c.isInstance(adapter)) {
    result.add(adapter);
   }
  }
 }
 if (result != null && !result.isEmpty()) {
  return result.toArray((Object[])Array.newInstance(c, result.size()));
 }
 return (Object[])Array.newInstance(c, 0);
 }


 /**
 * 这个方法保存了ISelection的引用,
 * 请注意:ISelection的实际类型因不同的应用,其实际类型可能不同,
 * 共有三种可能,请查阅eclipse API。
 *
 * @see IActionDelegate#selectionChanged(IAction, ISelection)
 */
 public void selectionChanged(IAction action, ISelection selection) {
    this.selection = (IStructuredSelection) selection;
    System.out.println("current project name==="+this.getProject().getName());
 }

 /**
 * 这个方法可以得到current project。
 *
 * @return
 */
 private IProject getProject(){
    IResource[]rs =
(IResource[])getSelectedResources((IStructuredSelection)selection,IResource.class);
    IProject project = null;
    for(int i =0;i<rs.length;i++){
        IResource r = rs[i];
        if(r.getType()==IResource.PROJECT){
            project = (IProject) r;
            break;
        }
    }
    return project;
 }
}
分享到:
评论

相关推荐

    how to use eclipse

    然而,根据“how to use eclipse”这一标题,我将基于这一假设,提供Eclipse开发环境(IDE)的使用方法。 Eclipse是Java开发环境中广泛使用的一款集成开发工具,它是由Eclipse基金会维护的一个开源项目。Eclipse ...

    eclipse-workspace.zip

    【标题】"eclipse-workspace.zip" 是一个包含Eclipse工作空间内容的压缩文件,它通常存储了开发者在Eclipse集成开发环境中(IDE)的工作项目和相关配置。Eclipse是一款广泛应用的开源Java IDE,但同时也支持其他编程...

    eclipse_workspace设置

    在Eclipse中,"workspace"是开发者进行项目管理的核心概念,它是存储项目、配置信息以及Eclipse工作相关数据的地方。下面将详细讨论如何设置和管理Eclipse的workspace。 1. **创建与选择workspace** 当首次启动...

    HOW TO create the WebGoat workspace

    - 解压`Eclipse-Workspace.zip`文件到`C:\WebGoat-x.x`目录下。 2. **启动Eclipse** - 使用`eclipse.bat`文件启动Eclipse。此文件位于`&lt;webgoat-root&gt;/eclipse.bat`目录下。 - 启动后,在Eclipse的左上角“项目...

    eclipse中改变默认的workspace的方法

    ### Eclipse中改变默认Workspace的方法详解 #### 一、引言 Eclipse是一款广泛使用的开源集成开发环境(IDE),适用于多种编程语言,尤其是Java开发者。它提供了丰富的功能来提高开发效率,包括代码编辑、调试、构建...

    如何修改Eclipse的 workspace目录.doc

    如何修改Eclipse的 workspace目录.doc

    Eclipse_workspace-master.zip

    【Eclipse_workspace-master.zip】是一个包含Python项目的压缩包,项目主要目标是实现CAN(Controller Area Network)通信的上位机程序。CAN总线是一种广泛应用在汽车、工业自动化和嵌入式系统中的通信协议,它允许...

    解决Eclipse保存代码时building workspace因前台代码验证导致的速度慢或卡死问题

    ### 解决Eclipse保存代码时building workspace因前台代码验证导致的速度慢或卡死问题 在进行软件开发过程中,经常会遇到各种工具性能问题,这些问题往往会影响到开发效率。其中,Eclipse作为一款广泛使用的集成开发...

    eclipse_workspace

    【标题】"eclipse_workspace" 是一个与Java开发密切相关的概念,它指的是Eclipse集成开发环境(IDE)中的工作空间。在Eclipse中,工作空间是用户进行项目开发的主要区域,包含了所有项目的源代码、配置文件、构建...

    eclipse中自动修改资源文件解决中文问题

    在Eclipse这个强大的Java开发环境中,处理中文字符可能会遇到一些挑战,尤其是在资源文件(如.properties或.xml文件)中。Eclipse默认的编码设置可能不完全兼容中文字符集,导致中文字符显示为乱码或者在保存时出现...

    eclipse-workspace-

    eclipse-workspace测试md

    CppUTest eclipse-workspace.zip

    此资源为在windows环境下使用EClipse进行CppUTest单元测试教程的配套资源。 教程地址:https://tangxing.blog.csdn.net/article/details/118866411

    Eclipse恢复选择工作空间的提示,删除无用的workspace列表

    Eclipse 工作空间恢复选择提示和删除无用workspace列表 Eclipse 平台是 Java 开发者的不二之选,但是在使用 Eclipse 时,我们经常会遇到一些问题,其中之一就是工作空间选择提示的消失。今天,我们将讨论如何恢复 ...

    eclipse-workspace

    Eclipse工作空间(eclipse-workspace)是Eclipse集成开发环境(IDE)中的核心概念之一。它是用户在Eclipse中进行项目开发的主要区域,存储着用户的项目、首选项设置、工作集以及其他配置信息。理解Eclipse工作空间的...

    Workspace ONE Access数字化工作空间枢纽方案.pptx

    Workspace ONE Access数字化工作空间枢纽方案.pptx

    EclipseWorkSpace:一个集中式存储库,用于我在Eclipse IDE上所做的所有工作

    Eclipse工作空间 一个集中式存储库,用于我在Eclipse IDE上所做的所有工作 项目: 虚拟微服务Spring Boot REST API遵循microservices architecture 。 MQTT应用一个简单的MQTT发布者/订阅者应用程序。

    Workspace ONE Access数字化工作空间枢纽方案.pdf

    Workspace ONE Access数字化工作空间枢纽方案.pdf

Global site tag (gtag.js) - Google Analytics