首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有两个IntelliJ插件的PicoContainer

使用带有两个IntelliJ插件的PicoContainer
EN

Stack Overflow用户
提问于 2018-09-28 20:53:49
回答 1查看 156关注 0票数 0

我有两个用于IntelliJ的插件。PluginTwo依赖于PluginOne,所以两个是在一个之后启动的。这两个插件都依赖于第三个核心模块。

结构:

我想通过PluginTwo中的Context-Class访问虚拟类。Context类是核心模块的一部分,并使用PicoContainer来提供对虚拟类的访问。PluginOne在启动时使用PicoContainer创建上下文。现在我想通过PicoContainer从PluginTwo访问虚拟类。

我得到了这个错误:

代码语言:javascript
复制
    2018-09-28 14:25:19,208 [  12588]  ERROR - roject.impl.ProjectManagerImpl - PluginTwoProjectComponent@94a5de2 
java.lang.LinkageError: loader constraint violation: loader (instance of com/intellij/ide/plugins/cl/PluginClassLoader) previously initiated loading for a different type with name "Context"
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:642)
    at com.intellij.util.lang.UrlClassLoader._defineClass(UrlClassLoader.java:276)
    at com.intellij.util.lang.UrlClassLoader.defineClass(UrlClassLoader.java:272)
    at com.intellij.util.lang.UrlClassLoader._findClass(UrlClassLoader.java:241)
    at com.intellij.ide.plugins.cl.PluginClassLoader.a(PluginClassLoader.java:142)
    at com.intellij.ide.plugins.cl.PluginClassLoader.a(PluginClassLoader.java:74)
    at com.intellij.ide.plugins.cl.PluginClassLoader.loadClass(PluginClassLoader.java:61)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at PluginTwoProjectComponent.projectOpened(PluginTwoProjectComponent.java:16)

..。

PicoContainer在Context-Class中创建:

代码语言:javascript
复制
private static Context instance;

private final MutablePicoContainer picoContainer;

public static synchronized Context getInstance() {
    if (instance == null) {
        instance = new Context();
    }
    return instance;
}

public Context() {
    picoContainer = new DefaultPicoContainer();
    picoContainer.addComponent(DummyClass.class);
}

public <T> T getComponent(Class<T> clazz) {
    return picoContainer.getComponent(clazz);
}

PluginOneProjectComponent获取上下文的一个实例

代码语言:javascript
复制
public class PluginOneProjectComponent implements ProjectComponent {

    private static Context context;

    private Project project;

    public PluginOneProjectComponent(Project project) {
        this.project = project;
    }

    @Override
    public void projectOpened() {
        System.out.println("PluginOneProjectComponent started with project " + project.getName());
        context = Context.getInstance();

        DummyClass dummy = context.getComponent(DummyClass.class);
        System.out.println("DummyText from PluginOne " + dummy.getText());
        System.out.println("DummyNumber from PluginOne " + dummy.getNumber());
    }

    public static Context getContext() {
        return context;
    }
}

在PluginTwo中,我想使用来自PluginOne的上下文来访问DummyClass。但这并不管用。

代码语言:javascript
复制
public class PluginTwoProjectComponent implements ProjectComponent {

    Project project;

    public PluginTwoProjectComponent(Project project) {
        this.project = project;
    }

    @Override
    public void projectOpened() {
        System.out.println("PluginTwoProjectComponent started with project " + project.getName());
        Context context = PluginOneProjectComponent.getContext();
        DummyClass dummy = context.getComponent(DummyClass.class);
        System.out.println("DummyText from Plugin Two" + dummy.getText());
        System.out.println("DummyNumber from Plugin Two" + dummy.getNumber());
    }
}

因此,输出仅为。

代码语言:javascript
复制
PluginOneProjectComponent started with project HelloWorld
DummyText from PluginOne Some Text
DummyNumber from PluginOne 42
PluginTwoProjectComponent started with project HelloWorld

当我在调试器中的上下文上调用getComponent(DummyClass.class)时,我只得到null作为结果。

有人能帮我吗?有没有更好的方法从PluginOne访问我的Context-Class?

我在这个小项目中重现了这个错误,以便与您分享。我只需要来自PluginOne的PicoContainer就可以在PluginTwo中使用它。完整的源代码可以在这里找到:https://github.com/jafey/intellij-plugin-picocontainer-poc

EN

回答 1

Stack Overflow用户

发布于 2018-10-01 17:21:20

据我所知,你应该依靠服务的概念来在插件之间通信,因为它们被加载在单独的类加载器中,第一个插件中的X类型与第二个插件中的X类型并不完全相同。

此外,微微上下文的概念意味着对插件是私有的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52555806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档