プラグインから直接ライブラリを追加する方法をついに見つけました。ユージーンの答えは間違っていませんでしたが、いくつかの説明がありませんでした。これを行う方法を紹介します。
複数のファイルを含むライブラリを追加する場合は、次のように行うことができます。
- JsGlobalScopeContainerInitializerを拡張するクラスを作成します
- 拡張ポイントorg.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializerに拡張を提供します
- IDを使用してJsGlobalScopeContainerを指すIIncludePathEntryを、ライブラリを使用するプロジェクトに追加します。
1.JsGlobalScopeContainerInitializerを拡張するクラスを作成します
非常に紛らわしいチュートリアルがいくつかあり(eclipse wikiのチュートリアルを含む)、最初はこれを理解するのが難しくなりました。私は次のようなものを思いついた:
[... package and imports ommited ...]
public class LibInitializer extends JsGlobalScopeContainerInitializer {
private static final String LIBRARY_ID = "com.testvendor.testplugin.library";
public IPath getPath() {
return new Path(LIBRARY_ID);
}
@Override
public LibraryLocation getLibraryLocation() {
return null;
}
@Override
public String getDescription() {
return "Test Library";
}
@Override
public String getDescription(IPath containerPath, IJavaScriptProject project) {
return getDescription();
}
@Override
public IIncludePathEntry[] getIncludepathEntries() {
try {
//get the Bundle object of the plugin
Bundle bundle = Platform.getBundle("com.testvendor.testplugin");
//get the java.io.File object corresponding to the root of the bundles installation directory
File bundleFile = FileLocator.getBundleFile(bundle);
//add the location pointing to the library relative to that bundle root
File libraryLocation = new File(bundleFile, "bin/com/testvendor/testplugin/library/");
//create a Path object from it
IPath pa = new Path(libraryLocation.getAbsolutePath());
/* create an IIncludePathEntry of the type "library" from this path
my library only contains one folder (for now) so this is it */
IIncludePathEntry entry = JavaScriptCore.newLibraryEntry(pa, pa, pa);
//put the entry (or entries if you had more) into an array and return
IIncludePathEntry[] entries = {entry};
return entries;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
最も興味深い部分は、実際のエントリがコンテナから取得されるgetIncludepathEntries()メソッドです。IIncludePathEntryは「file://」疑似プロトコルのURLでは機能しないため、Eugeneによって提案されたメソッド「toFileURL」はここでは機能しません。
2.JSGlobalScope ...拡張ポイントに拡張機能を提供します
IDがcom.testvendor.testplugin.libraryのコンテナーエントリを含むプロジェクトに通知する最も簡単な方法は、次のように拡張ポイント*org.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializer**に貢献することです。
<extension point="org.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializer">
<JsGlobalScopeContainerInitializer
id="com.testvendor.testplugin.library"
class="com.testvendor.testplugin.library.LibInitializer"/>
</extension>
もちろん、クラスはステップ1のJsGlobalScopeContainerInitializerを参照します。
3.IIncludePathEntryをプロジェクトに追加します
IJavaScriptProject jsProj = ... get your project object from somewhere ...
//create an instance of the container from step 1.
JsGlobalScopeContainerInitializer container = new LibInitializer();
//create an includepath entry refering to the container
IIncludePathEntry entry = JavaScriptCore.newContainerEntry(container.getPath());
IIncludePathEntry[] ipaths = jsProj.getRawIncludepath();
IIncludePathEntry[] newpaths = new IIncludePathEntry[ipaths.length +1];
System.arraycopy(ipaths, 0, newpaths, 0, ipaths.length);
//add the new entry
newPaths[ipaths.length] = enty;
// set the new includepath to the project
jsProj.setRawIncludepath(newpaths, null);
運が良ければ、ContainerIntitializerで追加したライブラリフォルダーに含まれているすべてのJavaScriptオブジェクトとクラスを含むライブラリエントリがJavaScriptリソースにあります。そして、このすべてのオブジェクトとクラスは、コード補完の提案で利用できるようになります。
これにより、他の誰かが、実際よりも単純なトピックに何時間もフラストレーションを費やすことを防ぐことができます。