当前位置: 首页 > 知识库问答 >
问题:

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

司徒英卓
2023-03-14

我有以下规格的项目A:

  • 罐子
  • Java 7
  • Spring 4.2.0+Spring Security
  • Spring Data JPA,Oracle,H2(W/scope test)

我有以下规格的项目B:

    null

这两个项目都成功地单独构建和运行。我希望项目A是项目B的依赖项。我正在使用IntelliJ,并遵循web上可用的步骤(#1、#2),但以下是我所做的要点:

文件->项目结构

  • 项目->确保项目A的SDK+项目级别设置为Java 8
  • 模块->选择项目A->确保将SDK+项目级别设置为Java 8 for source+dependencies
  • 模块->单击+按钮>导入模块->选择项目A的pom.xml->遵循导入步骤
  • 模块->选择项目B->确保将SDK+项目级别设置为Java 8 for source+dependencies
  • 模块->选择项目A->依赖项->单击+按钮>添加模块依赖项->选择项目A
  • 将项目A作为依赖项添加到项目B的pom.xml中,并将依赖项的版本与项目A的版本(来自pom)匹配
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
@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清洁安装”。我再次运行项目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 Boot2?如果是这样,我错过了什么?如果没有,我有什么选择?

// 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;
    }
}

共有1个答案

施鸿
2023-03-14

当您将projectA作为maven依赖项包含在Project B中时,projectA中的所有类文件都可以在您的类路径上使用。仅此而已。

当您将服务作为autowired依赖项添加时,spring容器(项目B的)期望上下文中有一个实现bean可用。

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

 类似资料:
  • 我是gradle的新手,我现有的大多数项目都在ant(netbeans项目)中。 我必须为我想重用的每个项目创建gradle项目吗? 我可以在gradle项目中直接声明现有的netbean项目为依赖项吗?如果是,如何? 谢谢。

  • 在我开始之前--我看了以下链接,没有一个对我起作用(我的假设是我做错了什么): > https://appmediation.com/how-to-add-local-libraries-to-gradle/ 如何向build.gradle文件添加本地.jar文件依赖项? 在我的Gradle Java项目中使用本地jar作为依赖项 如何向build.gradle.kt文件添加本地.jar文件依赖项

  • 我有一个使用Gradle作为构建工具的项目和第二个使用Maven的POM的子项目。我没有在子项目上更改构建工具的自由。 我想要实现的是将我的项目添加到Maven POM中,作为我的Gradle项目的依赖项。 其中root(当前目录)是我的Gradle项目,并包含,Maven项目位于下,POM文件就在该目录下。 我在我的< code>build.gradle文件中尝试了这些变化: 第一次尝试: 第二

  • 问题内容: 我创建了一个新的Spring Web应用程序,我非常想使用Maven处理构建/依赖关系。我的问题是,该项目依赖于一些现有的本地项目,而目前尚无法对它们进行美化。是否有可能依赖这些项目而不破坏它们? 问题答案: 不,您不应该尝试这样做。Maven的主要目标是拥有标准化的构建。这就是使Maven易于使用的原因:异常不是常态。这就是为什么Maven要求所有依赖项都采用典型的Maven格式(P

  • 我想有一个使用Spring Boot的微服务项目,它通过通过Spring Data JPA项目创建的依赖项访问实体和DAO。这个想法是多个微服务可以获得该依赖项。 然而,当jar在Spring Boot Data JPA项目中组装时,它通过starter依赖项包含了许多依赖项。其中大多数也出现在使用它的Spring Boot Microservice项目中。 您将如何通过Spring Data J

  • 我通过这个链接将一个gradle项目作为依赖项导入另一个gradle项目。有没有办法将maven项目作为依赖项包含到gradle项目中?