2

jsdt javaScriptNature を必要とするプロジェクトの性質に貢献する Eclipse プラグインがあります。プラグインに含まれる JavaScript ライブラリをプロジェクトのインクルードパスにプログラムで追加したいと考えています。これを行う方法はありますか?

JsGlobalScopeContainer と JsGlobalScopeContainerInitializer について読んで試してみましたが、非常に混乱しているようです。プラグインからいくつかの .js ファイルを含むライブラリを追加したいだけです。私はこの概念を理解することができません。

これは私がこれまでに思いついたものです:

IJavaScriptProject jsProj = JavaScriptCore.create(p);
Path pa = new Path("/src/de/otris/eclipse/portalscripting/psLibrary/library.js");
IIncludePathEntry entry = JavaScriptCore.newProjectEntry(pa);               
IIncludePathEntry[] ipaths = jsProj.getRawIncludepath();
IIncludePathEntry[] newpaths = new IIncludePathEntry[ipaths.length +1];
System.arraycopy(ipaths, 0, newpaths, 0, ipaths.length);
newpaths[ipaths.length] = entry;
jsProj.setRawIncludepath(newpaths, null);
4

2 に答える 2

1

プラグインから直接ライブラリを追加する方法をついに見つけました。ユージーンの答えは間違っていませんでしたが、いくつかの説明がありませんでした。これを行う方法を紹介します。

複数のファイルを含むライブラリを追加する場合は、次のように行うことができます。

  1. JsGlobalScopeContainerInitializerを拡張するクラスを作成します
  2. 拡張ポイントorg.eclipse.wst.jsdt.core.JsGlobalScopeContainerInitializerに拡張を提供します
  3. 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リソースにあります。そして、このすべてのオブジェクトとクラスは、コード補完の提案で利用できるようになります。

ついに図書館!

これにより、他の誰かが、実際よりも単純なトピックに何時間もフラストレーションを費やすことを防ぐことができます。

于 2012-11-30T15:28:18.513 に答える
-1

プロジェクトのインクルードパスを設定するには、IJavaScriptProject::setRawIncludepathメソッドのいずれかを使用する必要があります。IIncludePathEntriesは、エントリの種類に対応するJavaScriptCore :: new*Entryメソッドを呼び出すことによって作成されます。

于 2012-10-29T17:57:43.270 に答える