【问题标题】:Spring boot - Using the implementations defined in the other projectSpring boot - 使用其他项目中定义的实现
【发布时间】:2019-12-10 12:54:05
【问题描述】:

我有 2 个项目。

  • demo-parent 项目(spring boot 应用程序)中定义的所有 API 合约(接口)
  • demo-child 项目(spring boot 应用程序)中定义的实现
  • demo-parentdemo-child 的依赖,在 demo-child 的 pom.xml 中定义

demo-parent 中:

AccessAPI.java

public interface AccessAPI {
    void call();
}

SpringDemoParentApplication.java

@SpringBootApplication
public class SpringDemoParentApplication {

    @Autowired
    private AccessAPI accessAPI;

    public static void main(String[] args) {
        SpringApplication.run(SpringDemoParentApplication.class, args);
    }

    @PostConstruct
    void exec() {
        accessAPI.call();
    }
}

demo-child 我有服务的实现:

AccessAPIImpl.java

@Service
public class AccessAPIImpl implements AccessAPI {
    @Override
    public void call() {
        System.out.println("Executing from AccessAPIImpl");
    }
}


努力实现的目标: 我必须能够独立构建这些项目,并通过类路径传递 demo-child 项目 jar 以选择实现并在运行 demo-parent 时注入所有实现。 如:

>java -jar demo-parent.jar -cp demo-child.jar

我希望从 demo-child 中获取实现并自动注入,但它没有按预期工作。
注意:我不想在 demo-parent 上添加 demo-child 依赖,必须在运行时获取 implementations/dependency。


请检查 Git 存储库:
https://github.com/anthonyvk/spring-demo-child
https://github.com/anthonyvk/spring-demo-parent

【问题讨论】:

    标签: java spring spring-boot maven dependency-injection


    【解决方案1】:

    TL; TR

    java -cp demo-parent.jar -Dloader.path=demo-child.jar org.springframework.boot.loader.PropertiesLauncher
    

    如果demo-child.jar是Spring Boot应用程序,即该jar是由Spring Boot插件重新打包的,则需要更改loader.path

    java -cp demo-parent.jar -Dloader.path='demo-child.jar!/BOOT-INF/classes' org.springframework.boot.loader.PropertiesLauncher
    

    说明:

    默认情况下,Spring Boot 使用 JarLauncher,它只在 jar 存档内的 BOOT-INF/lib/ 中查找,-cp 参数无效。上面的命令切换到 PropertiesLauncher,它支持 loader.path 参数(-cp 等效项)。详情见The Executable Jar Format

    顺便说一下,项目结构好像有点问题:

    • 将 spring boot 应用程序 (demo-parent.jar) 添加为 demo-child.jar 的依赖项很棘手,因为 demo-parent.jar 由 Spring Boot 插件重新打包,并且 maven 找不到 AccessAPI 类
    • 存在运行时循环依赖,即使在 POM 中没有明确指定

    我不知道具体要求,但如果可能的话,我会建议:

    • 将接口提取到单独的项目中,比如说 demo-api
    • 制作 demo-parent 和 demo-child 依赖于 demo-api,而不是相互依赖
    • 制作 demo-apidemo-child 常规 jar,而不是 Spring Boot 应用程序(删除 Spring Boot 插件)

    【讨论】:

    • 感谢 Mafor 的回复。但解决方案没有奏效。我得到以下异常:线程“main”中的异常 java.lang.IllegalArgumentException: File D:\Workout\Spring\spring-boot-runtime-jar-load-parent\target\'child.jar must exist
    • 它必须与路径有关。 child.jar 之前有 ' 吗?
    • 这是我运行的:java -cp parent.jar -Dloader.path='child.jar!/BOOT-INF/classes' org.springframework.boot.loader.PropertiesLauncher
    • 我用双引号运行,我没有看到 IllegalArgumentException ::> java -cp parent.jar -Dloader.path="child.jar!/BOOT-INF/classes" org.springframework.boot .loader.PropertiesLauncher
    • 好吧,那样不行。您需要将springdemochild 设为springdemoparent 的子包(不一定是直接的),或者将@ComponentScan(“com.savk.workout.spring.springdemochild”) 注释添加到SpringDemoParentApplication。见spring-boot-and-component-scan
    猜你喜欢
    • 2019-08-06
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2021-10-04
    • 2019-04-07
    • 2023-01-31
    • 2017-03-10
    相关资源
    最近更新 更多