在构建一个非常简单的 PF4J 插件时,我的 extension.idx 文件是空的。为什么?
When building a very simple PF4J plugin, my extension.idx file is empty. Why?
我正在尝试在现有代码库中使用 PF4J。我试图将演示插件和应用程序中的所有必要内容转移到我现有的 Maven 项目中。我比较了演示和我的代码,但找不到任何不同之处。然而,当我构建我的插件的 .jar 文件时,生成的 extensions.idx 中有一条评论说它是由 PF4J 生成的 generate3d,但在其他方面是空的。那里应该有对我插件的内部 class 的引用,但没有。在演示插件中,有。
我猜这是我的 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 寻求帮助!
我想通了。我为我的插件定义了这样的接口:
package com.inlet.plugin;
public interface InletFetchReaper {
void reap();
}
但它应该是(现在是)这个:
package com.inlet.plugin;
import org.pf4j.ExtensionPoint;
public interface InletFetchReaper extends ExtensionPoint {
void reap();
}
认为这会很简单。
我代表 Decebal 发布此答案:
请创建一个 issue 作为功能请求。
我认为在 PF4J 中进行检查会很有用。
例如,您将扩展声明为:
@Extension
public static class ReaperA implements InletFetchReaper {
}
我认为如果注释处理器通过反射验证 InletFetchReaper
(由您的扩展实现的单一接口)扩展了 ExtensionPoint
.
,那将很有用
在我的例子中,我忘记将 Maven 对我的插件 API 的依赖标记为 <scope>provided</scope>
。
我正在尝试在现有代码库中使用 PF4J。我试图将演示插件和应用程序中的所有必要内容转移到我现有的 Maven 项目中。我比较了演示和我的代码,但找不到任何不同之处。然而,当我构建我的插件的 .jar 文件时,生成的 extensions.idx 中有一条评论说它是由 PF4J 生成的 generate3d,但在其他方面是空的。那里应该有对我插件的内部 class 的引用,但没有。在演示插件中,有。
我猜这是我的 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 寻求帮助!
我想通了。我为我的插件定义了这样的接口:
package com.inlet.plugin;
public interface InletFetchReaper {
void reap();
}
但它应该是(现在是)这个:
package com.inlet.plugin;
import org.pf4j.ExtensionPoint;
public interface InletFetchReaper extends ExtensionPoint {
void reap();
}
认为这会很简单。
我代表 Decebal 发布此答案:
请创建一个 issue 作为功能请求。 我认为在 PF4J 中进行检查会很有用。
例如,您将扩展声明为:
@Extension
public static class ReaperA implements InletFetchReaper {
}
我认为如果注释处理器通过反射验证 InletFetchReaper
(由您的扩展实现的单一接口)扩展了 ExtensionPoint
.
在我的例子中,我忘记将 Maven 对我的插件 API 的依赖标记为 <scope>provided</scope>
。