Java Can';当包含外部jar时,不能从IntelliJ中加载上下文

Java Can';当包含外部jar时,不能从IntelliJ中加载上下文,java,spring,spring-boot,intellij-idea,Java,Spring,Spring Boot,Intellij Idea,我正在做一个多模块Spring引导项目,可以使用非Spring插件。使用java.util.ServiceLoader加载插件。他们可以使用ContextBridge提供的Springbean实现org.springframework.context.ApplicationContextAware。最终结果如下所示: app-folder/ plugins/ myplugin.jar myapplication.jar launcher-script.sh 当开始使用she

我正在做一个多模块Spring引导项目,可以使用非Spring插件。使用
java.util.ServiceLoader
加载插件。他们可以使用ContextBridge提供的Springbean实现
org.springframework.context.ApplicationContextAware
。最终结果如下所示:

app-folder/
  plugins/
    myplugin.jar
  myapplication.jar
  launcher-script.sh
当开始使用shell脚本时,应用程序和插件按预期工作:

java -Dloader.path=.,plugins -jar myapplication.jar "$@"
但是,我不知道如何配置IntelliJ来启动应用程序并找到插件,以便能够更轻松地进行调试

我尝试了以下方法

  • -Dloader.path
    配置添加到启动配置中似乎不起作用。我已经尝试了Appliaction和Spring启动配置。这似乎没什么作用。它只加载主应用程序,没有插件
  • 通过gradle添加插件:

    编译文件树(目录:“dist/plugins”,包括:'***.jar')

这会加载插件,但无法加载从错误消息中获取的上下文:
s.c.a.AnnotationConfigApplicationContext:上下文初始化期间遇到异常-取消刷新尝试:org.springframework.beans.factory.unsatifiedDependencyException:创建名为“myServiceImpl”的bean时出错:通过方法“setMyService”参数0表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为“org.myapp.MyService”的符合条件的bean可用:至少需要1个符合autowire候选条件的bean。依赖项批注:{}

因此,我在代码中添加了bean依赖项,以强制bean按照一定的顺序进行初始化:

数据访问模块

interface Myservice {
  ...
}

@Service
@Qualifier("MyServiceBean")
class MyServiceImpl implements MyService {
  ...
}
插件内部的ContextBridge

@Component
@DependsOn("MyService)
public class ContextBridgeImpl implements ContextBridge, ApplicationContextAware {
  ...
}
然后我得到:

上下文初始化期间遇到异常-取消刷新尝试:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有名为“MyService”的bean可用

让我困惑的是,当从控制台启动时,一切都能正常工作。为什么不在IntelliJ里面

编辑 显示发射配置的屏幕截图

IntelliJ可能正在项目目录的目标文件夹中运行项目。您应该尝试将Spring Boot运行调试配置的工作目录更改为启动命令行应用程序的目录。没有目标文件夹。只需要建造。尝试将工作目录设置为build/classes/main。同样的结果:没有安装插件,一切正常。如果周围有插件,则不会出现此异常。从命令行启动时,是否从
build/classes/main
运行此命令?如果没有,配置工作目录应该指向您可以通过命令行成功运行项目的文件夹。我有一个gradle任务,它将所有组装的组件(包括shell脚本)放置在
/dist
文件夹中。这是一个简单的复制任务。然后我从那里运行它。不起作用的是“springboot”类型的启动配置,只要存在插件(找到并加载到注入依赖项的位置)。插件从各种来源导入和处理数据。因此,我可以使用专用的主类调试它们。只是集成到主应用程序中时不需要。创建IntelliJ调试配置将提供用于调试的命令行参数。通过CL启动应用程序时包含这些参数,可以连接IntelliJ调试器。YMMV。