1

我正在尝试在现有代码库中使用 PF4J。我试图将所有必要的东西从演示插件和应用程序转移到我现有的 maven 项目中。我已经比较了演示和我的代码,我找不到任何不同的地方。然而,当我构建插件的 .jar 文件时,生成的 extensions.idx 中有一条注释说它是由 PF4J 生成的,但其他地方是空的。那里应该有对我插件的内部类的引用,但没有。在演示插件中,有。

我猜这是我的 Maven 设置(我的 pom 文件之一)的问题,但我看了又看,无法弄清楚。这是我的插件的 Java 文件:

package com.inlet.ifserver.plugin.reaper;

import com.inlet.plugin.InletFetchReaper;
import org.apache.commons.lang.StringUtils;
import org.pf4j.Extension;
import org.pf4j.Plugin;
import org.pf4j.PluginWrapper;
import org.pf4j.RuntimeMode;

/**
 * @author Decebal Suiu
 */
public class ReaperAPlugin extends Plugin {

    public ReaperAPlugin(PluginWrapper wrapper) {
        super(wrapper);
    }

    @Override
    public void start() {
        System.out.println("WelcomePlugin.start()");
        // for testing the development mode
        if (RuntimeMode.DEVELOPMENT.equals(wrapper.getRuntimeMode())) {
            System.out.println(StringUtils.upperCase("WelcomePlugin"));
        }
    }

    @Override
    public void stop() {
        System.out.println("WelcomePlugin.stop()");
    }

    @Extension
    public static class ReaperA implements InletFetchReaper {

        @Override
        public void reap() {
            System.out.println("ReaperA");
        }
    }

}

我的猜测是我的代码没有被扫描以找到 @Extension 注释。我不知道那是怎么回事。

我希望其他人已经遇到了这个问题,并且知道我错过了一些简单的事情。谁能告诉我为什么会这样?如果有人可以让我深入了解 Maven 是如何在它生成的 .jar 文件中创建 extensions.idx 文件的,那可能会让我得到答案。

TIA 寻求帮助!

4

3 回答 3

3

我想通了。我为我的插件定义了这样的接口:

package com.inlet.plugin;

public interface InletFetchReaper {
    void reap();
}

但它应该是(现在是)这个:

package com.inlet.plugin;

import org.pf4j.ExtensionPoint;

public interface InletFetchReaper extends ExtensionPoint {
    void reap();
}

认为这将是一些简单的事情。

于 2019-02-18T16:42:46.943 回答
0

我代表 Decebal 发布此答案:

请创建一个问题作为功能请求。我认为这将有助于检查 PF4J。

例如,您将扩展声明为:

@Extension
public static class ReaperA implements InletFetchReaper {
}

我认为如果注释处理器通过反射验证InletFetchReaper(由您的扩展实现的单个接口)扩展,这将很有用ExtensionPoint

于 2019-09-26T05:13:39.153 回答
0

在我的情况下,我忘记将插件 API 上的 Maven 依赖项标记为<scope>provided</scope>.

于 2021-10-12T10:45:21.297 回答