Programmatically add directory based dependency/library to module

Answered

The framework I'm writing a plugin for has a specific directory defined for "user" libraries, which can contain binary, source and javadoc JARs. I want my plugin to automatically add this directory as a directory based dependency/library to a module (or as a project library and then that library as a module dependency).

I've tried to find some example of this in the IDEA source code, but everything I'm finding it is heavily intertwined with GUI code and I can't find the point where you just say "create a dependency/library from this directory and add it to the module".

Can you provide some information on how to do such? Ultimately it will run from either AnAction, upon project open, or upon adding my Facet. So I have a handle on the module in all cases.

 

1 comment
Comment actions Permalink

I was able to determine how to do this. For the reference of others, here is the code I came up with.

Creating and Attaching a Directory Based Library

private void attachDirBasedLibrary(@NotNull final Module module, 
@NotNull final String libName,
@NotNull final String dir)
{
ApplicationManager.getApplication().runWriteAction(() ->
{
final ModuleRootManager rootManager = ModuleRootManager.getInstance(module);
final String urlString = VirtualFileManager.constructUrl(LocalFileSystem.PROTOCOL, dir);
final VirtualFile dirVirtualFile = VirtualFileManager.getInstance().findFileByUrl(urlString);
if (dirVirtualFile != null)
{
final ModifiableRootModel modifiableModel = rootManager.getModifiableModel();
final Library newLib = createDirLib(libName, dirVirtualFile, modifiableModel.getModuleLibraryTable());
modifiableModel.commit();
}
});
}


private Library createDirLib(@NotNull final String libName,
@NotNull final VirtualFile dirVirtualFile,
@NotNull final LibraryTable table)
{
Library library = table.getLibraryByName(libName);
if (library == null)
{
library = table.createLibrary(libName);

Library.ModifiableModel libraryModel = library.getModifiableModel();
libraryModel.addJarDirectory(dirVirtualFile, true, OrderRootType.CLASSES);
libraryModel.addJarDirectory(dirVirtualFile, true, OrderRootType.SOURCES);
libraryModel.addJarDirectory(dirVirtualFile, true, JavadocOrderRootType.getInstance());
libraryModel.commit();

}
return library;
}
 

Creating and Attaching a JAR based Library

private void attachJarLibrary(@NotNull final Module module, 
@NotNull final String libName,
@NotNull final String jarFilePath,
@NotNull final String srcFilePath,
@NotNull final String docFilePath)
{
ApplicationManager.getApplication().runWriteAction(() ->
{
final ModuleRootManager rootManager = ModuleRootManager.getInstance(module);

final String clzUrlString = VirtualFileManager.constructUrl(JarFileSystem.PROTOCOL, jarFilePath) + JarFileSystem.JAR_SEPARATOR;
final String srcUrlString = VirtualFileManager.constructUrl(JarFileSystem.PROTOCOL, srcFilePath) + JarFileSystem.JAR_SEPARATOR;
final String docUrlString = VirtualFileManager.constructUrl(JarFileSystem.PROTOCOL, docFilePath) + JarFileSystem.JAR_SEPARATOR;

final VirtualFile jarVirtualFile = VirtualFileManager.getInstance().findFileByUrl(clzUrlString);
final VirtualFile srcVirtualFile = VirtualFileManager.getInstance().findFileByUrl(srcUrlString);
final VirtualFile docVirtualFile = VirtualFileManager.getInstance().findFileByUrl(docUrlString);

final ModifiableRootModel modifiableModel = rootManager.getModifiableModel();
final Library newLib = createJarLib(libName, modifiableModel.getModuleLibraryTable(), jarVirtualFile, srcVirtualFile, docVirtualFile);
modifiableModel.commit();
});
}


private Library createJarLib(@NotNull final String libName,
@NotNull final LibraryTable table,
@Nullable final VirtualFile jarVirtualFile,
@Nullable final VirtualFile srcVirtualFile,
@Nullable final VirtualFile docVirtualFile)
{
Library library = table.getLibraryByName(libName);
if (library == null)
{
library = table.createLibrary(libName);
Library.ModifiableModel libraryModel = library.getModifiableModel();

if (jarVirtualFile != null)
{
libraryModel.addRoot(jarVirtualFile, OrderRootType.CLASSES);
}

if (srcVirtualFile != null)
{
libraryModel.addRoot(srcVirtualFile, OrderRootType.SOURCES);
}

if (docVirtualFile != null)
{
libraryModel.addRoot(docVirtualFile, JavadocOrderRootType.getInstance());
}

libraryModel.commit();
}
return library;
}
 

0

Please sign in to leave a comment.