如何在IntelliJ插件中“注册”一个新的模块类型?

我是IntelliJ插件开发的初学者,但是我想让我的插件在“新建项目”/“新建模块”窗口中注册一个新的模块类型。

我已经通过插件开发人员的文档搜索,但无法找到有用的东西。 我还查看了像Kotlin和Scala这样的现有插件,它们也添加了新的模块类型,但我无法弄清楚如何在上面提到的对话框中显示完成的模块类型。

我需要在plugin.xml文件中更改什么? 我已经添加了扩展并为ModuleType,ModuleBuilder和ModuleConfigurationExtensionProvider创建了java类,但是这不会改变任何东西。

我希望你能提前帮助我,谢谢。

这可以通过IntelliJ IDEA的New Project Wizard功能来实现,通过提供ModuleBuilder的Module / Project类型实现类,即通过扩展IntelliJ IDEA提供的扩展点(com.intellij)。

您需要在plugin.xml中进行以下更改,才能在New Project Wizard项目/模块类型列表中显示您的新模块/项目类型。

<extensions defaultExtensionNs="com.intellij"> <moduleBuilder builderClass="com.yourcompany.wizards.YourModuleBuilder"/> </extensions> 

提供你的ModuleBuilder类与包到buildlerClass属性,这就够了。

以下是示例ModuleBuilder实现:

 public class AsposeJavaModuleBuilder extends ModuleBuilder implements SourcePathsBuilder { private Project myProject; ResourceBundle bundle = ResourceBundle.getBundle("Bundle"); @Override public String getBuilderId() { return getClass().getName(); } @Override public String getPresentableName() { return "Aspose Application"; } @Override public String getDescription() { return bundle.getString("AsposeWizardPanel.myMainPanel.description"); } @Override public Icon getBigIcon() { return AsposeIcons.AsposeMedium; } @Override public Icon getNodeIcon() { return AsposeIcons.AsposeLogo; } @Override public ModuleWizardStep[] createWizardSteps(@NotNull WizardContext wizardContext, @NotNull ModulesProvider modulesProvider) { return new ModuleWizardStep[]{ new AsposeAPIsWizardStep(this, wizardContext), }; } @Override public void setupRootModel(ModifiableRootModel rootModel) throws com.intellij.openapi.options.ConfigurationException { setMyProject(rootModel.getProject()); final CompilerModuleExtension compilerModuleExtension = rootModel.getModuleExtension(CompilerModuleExtension.class); compilerModuleExtension.setExcludeOutput(true); if (myJdk != null) { rootModel.setSdk(myJdk); } else { rootModel.inheritSdk(); } ContentEntry contentEntry = doAddContentEntry(rootModel); if (contentEntry != null) { final List<Pair<String, String>> sourcePaths = getSourcePaths(); if (sourcePaths != null) { for (final Pair<String, String> sourcePath : sourcePaths) { String first = sourcePath.first; new File(first).mkdirs(); final VirtualFile sourceRoot = LocalFileSystem.getInstance() .refreshAndFindFileByPath(FileUtil.toSystemIndependentName(first)); if (sourceRoot != null) { contentEntry.addSourceFolder(sourceRoot, false, sourcePath.second); } } } } if (myCompilerOutputPath != null) { // should set only absolute paths String canonicalPath; try { canonicalPath = FileUtil.resolveShortWindowsName(myCompilerOutputPath); } catch (IOException e) { canonicalPath = myCompilerOutputPath; } compilerModuleExtension .setCompilerOutputPath(VfsUtil.pathToUrl(FileUtil.toSystemIndependentName(canonicalPath))); } else { compilerModuleExtension.inheritCompilerOutputPath(true); } LibraryTable libraryTable = rootModel.getModuleLibraryTable(); for (Pair<String, String> libInfo : myModuleLibraries) { final String moduleLibraryPath = libInfo.first; final String sourceLibraryPath = libInfo.second; Library library = libraryTable.createLibrary(); Library.ModifiableModel modifiableModel = library.getModifiableModel(); modifiableModel.addRoot(getUrlByPath(moduleLibraryPath), OrderRootType.CLASSES); if (sourceLibraryPath != null) { modifiableModel.addRoot(getUrlByPath(sourceLibraryPath), OrderRootType.SOURCES); } modifiableModel.commit(); } RunnableHelper.runWhenInitialized(getMyProject(), new Runnable() { public void run() { System.out.println("Hello I came here"); final LibraryTablesRegistrar libTablesRegistrar = LibraryTablesRegistrar.getInstance(); final LibraryTable libraryTable = libTablesRegistrar.getLibraryTable(getMyProject()); final LibraryTable.ModifiableModel libTableModel = libraryTable.getModifiableModel(); Library library = libTableModel.createLibrary(AsposeConstants.LIBRARY_NAME); libTableModel.commit(); @NonNls final String path = getContentEntryPath() + File.separator + AsposeConstants.LIB_FOLDER; new File(path).mkdirs(); for (AsposeJavaAPI api : AsposeProject.getApiList().values()) { System.out.println("Hello I came here2"); if (api.is_selected()) { try { System.out.println("Hello I came here3"); AsposeAPIsManager.copyDirectory(AsposeAPIsManager.getLibaryDownloadPath() + api.get_name().toLowerCase(), path + File.separator + api.get_name()); } catch (IOException ex) { ex.printStackTrace(); } String[] children = new File(path + File.separator + api.get_name().toLowerCase() + File.separator).list(); for (String _child : children) { String jarPath = "jar://" + path + File.separator + api.get_name() + File.separator + _child + "!/"; Library.ModifiableModel model = library.getModifiableModel(); model.addRoot(jarPath, OrderRootType.CLASSES); model.commit(); } } } Collection<Module> modules = ModuleUtil.getModulesOfType(getMyProject(), StdModuleTypes.JAVA); Iterator itr = modules.iterator(); Module module = null; while (itr.hasNext()) { module = (Module) itr.next(); break; } final ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module); final ModifiableRootModel moduleRootModel = moduleRootManager.getModifiableModel(); final Library lib = libraryTable.getLibraryByName(AsposeConstants.LIBRARY_NAME); if (moduleRootModel.findLibraryOrderEntry(lib) == null) { moduleRootModel.addLibraryEntry(lib); } moduleRootModel.commit(); } }); } @Override public String getGroupName() { return JavaModuleType.JAVA_GROUP; } public Project getMyProject() { return myProject; } public void setMyProject(Project myProject) { this.myProject = myProject; } @Nullable public ModuleWizardStep getCustomOptionsStep(WizardContext context, Disposable parentDisposable) { AsposeIntroWizardStep step = new AsposeIntroWizardStep(); Disposer.register(parentDisposable, step); return step; } private String myCompilerOutputPath; // Pair<Source Path, Package Prefix> private List<Pair<String, String>> mySourcePaths; // Pair<Library path, Source path> private final List<Pair<String, String>> myModuleLibraries = new ArrayList<Pair<String, String>>(); public final void setCompilerOutputPath(String compilerOutputPath) { myCompilerOutputPath = acceptParameter(compilerOutputPath); } public List<Pair<String, String>> getSourcePaths() { if (mySourcePaths == null) { final List<Pair<String, String>> paths = new ArrayList<Pair<String, String>>(); @NonNls final String path = getContentEntryPath() + File.separator + "src"; new File(path).mkdirs(); paths.add(Pair.create(path, "")); return paths; } return mySourcePaths; } public void setSourcePaths(List<Pair<String, String>> sourcePaths) { mySourcePaths = sourcePaths != null ? new ArrayList<Pair<String, String>>(sourcePaths) : null; } public void addSourcePath(Pair<String, String> sourcePathInfo) { if (mySourcePaths == null) { mySourcePaths = new ArrayList<Pair<String, String>>(); } mySourcePaths.add(sourcePathInfo); } public ModuleType getModuleType() { return StdModuleTypes.JAVA; } @Override public boolean isSuitableSdkType(SdkTypeId sdkType) { return sdkType instanceof JavaSdkType; } @Nullable @Override public ModuleWizardStep modifySettingsStep(@NotNull SettingsStep settingsStep) { return StdModuleTypes.JAVA.modifySettingsStep(settingsStep, this); } private static String getUrlByPath(final String path) { return VfsUtil.getUrlForLibraryRoot(new File(path)); } public void addModuleLibrary(String moduleLibraryPath, String sourcePath) { myModuleLibraries.add(Pair.create(moduleLibraryPath, sourcePath)); } @Nullable protected static String getPathForOutputPathStep() { return null; } } 

有关在IntelliJ IDEA中创建新模块/项目类型的完整源代码参考,请参阅Aspose项目向导的源代码(由Aspose pty Ltd提供的IntelliJ IDEA插件)

源代码可以从以下网址下载:

https://asposejetbrains.codeplex.com/