Java Can';当包含外部jar时,不能从IntelliJ中加载上下文
我正在做一个多模块Spring引导项目,可以使用非Spring插件。使用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
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来启动应用程序并找到插件,以便能够更轻松地进行调试
我尝试了以下方法
- 将
配置添加到启动配置中似乎不起作用。我已经尝试了Appliaction和Spring启动配置。这似乎没什么作用。它只加载主应用程序,没有插件-Dloader.path
- 通过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。