将项目A(Spring 4.2.x)添加为项目B(Spring Boot 2,Spring 5)的依赖项

时间:2018-08-14 20:10:51

标签: java spring spring-boot intellij-idea spring-data-jpa

我的Project A具有以下规格:

  • Jar
  • Java 7
  • Spring 4.2.0 + Spring Security
  • Spring Data JPA,Oracle,H2(带范围测试)

我的Project B具有以下规格:

  • 战争
  • Java 8
  • Tomcat 8.5.x
  • Spring Boot 2
  • Spring 5 + Spring Security

两个项目均成功构建并单独运行。我希望项目A是项目B的依赖项。我正在使用IntelliJ,并遵循网络上可用的步骤(#1#2),但这是我所做的要旨:

文件->项目结构

  • 项目->确保将项目A的SDK +项目级别设置为Java 8
  • 模块->选择项目A->确保将源+依赖项的SDK +项目级别设置为Java 8
  • 模块->单击+按钮>导入模块->选择项目A的pom.xml->遵循导入步骤
  • 模块->选择项目B->确保“源+依赖关系”的SDK +项目级别设置为Java 8
  • 模块->选择项目A->依赖性->单击+按钮>添加模块依赖性->选择项目A
  • 将Project A作为依赖项添加到Project B的pom.xml中,并将依赖项的版本与Project A的版本(来自pom)进行匹配

我成功运行了“ mvn clean install”。当我在Tomcat上运行Project B时,我得到:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-08-14 15:01:03.796 ERROR 15888 --- [on(3)-127.0.0.1] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class

我不确定为什么项目A的JPA / DB配置会在项目B中引起问题,即使项目A本身可以正常工作。但是,经过一些研究,我在SpringBoot应用程序中添加了以下注释:

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})

这就是我最终得到的:

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class ProjectB extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(ProjectB.class);
    }

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

}

我成功运行了“ mvn clean install”。我再次运行项目B,它成功启动!当我尝试引用项目A(即服务)中的任何内容时,它都可以正常运行,但是在启动时,我得到以下信息:

SEVERE [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start: 
 org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)

    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)
***************************
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
APPLICATION FAILED TO START
***************************
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)

    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1736)
Description:
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
Parameter 0 of constructor in com.projectB.controller.ControllerName required a bean of type 'com.projecta.service.ServiceName' that could not be found.
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

    at java.lang.reflect.Method.invoke(Method.java:498)

    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
Action:
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

Consider defining a bean of type 'com.projecta.service.ServiceName' in your configuration.

是否甚至可以将Spring模块导入Spring Boot 2?如果是这样,我想念什么?如果没有,我有什么选择?


编辑1:添加简单服务(项目A)+控制器(项目B)

// Controller in Project B
@RestController
@RequestMapping("/api")
public class SimpleController {
    private SimpleService simpleService;

    @Autowired
    public SimpleController(SimpleService simpleService) {
        this.simpleService = simpleService;
    }

    @GetMapping
    public ResponseEntity<?> generateAndSendEmail() {
        boolean success = simpleService.callSimpleService();
        if (success) {
            return new ResponseEntity<>(OK);
        }
        return new ResponseEntity<>(INTERNAL_SERVER_ERROR);
    }
}

// Service in Project A
@Service
public class SimpleService {
    public boolean callSimpleService() {
        return true;
    }
}

2 个答案:

答案 0 :(得分:0)

当将projectA作为maven依赖项包含在Project B中时,projectA中的所有类文件在您的类路径上都可用。没什么。

当您将服务添加为自动绑定的依赖项时,(项目B的)spring容器期望实现Bean在上下文中可用。

spring上下文将无法找到ServiceA的实现,因为它不会扫描projectA的软件包。 projectB中@ComponentScan的默认实现将仅识别在Project B子包中声明的bean。要使Project A中的bean在Project B中可用,您需要在Project B的主类中添加一个显式@ComponentScan,以指示spring进行扫描项目A中的软件包。

建议从项目A的pom文件中删除Spring 4.X依赖项

答案 1 :(得分:0)

您是否尝试过将服务作为Spring Boot应用程序的bean手动创建?在您的主要班级内:

@Bean
public SimpleService simpleService() {
    return new SimpleService();
}