注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

隐龙 为了一生的信念

今日默默沉于水,他日飞腾在九天...

 
 
 

日志

 
 

Eclipse 代码创建工程  

2017-04-07 18:56:59|  分类: Eclipse PDE |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  1. public class CreatePluginProject {  
  2.     private static WorkspacePluginModelBase fModel;  
  3.   
  4.     private static PluginClassCodeGenerator fGenerator;  
  5.   
  6.     public static void createPluginProject(String projectName) {  
  7.         // 获取工作区  
  8.         IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();  
  9.   
  10.         // 创建新项目  
  11.         IProject project = root.getProject(projectName);  
  12.   
  13.         // 设置工程的位置  
  14.         // IPath path = new Path("");  
  15.   
  16.         // 为项目指定存放路径,默认放在当前工作区  
  17.         IWorkspace workspace = root.getWorkspace();  
  18.         final IProjectDescription description = workspace  
  19.                 .newProjectDescription(project.getName());  
  20.         description.setLocation(null);  
  21.   
  22.         // 设置工程标记,即为java工程  
  23.         String[] newJavaNature = new String[1];  
  24.         newJavaNature[0] = JavaCore.NATURE_ID; // 这个标记证明本工程是Java工程  
  25.         description.setNatureIds(newJavaNature);  
  26.   
  27.         // 在文件系统中生成工程  
  28.         try {  
  29.             NullProgressMonitor monitor = new NullProgressMonitor();  
  30.             project.create(description, monitor);  
  31.             project.open(IResource.BACKGROUND_REFRESH, new SubProgressMonitor(  
  32.                     monitor, 1000));  
  33.         } catch (CoreException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.   
  37.         // 转化成java工程  
  38.         IJavaProject javaProject = JavaCore.create(project);  
  39.   
  40.         // 创建输出路径  
  41.         IFolder binFolder = javaProject.getProject().getFolder("bin");  
  42.         try {  
  43.             binFolder.create(truetruenull);  
  44.             javaProject.setOutputLocation(binFolder.getFullPath(), null);  
  45.         } catch (CoreException e) {  
  46.             e.printStackTrace();  
  47.         }  
  48.   
  49.         // 设置Java生成器  
  50.         try {  
  51.             IProjectDescription description2 = javaProject.getProject()  
  52.                     .getDescription();  
  53.             ICommand command = description2.newCommand();  
  54.             command.setBuilderName("org.eclipse.jdt.core.javabuilder");  
  55.             description2.setBuildSpec(new ICommand[] { command });  
  56.             description2  
  57.                     .setNatureIds(new String[] { "org.eclipse.jdt.core.javanature" });  
  58.             javaProject.getProject().setDescription(description2, null);  
  59.         } catch (CoreException e) {  
  60.             e.printStackTrace();  
  61.         }  
  62.   
  63.         // 创建源代码文件夹  
  64.         IFolder srcFolder = javaProject.getProject().getFolder("src");  
  65.         try {  
  66.             srcFolder.create(truetruenull);  
  67.         } catch (CoreException e) {  
  68.             e.printStackTrace();  
  69.         }  
  70.   
  71.         // 验证并加入插件工程的Nature  
  72.         try {  
  73.             project = createProject(project);  
  74.         } catch (CoreException e1) {  
  75.             e1.printStackTrace();  
  76.         }  
  77.   
  78.         // 为一个java工程设置默认的class path  
  79.         try {  
  80.             if (project.hasNature(JavaCore.NATURE_ID)) {  
  81.                 setClasspath(project);  
  82.             }  
  83.         } catch (JavaModelException e) {  
  84.             e.printStackTrace();  
  85.         } catch (CoreException e) {  
  86.             e.printStackTrace();  
  87.         }  
  88.   
  89.         // 生成Activator类  
  90.         try {  
  91.             generateTopLevelPluginClass(project, projectName + ".Activator",  
  92.                     projectName);  
  93.         } catch (CoreException e) {  
  94.             e.printStackTrace();  
  95.         }  
  96.   
  97.         // 生成mf文件  
  98.         try {  
  99.             createManifest(project, projectName);  
  100.         } catch (CoreException e) {  
  101.             e.printStackTrace();  
  102.         }  
  103.   
  104.         // 生成bulid.properties文件  
  105.         try {  
  106.             createBuildPropertiesFile(project);  
  107.         } catch (CoreException e) {  
  108.             e.printStackTrace();  
  109.         }  
  110.   
  111.         // 调整mf文件  
  112.         try {  
  113.             adjustManifests(project, fModel.getPluginBase());  
  114.         } catch (CoreException e) {  
  115.             e.printStackTrace();  
  116.         }  
  117.   
  118.         // 最终保存到文件系统中  
  119.         fModel.save();  
  120.     }  
  121.   
  122.     /** 
  123.      * 创建工程 
  124.      *  
  125.      * @param project 
  126.      * @return 
  127.      * @throws CoreException 
  128.      */  
  129.     private static IProject createProject(IProject project)  
  130.             throws CoreException {  
  131.         if (!project.exists()) {  
  132.             CoreUtility.createProject(project, nullnull);  
  133.             project.open(null);  
  134.         }  
  135.         if (!project.hasNature(PDE.PLUGIN_NATURE)) {  
  136.             CoreUtility.addNatureToProject(project, PDE.PLUGIN_NATURE, null);  
  137.         }  
  138.         if (!project.hasNature(JavaCore.NATURE_ID)) {  
  139.             CoreUtility.addNatureToProject(project, JavaCore.NATURE_ID, null);  
  140.         }  
  141.   
  142.         CoreUtility.addNatureToProject(project,  
  143.                 "org.eclipse.pde.UpdateSiteNature"null);  
  144.         CoreUtility.addNatureToProject(project,  
  145.                 "org.eclipse.pde.FeatureNature"null);  
  146.         CoreUtility.addNatureToProject(project,  
  147.                 "org.eclipse.pde.api.tools.apiAnalysisNature"null);  
  148.         IFolder folder = project.getFolder("src");  
  149.         if (!folder.exists()) {  
  150.             CoreUtility.createFolder(folder);  
  151.         }  
  152.         return project;  
  153.     }  
  154.   
  155.     /** 
  156.      * 设置class path 
  157.      *  
  158.      * @param project 
  159.      * @throws JavaModelException 
  160.      * @throws CoreException 
  161.      */  
  162.     private static void setClasspath(IProject project)  
  163.             throws JavaModelException, CoreException {  
  164.         IJavaProject javaProject = JavaCore.create(project);  
  165.         // Set output folder  
  166.         IPath path = project.getFullPath().append("bin");  
  167.         javaProject.setOutputLocation(path, null);  
  168.         IClasspathEntry[] entries = getClassPathEntries(javaProject);  
  169.         javaProject.setRawClasspath(entries, null);  
  170.     }  
  171.   
  172.     private static IClasspathEntry[] getClassPathEntries(IJavaProject project) {  
  173.         IClasspathEntry[] internalClassPathEntries = getInternalClassPathEntries(project);  
  174.         IClasspathEntry[] entries = new IClasspathEntry[internalClassPathEntries.length + 2];  
  175.         System.arraycopy(internalClassPathEntries, 0, entries, 2,  
  176.                 internalClassPathEntries.length);  
  177.   
  178.         // Set EE of new project  
  179.         String executionEnvironment = "JavaSE-1.6";  
  180.         ClasspathComputer.setComplianceOptions(project, executionEnvironment);  
  181.         entries[0] = ClasspathComputer.createJREEntry(executionEnvironment);  
  182.         entries[1] = ClasspathComputer.createContainerEntry();  
  183.   
  184.         return entries;  
  185.     }  
  186.   
  187.     private static IClasspathEntry[] getInternalClassPathEntries(  
  188.             IJavaProject project) {  
  189.   
  190.         IClasspathEntry[] entries = new IClasspathEntry[1];  
  191.         IPath path = project.getProject().getFullPath().append("src");  
  192.         entries[0] = JavaCore.newSourceEntry(path);  
  193.         return entries;  
  194.     }  
  195.   
  196.     /** 
  197.      * 生成Activator类 
  198.      *  
  199.      * @param project 
  200.      * @param className 
  201.      * @param id 
  202.      * @throws CoreException 
  203.      */  
  204.     private static void generateTopLevelPluginClass(IProject project,  
  205.             String className, String id) throws CoreException {  
  206.         fGenerator = new PluginClassCodeGenerator(project, className, id);  
  207.         fGenerator.generate();  
  208.     }  
  209.   
  210.     /** 
  211.      * 生成MF文件 
  212.      *  
  213.      * @param project 
  214.      * @param name 
  215.      * @throws CoreException 
  216.      */  
  217.     private static void createManifest(IProject project, String name)  
  218.             throws CoreException {  
  219.         IFile pluginXml = PDEProject.getPluginXml(project);  
  220.         IFile manifest = PDEProject.getManifest(project);  
  221.         fModel = new WorkspaceBundlePluginModel(manifest, pluginXml);  
  222.   
  223.         IPluginBase pluginBase = fModel.getPluginBase();  
  224.         String targetVersion = "3.7";  
  225.         pluginBase.setSchemaVersion(TargetPlatformHelper  
  226.                 .getSchemaVersionForTargetVersion(targetVersion));  
  227.         pluginBase.setId(name);  
  228.         pluginBase.setVersion("1.0.0.qualifier");  
  229.         String temp = getName(name);  
  230.   
  231.         pluginBase.setName(temp);  
  232.         pluginBase.setProviderName("");  
  233.   
  234.         if (fModel instanceof IBundlePluginModelBase) {  
  235.             IBundlePluginModelBase bmodel = ((IBundlePluginModelBase) fModel);  
  236.             ((IBundlePluginBase) bmodel.getPluginBase())  
  237.                     .setTargetVersion(targetVersion);  
  238.             bmodel.getBundleModel().getBundle()  
  239.                     .setHeader(Constants.BUNDLE_MANIFESTVERSION, "2"); //$NON-NLS-1$  
  240.         }  
  241.         ((IPlugin) pluginBase).setClassName(name.toLowerCase() + ".Activator");  
  242.   
  243.         IPluginReference[] dependencies = getDependencies();  
  244.         for (int i = 0; i < dependencies.length; i++) {  
  245.             IPluginReference ref = dependencies[i];  
  246.             IPluginImport iimport = fModel.getPluginFactory().createImport();  
  247.             iimport.setId(ref.getId());  
  248.             iimport.setVersion(ref.getVersion());  
  249.             iimport.setMatch(ref.getMatch());  
  250.             pluginBase.add(iimport);  
  251.         }  
  252.         // add Bundle Specific fields if applicable  
  253.         if (pluginBase instanceof BundlePluginBase) {  
  254.             IBundle bundle = ((BundlePluginBase) pluginBase).getBundle();  
  255.   
  256.             // Set required EE  
  257.             String exeEnvironment = "JavaSE-1.6";  
  258.             if (exeEnvironment != null) {  
  259.                 bundle.setHeader(Constants.BUNDLE_REQUIREDEXECUTIONENVIRONMENT,  
  260.                         exeEnvironment);  
  261.             }  
  262.             // -----------------------  
  263.   
  264.             bundle.setHeader(Constants.BUNDLE_ACTIVATIONPOLICY,  
  265.                     Constants.ACTIVATION_LAZY);  
  266.             // ------------------------  
  267.         }  
  268.     }  
  269.   
  270.     @SuppressWarnings({ "rawtypes""unchecked" })  
  271.     private static IPluginReference[] getDependencies() {  
  272.         ArrayList result = new ArrayList();  
  273.         if (fGenerator != null) {  
  274.             IPluginReference[] refs = fGenerator.getDependencies();  
  275.             for (int i = 0; i < refs.length; i++) {  
  276.                 result.add(refs[i]);  
  277.             }  
  278.         }  
  279.   
  280.         return (IPluginReference[]) result.toArray(new IPluginReference[result  
  281.                 .size()]);  
  282.     }  
  283.   
  284.     /** 
  285.      * 生成Build.properties文件 
  286.      *  
  287.      * @param project 
  288.      * @throws CoreException 
  289.      */  
  290.     private static void createBuildPropertiesFile(IProject project)  
  291.             throws CoreException {  
  292.         IFile file = PDEProject.getBuildProperties(project);  
  293.         if (!file.exists()) {  
  294.             WorkspaceBuildModel model = new WorkspaceBuildModel(file);  
  295.             IBuildModelFactory factory = model.getFactory();  
  296.   
  297.             // BIN.INCLUDES  
  298.             IBuildEntry binEntry = factory  
  299.                     .createEntry(IBuildEntry.BIN_INCLUDES);  
  300.             fillBinIncludes(project, binEntry);  
  301.             createSourceOutputBuildEntries(model, factory);  
  302.             model.getBuild().add(binEntry);  
  303.             model.save();  
  304.         }  
  305.     }  
  306.   
  307.     private static void fillBinIncludes(IProject project, IBuildEntry binEntry)  
  308.             throws CoreException {  
  309.         binEntry.addToken("META-INF/"); //$NON-NLS-1$  
  310.   
  311.         String libraryName = null;  
  312.         binEntry.addToken(libraryName == null ? "." : libraryName); //$NON-NLS-1$  
  313.     }  
  314.   
  315.     private static void createSourceOutputBuildEntries(  
  316.             WorkspaceBuildModel model, IBuildModelFactory factory)  
  317.             throws CoreException {  
  318.         String srcFolder = "src";  
  319.   
  320.         String libraryName = null;  
  321.         if (libraryName == null)  
  322.             libraryName = "."//$NON-NLS-1$  
  323.         // SOURCE.<LIBRARY_NAME>  
  324.         IBuildEntry entry = factory.createEntry(IBuildEntry.JAR_PREFIX  
  325.                 + libraryName);  
  326.         if (srcFolder.length() > 0)  
  327.             entry.addToken(new Path(srcFolder).addTrailingSeparator()  
  328.                     .toString());  
  329.         else  
  330.             entry.addToken("."); //$NON-NLS-1$  
  331.         model.getBuild().add(entry);  
  332.   
  333.         // OUTPUT.<LIBRARY_NAME>  
  334.         entry = factory.createEntry(IBuildEntry.OUTPUT_PREFIX + libraryName);  
  335.         String outputFolder = "bin";  
  336.         if (outputFolder.length() > 0)  
  337.             entry.addToken(new Path(outputFolder).addTrailingSeparator()  
  338.                     .toString());  
  339.         else  
  340.             entry.addToken("."); //$NON-NLS-1$  
  341.         model.getBuild().add(entry);  
  342.     }  
  343.   
  344.     /** 
  345.      * 调整MF文件 
  346.      *  
  347.      * @param project 
  348.      * @param bundle 
  349.      * @throws CoreException 
  350.      */  
  351.     @SuppressWarnings({ "rawtypes""unchecked" })  
  352.     private static void adjustManifests(IProject project, IPluginBase bundle)  
  353.             throws CoreException {  
  354.         // if libraries are exported, compute export package (173393)  
  355.         IPluginLibrary[] libs = fModel.getPluginBase().getLibraries();  
  356.         Set packages = new TreeSet();  
  357.         for (int i = 0; i < libs.length; i++) {  
  358.             String[] filters = libs[i].getContentFilters();  
  359.             // if a library is fully exported, then export all source packages  
  360.             // (since we don't know which source folders go with which library)  
  361.             if (filters.length == 1 && filters[0].equals("**")) { //$NON-NLS-1$  
  362.                 addAllSourcePackages(project, packages);  
  363.                 break;  
  364.             }  
  365.             for (int j = 0; j < filters.length; j++) {  
  366.                 if (filters[j].endsWith(".*")) //$NON-NLS-1$  
  367.                     packages.add(filters[j].substring(0,  
  368.                             filters[j].length() - 2));  
  369.             }  
  370.         }  
  371.     }  
  372.   
  373.     @SuppressWarnings("rawtypes")  
  374.     private static void addAllSourcePackages(IProject project, Set list) {  
  375.         try {  
  376.             IJavaProject javaProject = JavaCore.create(project);  
  377.             IClasspathEntry[] classpath = javaProject.getRawClasspath();  
  378.             for (int i = 0; i < classpath.length; i++) {  
  379.                 IClasspathEntry entry = classpath[i];  
  380.                 if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {  
  381.                     IPath path = entry.getPath().removeFirstSegments(1);  
  382.                     if (path.segmentCount() > 0) {  
  383.                         IPackageFragmentRoot root = javaProject  
  384.                                 .getPackageFragmentRoot(project.getFolder(path));  
  385.                         IJavaElement[] children = root.getChildren();  
  386.                         for (int j = 0; j < children.length; j++) {  
  387.                             IPackageFragment frag = (IPackageFragment) children[j];  
  388.                             if (frag.getChildren().length > 0  
  389.                                     || frag.getNonJavaResources().length > 0)  
  390.                                 list.add(children[j].getElementName());  
  391.                         }  
  392.                     }  
  393.                 }  
  394.             }  
  395.         } catch (JavaModelException e) {  
  396.         }  
  397.     }  
  398.   
  399.     /** 
  400.      * 获取Bundle-Name 
  401.      *  
  402.      * @param projectName 
  403.      * @return 
  404.      */  
  405.     private static String getName(String projectName) {  
  406.         String temp = new String(projectName);  
  407.   
  408.         int index = temp.lastIndexOf(".");  
  409.   
  410.         if (index != -1) {  
  411.             temp = temp.substring(index + 1);  
  412.         }  
  413.   
  414.         String fristChar = temp.substring(01).toUpperCase();  
  415.         temp = temp.substring(1);  
  416.         temp = fristChar + temp;  
  417.         return temp;  
  418.     }  
  419. }  
  评论这张
 
阅读(49)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017